当前位置:文档之家› form表单提交过程

form表单提交过程

form表单提交过程
form表单提交过程

Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源。虽然https://www.doczj.com/doc/0a2687657.html, WebForms框架为了帮助我们简化开发工作,做了很完美的封装,让我们只需要简单地使用服务端控件就可以直接操作那些HTML表单元素了。但我认为了解一些基础的东西,可以使我们不必束缚在WebForms框架上,以及遇到一些奇怪问题时,可以更从容地解决它们。

今天,我将和大家来聊聊表单,这个简单又基础的东西。我将站在HTML和单纯的https://www.doczj.com/doc/0a2687657.html, 框架的角度来解释它们的工作方式,因此,本文不演示WebForms服务器控件的相关内容。

回到顶部简单的表单,简单的处理方式

好了,让我们进入今天的主题,看看下面这个简单的HTML表单。

客户名称:

客户电话:

在这个HTML表单中,我定义了二个文本输入框,一个提交按钮,表单将提交到

Handler1.ashx中处理,且以POST的方式。

注意哦,如果我们想让纯静态页面也能向服务器提交数据,就可以采用这样方式来处理:将action属性指向一个服务器能处理的地址。

说明:当我们使用WebForms的服务器表单控件时,一般都会提交到页面自身来处理(action 属性指向当前页面),这样可以方便地使用按钮事件以及从服务器控件访问从浏览器提交的控件输入结果。

如果在URL重写时,希望能在页面回传时保持URL不变,即:action为重写后的URL,那么可以Page类中执行以下调用:

Form.Action = Request.RawUrl; // 受以下版本支持:3.5 SP1、3.0 SP1、2.0 SP1

好了,我们再回到前面那个HTML表单,看一下如果用户点击了“提交”按钮,浏览器是如何把表单的内容发出的。在此,我们需要Fiddler工具的协助,请在提交表单前启动好Fiddler。我将这个表单的提交请求过程做了如下截图。

上图是将要提交的表单的输入情况,下图是用Fiddler看到的浏览器发出的请求内容。

在这张图片中,我们可以看到浏览器确实将请求发给了我前面在action中指定的地址,且以POST形式发出的。表单的二个控件的输入值放在请求体中,且做了【编码】处理,编码的方式用请求头【Content-Type】说明,这样,当服务端收到请求后,就知道该如何读取请求的内容了。注意:表单的数据是以name1=value1&name2=value2 的形式提交的,其中name,value分别对应了表单控件的相应属性。

我们还可以在Fiddler中,将视图切换到WebForms选项卡,这样能更清楚地只查看浏览器提交的数据,如下图。

看了客户端的页面和请求的内容,我们再来看看在服务端如何获取浏览器提交的表单的输入吧,代码如下:

string name = context.Request.Form["CustomerName"];

string tel = context.Request.Form["CustomerTel"];

代码很简单,直接根据表单控件的name属性访问Request.Form就可以了。

回到顶部表单提交,成功控件

我们再来看一下浏览器是如何提交表单的,或者说,浏览器在提交表单时,要做哪些事情。

浏览器并不是将所有的表单控件全部发送到服务器的,而是会查找所有的【成功控件】,只将这些成功控件的数据发送到服务端,什么是成功控件呢?

简单地来说,成功控件就是:每个表单中的控件都应该有一个name属性和”当前值“,在提交时,它们将以name=value 的形式做为提交数据的一部分。

对于一些特殊情况,成功控件还有以下规定:

1. 控件不能是【禁用】状态,即指定【disabled="disabled"】。即:禁用的控件将不是成功控件。

2. 如果一个表单包含了多个提交按键,那么仅当用户点击的那个提交按钮才算是成功控件。

3. 对于checkbox控件来说,只有被用户勾选的才算是成功控件。

4. 对于radio button来说,只有被用户勾选的才算是成功控件。

5. 对于select控件来说,所有被选择的选项都做为成功控件,name由select控件提供。

6. 对于file上传文件控件来说,如果它包含了选择的文件,那么它将是一个成功控件。

此外,浏览器不会考虑Reset按钮以及OBJECT元素。

注意:

1. 对于checkbox, radio button来说,如果它们被确认为成功控件,但没有为控件指定value 属性,那么在表单提交时,将会以"on"做为它们的value

2. 如果在服务端读不到某个表单控件的值,请检查它是否满足以上规则。

提交方式:在前面的示例代码中,我为form指定了method="post",这个提交方法就决定了浏览器在提交数据时,通过什么方式来传递它们。

如果是【post】,那么表单数据将放在请求体中被发送出去。

如果是【get】,那么表单数据将会追加到查询字符串中,以查询字符串的形式提交到服务端。

建议:表单通常还是以post方式提交比较好,这样可以不破坏URL,况且URL还有长度限制。

数据的编码:前面我将浏览器的请求细节用Fiddler做了个截图,从这个图中我们可以看到:控件输入的内容并不是直接发送的,而是经过一种编码规则来处理的。目前基本上只会只使用二种编码规则:application/x-www-form-urlencoded 和multipart/form-data ,这二个规则的使用场景简单地说就是:后者在上传文件时使用,其它情形则使用前者(默认)。

这个规则是在哪里指定的呢?其实form还有个enctype属性,用它就可以指定编码规则,当我在VS2008写代码时,会有以下提示:

按照我前面说过的编码规则选择逻辑,application/x-www-form-urlencoded做为默认值,所以,一般情况下我们并不用显式指定。除非我们要上传文件了,那么此时必须设置enctype="multipart/form-data"

好了,说了这么一大堆理论,我们再来看一下浏览是如何处理表单数据的。这个过程大致分为4个阶段:

1. 识别所有的成功控件。

2. 为所有的成功控件创建一个数据集合,它们包含control-name/current-value 这样的值对。

3. 按照form.enctype指定的编码规则对前面准备好的数据进行编码。编码规则将放在请求中,用【Content-Type】指出。

4. 提交编码后的数据。此时会区分post,get二种情况,提交的地址由form.action属性指定的。

回到顶部多提交按钮的表单

用过https://www.doczj.com/doc/0a2687657.html, WebForms框架的人可能都写过这样的页面:一个页面中包含多个服务端按钮。处理方式嘛,也很简单:在每个按钮的事件处理器写上相应的代码就完事了,根本不用我们想太多。

不过,对于不理解这背后处理过程的开发人员来说,当他们转到MVC框架下,可能会被卡住:MVC框架中可没有按钮事件!即使用不用MVC框架,用ashx通用处理器的方式,也会遇到这种问题,怎么办?

