星空网 > 软件开发 > 网页设计

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.action传值问题

 




参数信息: 查询字符串

Form.action传值问题

 




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

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

Form.action传值问题

 



参数信息: 表单数据

Form.action传值问题

 




上面两种方式的相应都是刷新后显示当前页面,因为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().

Form.action传值问题

 





第四种情况: 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().

Form.action传值问题

 





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=

Form.action传值问题

 



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

Form.action传值问题

 






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

Form.action传值问题

 




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

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

Form.action传值问题

 





所以上面给我们一种启示,就是通过?在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传值问题

 




 




原标题:Form.action传值问题

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

定了!亚马逊瑞典站全面开放注册,这些知识你要提前了解。:https://www.ikjzd.com/articles/128910
黑帽卖家能否在亚马逊市场上赢得胜利?:https://www.ikjzd.com/articles/128911
用选品“偏方”,山西卖家稳定日出千单!:https://www.ikjzd.com/articles/128912
个人博客网站也可以月入上万美金:https://www.ikjzd.com/articles/128914
在亚马逊A9算法下,如何通过优化搜索引擎来提升产品排名?:https://www.ikjzd.com/articles/128915
亚马逊卖家九月如何找真实有效的测评人?:https://www.ikjzd.com/articles/128916
Mercado Livre将投资46亿美元加注巴西市场:https://www.kjdsnews.com/a/1840706.html
神农架何时旅游更佳,穷游神农架更佳攻略:https://www.vstour.cn/a/402237.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流