form表单是页面与web服务器交互过程中最重要的信息来源。
表单提交成功控件
浏览器是如何提交表单的?或者说浏览器在提交表单时需要做哪些事情?
浏览器并不是将所有的表单控件全部发送到服务器的,而是会查找所有的【成功控件】,只将这些成功控件的数据发送到服务端。(成功控件:每个表单中的属性都有一个name属性,和当前值,
在提交时它们将以name=value的形式作为提交数据的一部分)
对于一些特殊情况,成功控件还有以下规定:1.控件不能是【禁用】状态,即指定【“disabled=disabled"】,即禁用的控件不是成功的控件。
2.如果一个表单包含了多个提交按键,那么仅当用户点击的那个提交按钮才算是成功的控件。
3.对于checkbox控件来说,只有被用户勾选的才算是成功控件。
4.对于radio button来说,只有被用户勾选的才算是成功控件。
5.对于select来说,所有被选择的选项都作为成功控件,name由select控件提供。
6.对于file上传文件控件来说,如果它包含了选择文件,那么它将是一个成功控件。
此外,浏览器不会考虑Reset按钮以及OBJECT元素。
注意:对于CheckBox和radio button来说,它们被确认为成功控件,但没有控件指定value属性,那么在表单提交时,将会以“on”作为它们的value。
如果在服务端读不到某个表单控件的值,请检查是否满足以上规则。
提交方式::在前面的示例代码中,我为form指定了method="post",这个提交方法就决定了浏览器在提交数据时,通过什么方式来传递它们。
如果是【post】,那么表单数据将放在请求体中被发送出去。
如果是【get】,那么表单数据将会追加到查询字符串中,以查询字符串的形式提交到服务端。
建议:表单通常还是以post方式提交比较好,这样可以不破坏URL,况且URL还有长度限制。
数据的编码:控件输入的内容并不是直接发送的, 而是经过一种编码规则来处理的。目前基本上只会只使用二种编码规则:application/x-www-form-urlencoded 和 multipart/form-data ,
这二个规则的使用场景简单地说就是:后者在上传文件时使用,其它情形则使用前者(默认)。(这个规则是在哪里指定的呢? 其实form还有个enctype属性,用它就可以指定编码规则,当我在VS2008写代码时)
表单是如何处理数据的?可分为四个步骤:
1.识别所有的成功控件
2.为所有的成功控件创建一个数据集合,它们包含 control-name/current-value 这样的值对。
3.按照form.enctype指定的编码规则对前面准备好的数据进行编码。编码规则将放在请求中,用【Content-Type】指出。
4. 提交编码后的数据。此时会区分post,get二种情况,提交的地址由form.action属性指定的。
多提交按钮的表单
一个页面中包含多个服务端按钮
方法一:根据【成功控件】定义,我们设置按钮的name,在服务端用name来区分哪个按钮的提交
方法二:我将二个按钮的name设置为相同的值(根据前面的成功控件规则,只有被点击的按钮才会提交),在服务端判断value
上传文件的表单