对于这个问题,本文将站在HTML角度给出二个最根本的解决办法。

方法1:根据【成功控件】定义,我们设置按钮的name,在服务端用name来区分哪个按钮的提交:

HTML代码

客户名称:

客户电话:

服务端处理代码

// 注意:我们只要判断指定的name是否存在就可以了。

if( string.IsNullOrEmpty(context.Request.Form["btnSave"]) == false ) { // 保存的处理逻辑

}

if( string.IsNullOrEmpty(context.Request.Form["btnQuery"]) == false ) { // 查询的处理逻辑

}

方法2:我将二个按钮的name设置为相同的值(根据前面的成功控件规则,只有被点击的按钮才会提交),在服务端判断value,示例代码如下:

客户名称:

客户电话:

string action = context.Request.Form["submit"];

if( action == "保存" ) {

// 保存的处理逻辑

}

if( action == "查询" ) {

// 查询的处理逻辑

}

当然了,解决这个问题的方法很多,我们还可以在提交前修改form.action属性。对于MVC 来说,可能有些人会选择使用Filter的方式来处理。最终选择哪种方法,可根据各自喜好来选择。

我可能更喜欢直接使用Ajax提交到一个具体的URL,这样也很直观,在服务端也就不用这些判断了。接着往下看吧。

回到顶部上传文件的表单

前面我说到“数据的编码"提到了form.enctype,这个属性正是上传表单与普通表单的区别,请看以下示例代码:

enctype="multipart/form-data">

要上传的文件1

要上传的文件2

我将上传2个小文件

我们再来看看当我点击提交按钮时,浏览器发送的请求是个什么样子的:

注意我用红色边框框出来的部分,以及请求体中的内容。此时请求头Content-Type的值发生了改变,而且还多了一个叫boundary的参数,它将告诉服务端:请求体的内容以这个标记来分开。并且,请求体中每个分隔标记会单独占一行,且具体内容为:"--" + boundary,最后结束的分隔符的内容为:"--" + boundary + "--" 也是独占一行。从图片中我们还可以发现,在请求体的每段数据前,还有一块描述信息。

具体这些内容是如何生成的,可以参考本文后面的实现代码。

再来看看在服务端如何读取上传的文件。

HttpPostedFile file1 = context.Request.Files["file1"];

if( file1 != null && string.IsNullOrEmpty(file1.FileName) == false ) file1.SaveAs(context.Server.MapPath("~/App_Data/") +

file1.FileName);

HttpPostedFile file2 = context.Request.Files["file2"];

if( file2 != null && string.IsNullOrEmpty(file2.FileName) == false ) file2.SaveAs(context.Server.MapPath("~/App_Data/") +

file2.FileName);

或者

HttpFileCollection files = context.Request.Files;

foreach( string key in files.AllKeys ) {

HttpPostedFile file = files[key];

if( string.IsNullOrEmpty(file.FileName) == false )

file.SaveAs(context.Server.MapPath("~/App_Data/") +

file.FileName);

}

二种方法都行,前者更能体现控件的name与服务端读取的关系,后者在多文件上传时有更好的扩展性。

安全问题:注意,上面示例代码中,这样的写法是极不安全的。正确的做法应该是:重新生成一个随机的文件名,而且最好能对文件内容检查,例如,如果是图片,可以调用.net的一些图形类打开文件,然后"另存"文件。总之,在安全问题面前只有一个原则:不要相信用户的输入,一定要检查或者转换。

回到顶部MVC Controller中多个自定义类型的传入参数

前面的所有示例代码中都有一个规律:在服务端读取浏览器提交的数据时,都会使用控件的name属性,基本上在https://www.doczj.com/doc/0a2687657.html,中就是这样处理。但是在MVC中,MS为了简化读取表单数据的代码,可以让我们直接在Controller的方法中直接以传入参数的形式指定,此时框架

会自动根据方法的参数名查找对应的输入数据(当然也不止表单数据了)。下面举个简单的例子:

客户名称:

客户电话:

Conntroller中的方法的签名:

public ActionResult Submit(Customer customer)

{

}

public ActionResult Submit(string name, string tel)

{

}

以上二种方法都是可以的,当然了,前者会比较好,但需要事先定义一个Customer类,代码如下:

public class Customer

{

public string Name { get; set; }

public string Tel { get; set; }

}

如果表单简单或者业务逻辑简单,我们或许一直也不会遇到什么麻烦,以上代码能很好的工作。但是,如果哪天我们有了新的业务需要求,需要在这个表单中同时加上一些其它的内容,例如,要把业务员的资料也一起录入进去。其中业务员的实体类定义如下:

public class Salesman

{

public string Name { get; set; }

public string Tel { get; set; }

}

Controller的接口需要修改成:

public ActionResult Submit(Customer customer, Salesman salesman)

{

}

这时,HTML表单又该怎么写呢?刚好,这二个类的(部分)属性名称一样,显然,前面表单中的Name,Tel就无法对应了。此时我们可以将表单写成如下形式:

客户名称:

客户电话:

销售员名称:

销售员电话:

注意Controller方法中的参数名与HTML表单中的name是有关系的。

回到顶部F5刷新问题并不是WebForms的错

刚才说到了MVC框架,再来说说WebForms框架。以前时常听到有些人在抱怨用WebForms的表单有F5的刷新重复提交问题。在此我想为WebForms说句公道话:这个问题并不是WebForms本身的问题,是浏览器的问题,只是如果您一直使用WebForms的较传统用法,是容易产生这个现象的。那么什么叫做【传统用法】呢?这里我就给个我自己的定义吧:所谓的WebForms的传统用法是说:您的页面一直使用服务器控件的提交方式(postback),在事件处理后,页面又进入再一次的重现过程,或者说:当前页面一直在使用POST方式向当前页面提交。

那么如何避开这个问题呢?办法大致有2种:

1. PRG模式(Post-Redirect-Get),在事件处理后,调用重定向的操作Response.Redirect(),而不要在事件处理的后期再去给一些服务器控件绑定数据项了!

建议:按钮事件只做一些提交数据的处理,将数据绑定的操作放在OnPreRender方法中处理,而不是写在每个事件中(遍地开花)。不过,这种方式下,可能伟大的ViewState就发挥不了太大的作用了,如果您发现ViewState没用了,在Web.config中全局关掉后,又发现很多服务器控件的高级事件又不能用了!嗯,杯具有啊。

这个话题说下去又没完没了,到此为止吧,不过,千万不要以为这种方法是在倒退哦。

2. 以Ajax方式提交表单,请继续阅读本文。

回到顶部以Ajax方式提交整个表单

