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

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

原始表单:
<form id="myForm">
<label>用户名:</label>
<input name="username" type="text">
<input type="submit" value="提交">
</form>

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

参数信息: 查询字符串

指定form的method属性时:
<form id="myForm" method="post">
<label>用户名:</label>
<input name="username" type="text">
<input type="submit" value="提交">
</form>

第二种情况:
消息头中有如下关键信息:(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"

<form id="myForm" method="get" action="/test/servlet/TestServlet">
<label>用户名:</label>
<input name="username" type="text">
<input type="submit" value="提交">
</form>

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

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

<form id="myForm" method="post" action="/test/servlet/TestServlet">
<label>用户名:</label>
<input name="username" type="text">
<input type="submit" value="提交">
</form>

上面的消息头,参数和第一种情况是一样的,不过后台响应了一个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

Form.action传值问题的更多相关文章

  1. <转> jsp页面向action传值的方法(最后一种简单)

    多的不说,直接上代码; struts.xml代码: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  2. 表单form action的url写法

    在写web页面时,标签 是很常见的元素,它的一个属性是action,用来标识将表单交给谁去处理.很显然,这里有一个地址的问题,而且是在服务器这边的地址.比如服务器内的一个servlet.   那么这个 ...

  3. <s:form action="login"...与<s:form action = "login.action".的区别

    1.<s:form action="login" namespace="/login"> 它表示的是<form id="login& ...

  4. FORM ACTION=""

    FORM ACTION=""  如果什么都不写,就表示提交到当前页

  5. HTML <form> action 属性

    当提交表单时,发送表单数据到名为 "demo_form.html" 的文件(处理输入): <form action="demo_form.html" me ...

  6. form action中如何填写相对目录

    举个例子,你在web-root文件夹有个a.html需要向/web-root/jsp/b.jsp提交form,怎么做 网上看到了一个解决方案,但是要求a是jsp页面而不是html页面 <%!St ...

  7. 在form action中滥用绝对路径导致session的attribute丢失(无法正常保存)

    症状: 刚才在做一个利用session的attribute保存用户的id的实验,login.jsp输入用户id,提交给LoginServlet去数据库验证,然后LoginServlet根据验证情况跳转 ...

  8. form action 相对路径出问题

    http://www.w3chtml.com/html5/tag/base.html <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL ...

  9. 【转】document.form.action,表单分向提交

    document.form.action,表单分向提交,javascript提交表单 同一个表单可以根据用户的选择,提交给不同的后台处理程序.即,表单的分向提交.如,在编写论坛程序时,如果我们希望实现 ...

随机推荐

  1. iOS开源项目教程大合集

    UI篇 1.MMDrawerController http://www.cnblogs.com/shangdahao/p/3142204.html 2.SVPullToRefresh http://w ...

  2. tengine + mysql + nginx + php

    tengine + mysql + nginx + php 1.配置防火墙vim /etc/sysconfig/iptables # 允许80端口通过防火墙-A INPUT -m state --st ...

  3. 一个基于POP3协议进行邮箱账号验证的类

    最近老陈要针对企业邮箱做一些开发,以对接企业OA神马的,但企业邮箱唯独没有开放账号密码验证功能,很恼火!不得已,翻出早些年的Asp代码改编成了C#类,实现了一个C#下的通过POP3协议进行邮箱账号验证 ...

  4. svn diff excel

    https://github.com/solq360/compareExcel jdk 1.7 可自己编译1.6 每个sheet第一行不允许为空 SVN对比excel差异 适合策划.财务职业使用 sv ...

  5. SQL语句中将Datetime类型转换为字符串类型

    0 Feb 22 2006 4:26PM  CONVERT(CHAR(19), CURRENT_TIMESTAMP, 0) 1  02/22/06  CONVERT(CHAR(8), CURRENT_ ...

  6. JS 传递对象问题,指针引用

    $(function () { var test1 = function (args) { args.name = "lcc2"; args = { name: "lcc ...

  7. WWDC2015 结束.新一波更新以及bug即将来袭.

    WWDC结束.新一波更新以及bug即将来袭. HTTPS 将成为标准链接. http被报错. GamePlayKit 这是搞那样. 还有ReplayKit  那些什么录像分享什么的还有活路么? Mod ...

  8. ArcGIS如何将表连接到空间数据上

    当我们有一些空间数据和一些业务数据(表),希望把业务数据和空间数据连接起来时,可以采用ArcGIS Desktop进行操作.本文将介绍如何在ArcGIS Destop中将表和空间数据关联起来. Arc ...

  9. I'm back for Machine Learning

    Hi, Long time no see. Briefly, I plan to step into this new area, data analysis. In the past few yea ...

  10. Spring Remoting: Remote Method Invocation (RMI)--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...