• 技术文章 >web前端 >html教程

    Form.action传值问题

    2016-08-31 08:41:45原创849
    通过浏览器地址栏输入url并通过?传递参数请求资源时,?后面的参数叫做 "查询字符串",会触发后台Servlet的doGet(),因为通过浏览器地址栏直接访问的方式是GET方式。


    下面顺便了解一下form的method属性对传参的影响。

    原始表单:







    第一种情况:
    上面表单的action属性不写时,直接点击“提交”按钮,会触发表单的提交事件,此时,通过火狐浏览器的控制台可以发现:
    消息头中有如下关键信息:(1)请求地址后面通过'?'传递参数(2)请求方式为GET




    参数信息: 查询字符串




    指定form的method属性时:







    第二种情况:
    消息头中有如下关键信息:(1)请求地址后面没有传递任何参数(2)请求方式为POST



    参数信息: 表单数据




    上面两种方式的相应都是刷新后显示当前页面,因为form没有指定action属性,默认提交的地址就是当前页面。

    现在通过指定action属性访问Servlet来进一步了解method属性。

    TestServlet.java核心源码:

    @WebServlet("/servlet/TestServlet")
    public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().print("doGet()");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().print("doPost()");
    }

    }


    第三种情况:method="get" action="/test/servlet/TestServlet"







    上面的消息头,参数和第一种情况是一样的,不过后台响应了一个doGet().





    第四种情况: method="post" action="/test/servlet/TestServlet"







    上面的消息头,参数和第一种情况是一样的,不过后台响应了一个doPost().





    TestServlet.java 添加获取参数代码:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String param = request.getParameter("type");
    response.getWriter().print("doGet() get type="+param);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String param = request.getParameter("type");
    response.getWriter().print("doPost() get type="+param);
    }


    第五种情况,method="get" 在action后面传参action = "/servlet/TestServlet?type=01",同时在后台Servlet中获取参数

    此时浏览器地址栏:http://localhost:8080/test/servlet/TestServlet?username=



    可以发现,后台的doGet()是获取不到参数type的.
    同时发现,type参数是没有加入到“查询字符串”的






    第六种情况,method="post" 在action后面传参action = "/servlet/TestServlet?type=01",同时在后台Servlet中获取参数




    可以发现,后台的doPost()是可以获取参数type的。

    同时,参数一栏和以前有些不同:既有“查询字符串”又有“表单数据”





    所以上面给我们一种启示,就是通过?在form的action后面传递参数时,我们需要手动指定form的method="post",不然是获取不到?后面的参数的;
    思维误区:之前我们在浏览器地址栏通过url传递参数,也是通过?来实现的,它最终也是调用doGet()方式,所以我们就认为在的表单(默认method="get")中action后面可以通过?来传参。


    最终原因:(个人总结)get方式提交表单数据时,会重组url,它只会将form的表单数据组装成“查询字符串”,提交到form的action中指定的url,所以原来通过?方式传递的参数是不会提交的,因为url重组了就丢失了。

    但是post方式提交表单时,它会将表单数据和?后面的参数,分开保存,一起提交给form中action指定的url。

    (参考资源)HTML Form: why action can't have get value in it?
    http://stackoverflow.com/questions/3548795/html-form-why-action-cant-have-get-value-in-it




    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Form.action传值问题
    上一篇:Sass的使用和基础语法 下一篇:css3渐变(Gradients)
    千万级数据并发解决方案

    相关文章推荐

    • Axure做注册模块的一些小操作_html/css_WEB-ITnose• Codeforces Round #262 (Div. 2)-A,B,C,D_html/css_WEB-ITnose• HTML中meta标签作用及属性总结 - Jesse131• 有关CSS的一些事_html/css_WEB-ITnose• html +CSS+div学习――第二课_html/css_WEB-ITnose
    1/1

    PHP中文网