前面一直在说”浏览器提交表单",事实上我们也可以用JavaScript提交表单,好处也有很多,比如前面所说的F5刷新问题。以Ajax方式提交表单的更大好处它是异步的,还可以实现局部刷新,这些特性都是浏览器提交方式没有的。前面我提到表单在提交时,浏览器要实现的4个步骤,基本上用JS来完成这个操作也是一样的。但是,前面说的步骤好像很麻烦呢,

有没有简单的方法来实现这个过程呢?嗯,有的,这里我将使用JQuery以及jquery.form.js 这个插件来演示这个复杂过程的简单处理方案。

示例用的HTML表单还是我前面用的代码,完全不需要修改:

客户名称:

客户电话:

JS代码如下:

$(function(){

$('form').ajaxForm({

success: function(responseText){

alert(responseText);

}

});

});

是的,就是这么简单,只要调用ajaxForm()就行了。你也可以传入任何$.ajax()能接受的参数。

它的作用是:修改表单的提交方式,改成Ajax方式提交。最终当用户点击“提交”按钮时,此时不再是浏览器的提交行为了,而是使用Ajax的方式提交,提交的URL以及提交方法就是在FORM中指定的参数。

如果您希望要用户点击某个按钮或者链接时,也能提交表单(不经过提交按钮),那么可以使用如下方法:

$(function(){

$("#btnId").click(function(){

$('form').ajaxSubmit({

success: function(responseText){

alert(responseText);

}

});

});

});

变化很小,只需要将ajaxForm修改成ajaxSubmit就OK了。与ajaxForm()不同,调用ajaxSubmit()方法将会立即提交表单。

回到顶部以Ajax方式提交部分表单

在前面的示例中,我们看到以Ajax方式提交一个表单是非常容易的,它完全模拟了浏览器的行为。不过,有时我们可能需要只提交表单的一部分,为的是更好的局部更新,那么又该如何做呢?

假如我有以下表单的一部分,我只希望在用户某个按钮时将它提交到服务端:

客户名称:

客户电话:

我们可以这样来提交这部分表单的数据:

$("#btnId").click(function(){

$.ajax({

url: "Handler1.ashx", type: "POST",

data: $('#divCustomerInfo :text').fieldSerialize(),

success: function(responseText){

alert(responseText);

}

});

return false;

});

注意关键的代码行:data: $('#divCustomerInfo :text').fieldSerialize()

注意:此时将由您指定一个【JQuery选择器】来过滤要提交的控件,而不是使用成功控件的筛选逻辑。

或者,您也可以使用下面将要介绍的方法,仍然是使用data: {} 的方式,但需要手工指定数据成员。

回到顶部使用JQuery,就不要再拼URL了!

JQuery越来越流行,以至于在创建MVC项目时,VS IDE会把JQuery也准备好了,可能MS认为开发WEB项目离不开JQuery了。

的确,JQuery非常方便,尤其是在处理DOM时,不仅如此,在处理AJAX请求时,也非常方便。

不过,有件事却让我很纳闷:经常看到有人在使用JQuery实现Ajax时,把一堆参数放在URL中传递,当然了,发送GET请求嘛,这样做不错,但是,让我不解的是:URL是拼接起来的,而且代码又臭又长!

如果是一个简单的参数:"aaa.aspx?id=" + xxId ,这样也就罢了。但是当一堆参数拼接在一起时,可能一下子还看不清楚到底有几个什么样的参数。而且经验丰富一些的开发人员会

发现这样做有时会有乱码问题,可能网上搜过后,知道还有编码的工作要处理,于是又加了一堆编码方法。到此为止,这段代码会让人看起来很累!

如果您平时也是这样做的,那么我今天就告诉您:不要再拼接URL了!$.ajax()的参数不是有个data成员嘛,用它吧。看代码:

$.ajax({

url: "Handler1.ashx", type: "POST",

data: { id: 2, name: "aaa", tel: "~!@#$%^&*()_+-=<>?|", xxxx: "要多少还可以写多少", encoding: "见鬼去吧。?& :)" },

success: function(responseText) {

$("#divResult").html(responseText);

}

});

你说什么,只能使用GET ?哦,那就改一下type 参数吧。

$.ajax({

url: "Handler1.ashx", type: "GET",

data: { id: 2, name: "aaa", tel: "~!@#$%^&*()_+-=<>?|", xxxx: "要多少还可以写多少", encoding: "见鬼去吧。?& :)" },

success: function(responseText) {

$("#divResult").html(responseText);

}

});

看了这个示例,您还会继续拼URL吗?

说明:为了排版简单,我将参数放在一行了,建议实际使用时,不要挤在一行。

回到顶部id, name 有什么关系

通常我们在写HTML代码时,会给控件指定一个id属性,这个属性只供JS和CSS使用,在表单提交时,它不起任何作用。

在上面的示例代码中,可能data {}中的各个value就来源于各个不同的控件,那么为那些控件指定相应的id属性将会方便地找到它们。

但是如果不需要用JS和CSS控制的控件,或许它们只是用来显示一些数据(只读),那么就没有必要指定id属性,当然了,name属性也可以不用给出(避免提交无意义的数据)。

回到顶部使用C#模拟浏览器提交表单

浏览器也是一个普通的应用程序,.net framework也提供一些类也能让我们直接发起HTTP 请求。今天我将再次用C#来模拟浏览器的提交请求,同时也可以加深对HTTP请求的理解。

示例代码分为二段,一段示范了使用application/x-www-form-urlencoded编码方式提交,

另一段则示范了使用multipart/form-data的编码方式。

为了让大家能再次利用这些代码,我已将关键部分写成独立方法,希望当您有这方面的需求时能马上可以用上。代码如下:

1. application/x-www-form-urlencoded

///

/// 向指定的URL地址发起一个POST请求,同时可以上传一些数据项。

///

/// 要请求的URL地址

/// 要上传的数据项

/// 发送,接收的字符编码方式

/// 服务器的返回结果

static string SendHttpRequestPost(string url, Dictionary keyvalues, Encoding encoding)

{

if( string.IsNullOrEmpty(url) )

throw new ArgumentNullException("url");

string postData = null;

// 将数据项转变成 name1=value1&name2=value2 的形式

if( keyvalues != null && keyvalues.Count > 0 ) {

postData = string.Join("&",

(from kvp in keyvalues

let item = kvp.Key + "=" +

HttpUtility.UrlEncode(kvp.Value)

select item

).ToArray()

);

}

if( encoding == null )

encoding = Encoding.UTF8;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

request.Method = "POST";

request.ContentType = "application/x-www-form-urlencoded;

charset=" + encoding.WebName;

if( postData != null ) {

byte[] buffer = encoding.GetBytes(postData);

Stream stream = request.GetRequestStream();

stream.Write(buffer, 0, buffer.Length);

stream.Close();

}

using( WebResponse response = request.GetResponse() ) {

using( StreamReader reader = new

StreamReader(response.GetResponseStream(), encoding) ) {

return reader.ReadToEnd();

}

}

}

