Form.action传值问题

通过浏览器地址栏输入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

时间: 2024-08-02 18:07:23

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

Struts2常用标签的使用以及Action传值

为了学习struts2框架,这次练习完成了一个简单的功能,希望能够在struts表单标签的使用以及传值方面能够对大家的学习起到参考作用. 项目功能 项目的功能是在提交页面输入个人信息之后点击提交跳转到一个新的页面,新的页面会显示之前所填写的个人信息. 开发环境和工具 已配置最新版Java开发环境的Windows系统.MyEclipse 2014/2016.Tomcat服务器7.0/8.0/9.0. 内容介绍 本次练习中出现的struts2表单标签: <s:textfield/>文本输入框 &l

&lt;转&gt; jsp页面向action传值的方法(最后一种简单)

多的不说,直接上代码; struts.xml代码: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">&

表单form action的url写法

在写web页面时,标签 是很常见的元素,它的一个属性是action,用来标识将表单交给谁去处理.很显然,这里有一个地址的问题,而且是在服务器这边的地址.比如服务器内的一个servlet. 那么这个地址怎么写? 1.以"/"开头的表示绝对地址,即web根目录,比如你用tomcat服务器,那么就是指webapp目录了. 2.不以"/"开头的表示的是相对地址,即相对于当前这个页面的地址. 在JSP页面获取当前项目名称的方法: 方法1: <%= this.getSer

&lt;s:form action=&quot;login&quot;...与&lt;s:form action = &quot;login.action&quot;.的区别

1.<s:form action="login" namespace="/login"> 它表示的是<form id="login" name="login" action="/Action/login/login.action" method="post"> 因为它使用了struts标签,后面会自动加.action,而且namespace会起作用 2.<s

form action 相对路径出问题

http://www.w3chtml.com/html5/tag/base.html <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白. 什么意思呢,就是文件目录结构影响url 使用 <base> 标签可以改变这一点.浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL.这其中包括 <a>.<img>.<link&g

form action中get \post传递参数的问题

<form action="servlet/ThirdServlet?userName=1&passWord=2" method="post"> 姓名<input type="text" name="uesrName"><br> 密码<input type="text" name="passWord"><br> <

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

document.form.action,表单分向提交,javascript提交表单 同一个表单可以根据用户的选择,提交给不同的后台处理程序.即,表单的分向提交.如,在编写论坛程序时,如果我们希望实现用户在发送贴子的时候,既发送提交功能又有预览功能时,就会遇到上述问题.即,当用户点击提交按钮时,我们希望表单提交给"提交"处理程序:而当用户点击预览按钮时,我们希望表单提交给"预览"处理程序.那么,如何实现上述功能呢?下面代码可以很好的解决这个问题. <form

jsp想js,action传值

1.struts2 action如何向JSP的JS函数传值 action中定义变量 public class TestAction extends ActionSupport implements ServletRequestAware {     private String state = "test"; } JSP的JS函数中引用变量 <script type=text/javascript>     function getStatus() {         va

struts2中关于jsp页面向action传值出现乱码问题

在JSP页面输入中文并传给后台的时候,常常会出现乱码问题,产生乱码的原因:java在进行传值的时候,默认用的是iso-8859-1的编码形式进行传输,而我们jsp页面常用的则是utf-8的编码形式.所以,两者不对应,在解析的时候就出现乱码现象. 有以下几种解决方案: 一:在struts.xml文件中添加 <constant name="struts.i18n.encoding" value="utf-8"></constant> 注:这里va