细说form表单

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

上传文件的表单

  

猜你喜欢

转载自www.cnblogs.com/jacky912/p/10484497.html