// 调用上面方法的示例代码

string Test_SendHttpRequestPost()

{

string url = "http://localhost:1272/FormWebSite1/Handler1.ashx";

Dictionary keyvalues = new Dictionary();

keyvalues.Add("CustomerName", "我是李奇峰,$%@+& ?#^/");

keyvalues.Add("CustomerTel", "1381723505x");

return SendHttpRequestPost(url, keyvalues, null);

}

2. multipart/form-data。注意这部分代码有点复杂,因此我加了很多注释。

///

/// 向指定的URL地址发起一个POST请求,同时可以上传一些数据项以及上传文件。

///

/// 要请求的URL地址

/// 要上传的数据项

/// 要上传的文件列表

/// 发送数据项,接收的字符编码方式

/// 服务器的返回结果

static string SendHttpRequestPost(string url, Dictionary keyvalues,

Dictionary fileList, Encoding encoding)

{

if( fileList == null )

return SendHttpRequestPost(url, keyvalues, encoding);

if( string.IsNullOrEmpty(url) )

throw new ArgumentNullException("url");

if( encoding == null )

encoding = Encoding.UTF8;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; // 要上传文件,一定要是POST方法

// 数据块的分隔标记,用于设置请求头,注意:这个地方最好不要使用汉字。

string boundary = "---------------------------" +

Guid.NewGuid().ToString("N");

// 数据块的分隔标记,用于写入请求体。

// 注意:前面多了一段: "--" ,而且它们将独占一行。

byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

// 设置请求头。指示是一个上传表单,以及各数据块的分隔标记。

request.ContentType = "multipart/form-data; boundary=" + boundary;

// 先得到请求流,准备写入数据。

Stream stream = request.GetRequestStream();

if( keyvalues != null && keyvalues.Count > 0 ) {

// 写入非文件的keyvalues部分

foreach( KeyValuePair kvp in keyvalues ) { // 写入数据块的分隔标记

stream.Write(boundaryBytes, 0, boundaryBytes.Length);

// 写入数据项描述,这里的Value部分可以不用URL编码

string str = string.Format(

"Content-Disposition: form-data;

name=\"{0}\"\r\n\r\n{1}",

kvp.Key, kvp.Value);

byte[] data = encoding.GetBytes(str);

stream.Write(data, 0, data.Length);

}

}

// 写入要上传的文件

foreach( KeyValuePair kvp in fileList ) { // 写入数据块的分隔标记

stream.Write(boundaryBytes, 0, boundaryBytes.Length);

// 写入文件描述,这里设置一个通用的类型描述:

application/octet-stream,具体的描述在注册表里有。

string description = string.Format(

"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +

"Content-Type: application/octet-stream\r\n\r\n", kvp.Key, Path.GetFileName(kvp.Value));

// 注意:这里如果不使用UTF-8,对于汉字会有乱码。

byte[] header = Encoding.UTF8.GetBytes(description);

stream.Write(header, 0, header.Length);

// 写入文件内容

byte[] body = File.ReadAllBytes(kvp.Value);

stream.Write(body, 0, body.Length);

}

// 写入结束标记

boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

stream.Write(boundaryBytes, 0, boundaryBytes.Length);

stream.Close();

// 开始发起请求,并获取服务器返回的结果。

using( WebResponse response = request.GetResponse() ) { using( StreamReader reader = new

StreamReader(response.GetResponseStream(), encoding) ) {

return reader.ReadToEnd();

}

}

}

// 调用上面方法的示例代码

string Test_SendHttpRequestPost2()

{

string url = "http://localhost:1272/FormWebSite1/Handler2.ashx";

Dictionary keyvalues = new Dictionary();

keyvalues.Add("Key1", "本示例代码由 Fish Li 提供");

keyvalues.Add("Key2", "https://www.doczj.com/doc/0a2687657.html,/fish-li");

keyvalues.Add("Key3", "来几个特殊字符:

~!@#$%^&*()-=_+{}[]:;'\"<>?/.,|\\");

Dictionary fileList = new Dictionary();

fileList.Add("file1", @"H:\AllTempFiles\ascx中文字.gif");

fileList.Add("file2", @"H:\AllTempFiles\asax中文字.gif");

return SendHttpRequestPost(url, keyvalues, fileList,

Encoding.UTF8);

}

说明:上面的示例方法中,我并没有对KEY编码,是因为:我想大家选用的KEY应该是不需要编码的(英文字母与数字的组合)。

表单_基础知识

表单 表单form是Internet和服务器之间进行信息交流的一种重要工具。包括按钮、文本框、单选按钮、复选按钮等,它们被称之为表单对象。表单的使用包括两部分:一是用户界面,提供用户输入数据的元件;另一部分是处理程序,可以是客户端程序而在浏览器执行,也可以是服务器程序,处理用户提交的数据,返回结果。 一.可插入的表单对象 Dreamweaver中,在“插入”面板中,有一个“表单”分类,选择该分类,可插入的表单对象快捷按钮就会出现。如下图: 可插入的对象,从左至右,包括: ?表单 ?文本字段 ?隐藏域 ?文本区域 ?复选框 ?单选按钮 ?单选按钮组 ?列表/菜单 ?跳转菜单 ?图像域 ?文件域 ?按钮 1.插入表单域 要在网页中插入表单对象,首先应该插入一个表单域,否则服务器将无法处理用户填写的信息。操作步骤如下: 步骤1:“插入”面板中,选择“表单”分类,单击左边第1个“表单”按钮,随即插入到网页中一个表单域,表单域在设计视图中显示为一个红色虚线框的范围。如图所示: 如果没有红色虚线框,执行菜单栏“查看/可视化助理/不可见元素”命令即可。 步骤2:设置表单域属性。使用鼠标单击虚线的边框,此时虚线框内出现黑色区域,表示该表单域被选中,属性面板如下: 表单域属性面板包括:

?表单名称:标识表单的唯一名称。 ?动作:指定处理该表单的动态页或脚本的路径。可以键入完整的路径,也可以单击“浏览文件”按钮指定到同一站点中包含该脚本或应用程序页的相应文件夹。如果没有相关程序支持的话,也可以使用E-mail的方式来传输表单信息,这种方式在动作文本框中键入:“mailto:电子邮件地址”。表示提交的信息将会发送到作者的邮箱中。比如 ?方法:用于选择表单数据传输到服务器的方法。可选择速度快但携带数据量小的GET方法,或者数据量大的POST方法。一般使用POST方法。 ?目标:指定打开窗口的方式。 ?MIME类型:指定对提交给服务器进行处理的数据使用MIME编码类型。 ?类:定义好的CSS样式。 2.插入文本域 当浏览者浏览网页需要输入文字资料时,像姓名、地址、E-mail或稍长一些的个人介绍等栏目,在制作时就可以使用文本域,它在浏览器中将显示为一个文本框。 具体操作如下: 步骤1:插入文本域前请确定首先插入了一个表单域,并且将光标放入表单域中。如果在表单域外插入文本域,Dreamweaver会弹出提示框,是否创建一个表单域。 步骤2:在“插入”面板中,选择“表单”分类,单击左边第2个“文本字段”按钮,随即插入到网页中一个文本域。可以在文本域前加入说明的文字,如“用户名”,告知浏览者需要填入的内容的类型。 步骤3:单击文本域,对文本域的属性面板进行设置: 文本域:输入文本字段的名称,该名称在该网页中是唯一的名称。名称不能包含空格或 特殊字符,可以使用字母数字字符和下划线的任意组合。 字符宽度:设置文本域中最多可显示的字符数。 最多字符数:设置单行文本域中所能输入的最多字符数。如果是空白,则可以输入任意 数量的文本。(最好对不同内容的文本域进行不同数量的限制,防止个别浏览者恶意输入大量数据,维护系统的稳定性。) 初始值:输入文本域中默认状态时显示的内容,当浏览者键入资料时初始文本被替代。 类型:显示了当前文本域的类型,包括“单行”、“多行”和“密码”。其中, ---单行是默认选项,只显示一行文本。 ---多行表示插入的文本可显示多行(如图)。

PHP JQUERY AJAX 提交表单FORM详解

PHP jQuery Ajax Form表单提交实例解析,包括创建一个表单html页面、添加JQuery代码、jquery ajax表单提交、jquery ajax表单验证、反馈信息给用户,php ajax 表单验证,php ajax提交表单,php ajax form验证,php ajax提交form。 本实例用到JQuery类库本身的函数和功能,所有表单信息利用PHPMailer类库邮件的形式发送。 1、创建一个表单html页面 表单部分html代码 这里用一个id为contact_form来包含整个包含信息;这是有意义的,稍后在JavaScript与用户交互信息的时候会用到,这里form标签的属性里面既包含了method和action;这个意义其实不大,因为Javascript直接操作DOM,所以没有这两个属性也是可以的;务必要给用户输入的input标签加独立的id,这和第二点原理类似。否则,无法看到正常的效果。 2、添加JQuery代码 这里假设你已经从JQuery官方网站上下载了JQuery基库,然后上传到了你的WEB服务器,并添加到你要使用的网页中。

现在新建一个JS文件 第1行的function()函数与Jquery的document.ready函数用法和功能相同,都是在DOM准备完毕后自动触发。第2行里面是一个单击触发函数click(),需要注意的是,在HTML一页提交按钮上需要放置一个名为“button”的Class,以模拟实现submit 提交表单的功能,从第二点我们可以看出,JQuery可以很好的将结构和逻辑分离。 3、jquery ajax表单验证 在实际应用中,这一步是必不可少的。在用户漏填,错填某个项目时,及时提示。

表单作业

实验3.8 表单的应用 【相关知识】 1. 表单是用于申请或提交某些信息而填写的交互网页,属于网页动态元素。它是网站 管理者与浏览者之间沟通的桥梁。 2. 表单域是具有相互联系的、能够完成一定功能的表单对象的集合。一个网页中可有 多个表单域。 3. 表单对象指表单域中专门处理用户输入数据的元素。表单对象一般都添加在表单域 中。网页中的表单对象包括文本域、单选按钮、复选框、下拉列表、按钮等。 4. 表单不能嵌套,但是一个网页中可以有多个表单。 5. 提交表单的方法有两种:POST和GET。POST方法将在HTTP请求中嵌入表单数据, 通常用来传送大量数据。GET方法将表单数据附加在请求页面的URL地址后面,通常用来传送少量数据。 一、实验目的和要求 掌握使用表单设计新用户注册页面的方法。页面的设计效果如图3-8所示。 图3-8 “新用户注册”页面的效果图

二、实验步骤 1. 新建一个网页文档 启动Dreamweaver。单击【文件】→【新建】菜单命令,新建一个网页文档。 2. 插入表单域 (1)将光标放在网页上要插入表单域的位置。 (2)单击【插入】→【表单】→【表单】菜单命令,或者打开【表单插入栏】,单击上面的【表单】按钮。在网页中插入表单域。 3. 插入表格 (1)将光标放在表单域中,单击【文件】→【表格】菜单命令,打开【表格】对话框。 (2)在对话框中,设置【行数】为“13”;设置【列数】为“2”;设置【表格宽度】为“600像素”;单击【确定】按钮。插入一个13行2列的表格。 (3)选中该表格。在属性面板的【对齐】下拉列表中选择“居中对齐”。 4. 添加表单对象 (1)将光标放在第1行第1列的单元格中。单击【插入】→【表单】→【文本域】菜单命令,或者单击【表单插入栏】上面的【文本字段】按钮,插入一个文本域。在【输入标签辅助功能属性】对话框的【标签文字】文本框中输入“会员号”。选中该文本域,在属性面板中,设置【字符宽度】为“20”;设置【最多字符数】为“20”;在【类型】处选择“单行”。将光标放在第1行第2列的单元格中,输入文字“(必填)”。 (2)将光标放在第2行第1列的单元格中。单击【插入】→【表单】→【文本域】菜单命令,或者单击【表单插入栏】上面的【文本字段】按钮,插入一个文本域。在【输入标签辅助功能属性】对话框的【标签文字】文本框中输入“密码”。选中该文本域,在属性面板的【类型】处选择“密码”;设置【字符宽度】为“10”;设置【最多字符数】为“10”。将光标放在第2行第2列的单元格中,输入文字“(必填)”。 (3)将光标放在第3行第1列的单元格中。输入文字“性别”。单击【插入】→【表单】→【单选按钮】菜单命令,或者单击【表单插入栏】上面的【单选按钮】按钮,插入一个单选按钮。在【输入标签辅助功能属性】对话框的【标签文字】文本框中输入“男”。 用同样的方法插入另一个单选按钮。在【输入标签辅助功能属性】对话框的【标签文字】文本框中输入“女”。 (4)将光标放在第4行第1列的单元格中。单击【插入】→【表单】→【列表/菜单】菜单命令,或者单击【表单插入栏】上面的【列表/菜单】按钮,插入一个列表/菜单。 在【输入标签辅助功能属性】对话框的【标签文字】文本框中输入“常住地点”。选中该列表/菜单对象,在属性面板的【类型】处选择“列表”;设置【高度】为“2”;选中【允许多选】复选项。单击【列表值】按钮,打开【列表值】对话框。单击按钮,输入如表3-3所示的“常住地点”列表值数据。 表3-3 “常住地点”列表值数据 项目标签值 北京 1 上海 2 天津 3 广东 4

第八章 表单

第八章表单 表单是网页中提供的一种交互式操作手段,在网页中的使用十分广泛。无论是提交搜索的信息,还是网上注册等都需要使用表单。用户可以通过提交表单信息与服务器进行动态交流。表单主要可以分为两部分:一是用HTML源代码描述的表单,可以直接通过插入的方式添加到网页中;二是提交后的表单处理,需要调用服务器端编写好的脚本对客户端提交的信息作出回应。 1 表单的概念 表单通常用来做调查表、注册登录界面、搜索界面等。通过表单收集到的用户反馈信息,通常是以某种分隔符分隔的文字形式提交到服务器。 表单使用的

标记是成对出现的,在首标记和尾标记
之间的部分就是一个表单。 表单form基本语法:
….
?name:给定表单名称,表单命名之后就可以用脚本语言(如JavaScript 或VBScript)对它进行控制。 ?action:指定处理表单信息的服务器端应用程序。 ?method:用于指定表单向服务器提交数据的方法,method的值可以为get或是post,默认方式是get。 (1)get方法,使用get方法提交数据,浏览器将把表单中的各个值添加 到action指定的URL后(这两者之间用问号进行分隔)并向服务器发 送get请求,每个值之间用符号“&”链接。 (2)post方法,如果采用post方法,浏览器将首先与action属性中指定 的表单处理程序建立联系,一旦建立连接之后,浏览器就会按分段 传输的方法将数据发送给服务器。 (3)get将表单中的数据按照“变量=值”的形式,添加到action所指向 的URL后面,并且两者使用“?”连接,而各个变量之间使用“&” 连接;post是将表单中的数据放在表单的数据体中,按照变量和值相 对应的方式,传递到action所指向的URL。 (4)get是不安全的,post的所有操作对用户来说都是不可见的。 (5)post可以传输大量的数据,所以在上传文件时只能使用post。 (6)get是表单的默认方法。 2 输入 是个单标记,它必须嵌套在表单标记中使用,用于定义一个用户的输入项。 格式:

第一节 HTML表单提交数据和JSP获得数据

第一节 HTML表单提交数据和JSP获得数据 为了学习掌握JSP动态网页的设计开发,我们先从大家比较熟悉的表单入手。以前在学习静态网页设计时,做好的表单无法提交数据,那是因为没有接收数据的程序。本节使用一组范例,由HTML的表单提交数据,并使用JSP动态网页获得数据,来说明他们之间的关系和工作原理。 一、范例的演示和代码清单 演示的前提: 1.配置好开发运行环境; 2.将随书光盘中的范例ch2,复制到resin2.1.6\doc文件夹内; 3.启动JSP引擎; 演示步骤: 1.启动IE,在地址栏键入http://127.0.0.1:8080/ch2/ch2-1.htm,如图2-1所示: 图2-1 2.在表单的姓名栏键入“张三”,年龄栏键入“21”,性别选择其中的一项,密码栏 键入“123”,然后点击“提交”按钮。屏幕出现2-2所示界面:

图2-2 注意:访问动态网页必须在启动JSP引擎后,在IE的地址栏键入IP地址和路径文件名,才能进行访问,不能使用直接双击打开的方式。 网页的页面上显示了所提交数据的全部内容。请注意,地址栏上的内容是:http://127.0.0.1:8080/ch2/ch2-1.jsp。这说明提交的数据已被ch2-1.jsp动态网页接收,并将其送到屏幕上进行显示。 当然,可以在表单中填写其他的内容,屏幕显示的内容会随之变化。但是如果在“年龄”项目中填写的不是数字,而是字母、汉字等不正确的内容,屏幕上也会将这些错误内容显示出来,甚至任何一项都不填写,直接点击“提交”按钮,动态网页仍能正常运行。这些问题,我们会在以后的章节中去一一解决。目前先要弄清HTML静态网页和JSP动态网页之间的关系。 两个网页的代码如下: 范例ch2-1.htm 1) 2) 3) 4)表单 5) 6) 7) 8)

使用表单提交数据

9)
10)  11)姓名: 12) 13)

HTML FORM表单,input标签的说明

HTML 表单(Form)是 HTML 的一个重要部分,主要用于采集和提交用户输入的信息。
一个简单的 HTML 表单,包含两个文本输入框和一个提交按钮:
First name: Last name:




HTML 表单(Form)常用控件(Controls)
HTML 表单(Form)常用控件有:
? ? ? ? ? ? ?
input type="text" 单行文本输入框 input type="submit" 将表单(Form)里的信息提交给表单里 action 所指向的文件 input type="checkbox" 复选框 input type="radio" 单选框 select 下拉框 textArea 多行文本输入框 input type="password" 密码输入框(输入的文字用*表示)
表单控件(Form Control):单行文本输入框(input type="text")
单行文本输入框允许用户输入一些简短的单行信息,比如用户姓名。例句如下:
表单控件(Form Control):复选框(input type="checkbox")
复选框允许用户在一组选项里,选择多个。示例代码: 苹果
桔子
芒果
用 checked 表示缺省已选的选项。 桔子

表单控件(Form Control):单选框(input type="radio")
使用单选框,让用户在一组选项里只能选择一个。示例代码: 苹果
桔子
芒果
用 checked 表示缺省已选的选项。

表单multipart(form-data)

Java中,当表单含有文件上传时,提交数据的如何读取 当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。(说实话,我经常因为忘记这个问题而浪费好多调查时间。) 1.// 判断enctype属性是否为multipart/form-data 2.boolean isMultipart = ServletFileUpload.isMultipartContent(request); 3. 4.// Create a factory for disk-based file items 5.DiskFileItemFactory factory = new DiskFileItemFactory();

7.// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现 上传文件的保存 8.// 此方法是设置是否使用临时文件的临界值(单位:字节) 9.factory.setSizeThreshold(yourMaxMemorySize); 10. 11.// 与上一个结合使用,设置临时文件的路径(绝对路径) 12.factory.setRepository(yourTempDirectory); 13. 14.// Create a new file upload handler 15.ServletFileUpload upload = new ServletFileUpload(factory); 16. 17.// 设置上传内容的大小限制(单位:字节) 18.upload.setSizeMax(yourMaxRequestSize); 19. 20.// Parse the request 21.List items = upload.parseRequest(request); 22. 23.Iterator iter = items.iterator(); 24.while (iter.hasNext()) { 25.FileItem item = (FileItem) iter.next(); 26. 27.if (item.isFormField()) { 28.//如果是普通表单字段 29.String name = item.getFieldName(); 30.String value = item.getString(); 31.... 32.} else { 33.//如果是文件字段 34.String fieldName = item.getFieldName(); 35.String fileName = item.getName(); 36.String contentType = item.getContentType(); 37.boolean isInMemory = item.isInMemory(); 38.long sizeInBytes = item.getSize(); 39....

jsp表单提交到后台

jsp表单处理 [html]view plain copy 1.

2.
3. 4. 5. 6. 7. 8.
人员信息录入
9. 10. 11. 16. 17. 18.
12. 13. 14. 15.

19.

20.人员信息 21. 22. 23. 24. 27. 28. 31. 32. 33. 36. 37.
用户名: 25. 26.*
登陆密码:
29. 30.*
性别: 34. 男 35.
出生日期:

禁止表单多次提交

禁止表单多次提交 <!--此特效来源来互联网,由https://www.doczj.com/doc/0a2687657.html, 收集整理--> <!--禁止表单多次提交--> <h4>禁止表单多次提交,表单提交一次后提交键变灰色</h4> <script> function submitonce(theform){ //if IE 4+ or NS 6+ if (document.all||document.getElementById){ //screen thru every element in the form, and hunt down "submit" and "reset" for (i=0;i<theform.length;i++){ var tempobj=theform.elements[i] if(tempobj.type.toLowerCase()=="submit"||tempobj.type.to LowerCase()=="reset") //disable em tempobj.disabled=true } } } </script>

<form method="POST" onSubmit="submitonce(this)"> <input type=input name="asdf"> <input type=submit name="OK"> </form>     1. 利用javascript : 1.1 document.form1.submit();后加 document.body.innerHtml = "<center> Waiting...</center>"; //当然这里的html代码就由你发挥了,还可把这段写成函数,这样维护就方便了!这一处理,就让用户在等待提交时不会误以为没提交而重复按提交按钮! 1.2 按钮设置 <SCRIPT LANGUAGE="JavaScript"> function changesubmit() { document.aa.B1.disabled = "true"; } </script> …… <form method="POST" action="aa.jsp" name="aa"

form表单提交数据编码方式和tomcat接受数据解码方式的思考

做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了!这篇文章是我长时间和乱码做斗争的一些理解的积累,还希望有更多的朋友给出指点和补充。 form有2中方法把数据提交给服务器,get和post,分别说下吧。 (一)get提交 1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。 对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc (很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http://localhost:8080/servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode 的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下https://www.doczj.com/doc/0a2687657.html,.URLEncoder类的介绍在这里。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII 的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。 2。服务器端(tomcat)是如何将数据获取到进行解码的。 第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是 request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释:Overrides the name of

HTML表单

HTML表单 一、表单 1.表单的作用 HTML 表单用于接收不同类型的用户输入,用户提交表单时向服务器传输数据,从而实现用户与Web服务器的交互。 2.表单的工作机制 3.表单定义(标签) HTML表单是一个包含表单元素的区域,表单使用

标签创建。表单能够包含input元素,比如文本字段、复选框、单选框、提交按钮等等。表单还可以包含 menus、textarea、fieldset、legend 和 label 元素。注意,元素是块级元素,其前后会产生折行。 1 2 3
3.表单属性 action:规定当提交表单时,向何处发送表单数据。action取值为:第一,一个URL(绝对URL/相对URL),一般指向服务器端一个程序,程序接收到表单提交过来的数据(即表单元素值)作相应处理。比如

action="https://www.doczj.com/doc/0a2687657.html,/login.do">,当用户提交这个表单时,服务器将执行网址"https://www.doczj.com/doc/0a2687657.html,/"上的名为"login.do"的一般处理程序。第二,使用mailto协议的URL地址,这样会将表单内容以电子邮件的形式发送出去。这种情况比较少见的,因为它要求访问者的计算机上安装和正确设置好了邮件发送程序。第三,空值,如果action为空或不写,表示提交给当前页面。 method:该属性定义浏览器将表单中的数据提交给服务器处理程序的方式。关于method的取值,最常用的是get和post。第一,使用get方式提交表单数据,Web浏览器会将各表单字段元素及其数据按照URL参数格式附在

标签的action属性所指定的URL地址后面发送给Web服务器;由于URL的长度限制,使用get方式传送的数据量一般限制在1KB以下。第二,使用post方式,浏览器会将表单数据作为HTTP请求体的一部分发送给服务器。一般来说,使用post方式传送的数据量要比get方式传递的数据量大;根据HTML标准,如果处理表单的服务器程序不会改变服务器上存储的数据,则应采用get方式(比如查询),如果表单处理的结果会引起服务器上存储的数据的变化,则应该采用post方式(比如增删改操作)。第三,其它方式(Head、PUT、DELETE、TRACE 或OPTIONS等)。其实,最初HTTP标准对各种操作都规定了相应的method,但后来很多都没有被遵守,大部分情况只是使用get或post就OK。 target:该属性规定在何处显示action属性中指定的URL所返回的结果。取值有_blank(在新窗口中打开)、_self(在相同的框架中打开,默认值)、_parent(在父框架中打开)、_top(在整个窗口中打开)和framename(在指定的框架中打开)。 title:设置网站访问者的鼠标放在表单上的任意位置停留时,浏览器用小浮标显示的文本。 enctype:规定在发送到服务器之前应该如何对表单数据进行编码。取值:默认值为 "application/x-www-form-urlencoded",在发送到服务器之前,所有字符都会进行编码(空格转换为"+" 加号,特殊符号转换为ASCII HEX 值);“multipart/form-data”:不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。 name:表单的名称。注意和id属性的区别:name属性是和服务器通信时使用的名称;而id属性是浏览器端使用的名称,该属性主要是为了方便客户端编程,而在css和javascript中使用的。 二、表单元素 1.单行文本框(input 的type 属性的默认值就是"text") 以下是单行文本框的主要属性: size:指定文本框的宽度,以字符个数为单位;在大多数浏览器中,文本框的缺省宽度是20个字符。 value:指定文本框的默认值,是在浏览器第一次显示表单或者用户单击按钮之后在文本框中显示的值。 maxlength:指定用户输入的最大字符长度。 readonly:只读属性,当设置readonly属性后,文本框可以获得焦点,但用户不能改变文本框中的value。 disabled:禁用,当文本框被禁用时,不能获得焦点,当然,用户也不能改变文本框的值。并且在提交表单时,浏览器不会将该文本框的值发送给服务器。 2.密码框 3.单选按钮

VF 表单程序题(含答案)

1、利用文本框和标签控件设计了一表单F1.SCX,文本框Text1的V alid事件代码及表单界面如图1所示。向Text1中输入一段字符:”Figure 1-18 shows you how to use a MENU.”(不含双引号)[Text1.Valid event] x=alltrim(thisform.text1.value) y=len(x) store 0 to z1,z2 for i=1 to y a=substr(x,i,1) do case case asc(a)>=65 and asc(a)<=90 z1=z1+1 case asc(a)>=97 and asc(a)<=122 z2=z2+1 endcase endfor thisform.text2.value=z1 thisform.text3.value=z2 (1)执行该程序后,“统计1”右边的文本框Text2和“统计2”右边的文本框Text3中的数据值分别为5、22 (2)Text2和Text3的初值分别为0、0 2、有数据表“图书.DBF”包含书号、书名、出版社、作者等字 段,设计如图1所示表单,表单运行后,单击命令按钮可以在 表格控件中显示图书表的部分字段的数据,如图1所示,请选 择并完善代码。 命令按钮的CLICK事件代码: USE 图书 copy TO TS FIELDS 书号,书名 THISFORM.GRID1.RECORDSOURCETYPE=0 THISFORM.GRID1.RECORDSOURCE=”TS” 表单的UNLOAD(释放对象时发生)事件: CLOSE ALL DROP TABLE TS 3、考生数据表(文件名为:KS.DBF)中有“准考证号/C/9”、 “密码/C/6”、“成绩/N/5/1”等字段。设计如图2所示表单, 将考生数据表添加到表单的数据环境中,表单运行后,在表单 的文本框TEXT1中输入查询考生的准考证号,文本框TEXT2 中输入该考生的查询密码后,单击“查询”按钮,查询该考生 的成绩,并将该考生的成绩显示在表单的标签LABEL3中(考 号或密码输入错误,则弹出提示窗口显示“准考证号或密码错 误!”)。请选择并完善代码。 “查询”按钮的CLICK事件代码如下: SELECT KS

用js创建form表单并提交

<%@page contentType="text/html;charset=UTF-8"%> <%@include file="/WEB-INF/include.inc.jsp"%>

风俗习惯

使用AJAX提交Form表单

使用AJAX提交Form表单的方法,其中主要的就是ajaxForm()和ajaxSubmit(),ajaxForm和ajaxSubmit都支持众多的选项参数,这些选项参数可以使用一个Options对象来提供。Options只是一个JavaScript对象,它包含了如下一些属性与值的集合: Options对象的详解: 1.)target 指明页面中由服务器响应进行更新的元素。元素的值可能被指定为一个jQuery 选择器字符串,一个jQuery对象,或者一个DOM元素。 默认值:null。 2.)url 重写或者指定表单的'action'属性。 默认值:表单的action属性值 3.)type 重写或者指定表单的'method' 属性,"GET"或"POST"。 默认值:表单的method属性值(如果没有找到默认为“GET”)。 4.)beforeSubmit 表单提交前被调用的回调函数,该方法通常被提供来运行预提交逻辑或者校验表单数据。如果"beforeSubmit"回调函数返回false,那么表单将不被提交。"beforeSubmit"回调函数带三个调用参数:数组形式的表单数据,jQuery表单对象,以及传入ajaxForm/ajaxSubmit中的Options对象。表单数组接受以下方式的数据: [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] 默认值:null 5.)success 表单成功提交后调用的回调函数。如果提供"success"回调函数,当从服务器返回响应后它被调用。然后由dataType选项值决定传回responseText还是responseXML的值。 默认值:null 6.)dataType 期望服务器的的回应的类型。null、"xml"、"script"或者"json"其中之一。dataType提供一种方法,它规定了怎样处理服务器的响应。这个被直接地反映到jQuery.httpData方法中去。下面的值被支持: 'xml':如果dataType == 'xml',将把服务器响应作为XML来对待。同时,如果“success”回调方法被指定,将传回responseXML值 'json':如果dataType == 'json',服务器响应将被求值,并传递到“success”回调方法,如果它被指定的话。 'script':如果dataType == 'script',服务器响应将求值成纯文本。 默认值:null(服务器返回responseText值) 7.)semantic 布尔标志,表示数据是否必须严格按照语义顺序来进行提交。注意:一般来说,表单已经按照语义顺序来进行了串行化(或序列化),除了type="image"的input 元素。如果你的服务器有严格的语义要求,以及表单中包含有一个type="image"的input元素,就应该将semantic设置为true。

表单验证提交

ThinkPHP示例之:表单提交验证 本示例是表单提交验证处理,提交的时候增加了验证码?防止机器人添加数据。 验 证 码: 刷新验证码

法机关的 哈哈哈[6930@https://www.doczj.com/doc/0a2687657.html, 2011-01-07 13:46:37] 惹人是否四大发生的个而归去大哥司法官阿文哥如果吧;lkkk凭空平【上课;浦东司法机关的 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:24] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:32] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:34] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:36] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:37] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:37] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:37] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:38] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:38] 43 233 [chlyyy216@https://www.doczj.com/doc/0a2687657.html,2011-04-29 17:18:42] 43

$this->display(); } // 检查标题是否可用 public function checkTitle() { if(!empty($_POST['title'])) { $Form = D("Form"); if($Form->getByTitle($_POST['title'])) { $this->error('标题已经存在'); }else{ $this->success('标题可以使用!'); } }else{ $this->error('标题必须'); } } // 处理表单数据 public function insert() { $Form = D("Form"); //验证码验证 if($_SESSION['verify'] != md5($_POST['verify'])) { $this->error('验证码错误!'); } if($vo = $Form->create()) { if($Form->add()){ $vo['create_time'] = date('Y-m-d H:i:s',$ vo['create_time']); $vo['content'] = nl2br($vo['content']); $this->ajaxReturn($vo,'表单数据保存成功!',1); }else{

文本预览
相关文档 最新文档