php form action 参数,Form.action传值问题

本文详细介绍了HTTP表单提交中GET和POST方法的区别,特别是参数传递的机制。在GET方式下,表单数据会重组为查询字符串,而POST方式则会将数据与URL分开提交。当在表单action中通过?传递参数时,只有POST方法能正确获取这些参数。此外,还探讨了如何在Servlet中处理这两种方法的参数,并提供了示例代码进行说明。
摘要由CSDN通过智能技术生成

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

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

原始表单:

用户名:

第一种情况:

上面表单的action属性不写时,直接点击“提交”按钮,会触发表单的提交事件,此时,通过火狐浏览器的控制台可以发现:

消息头中有如下关键信息:(1)请求地址后面通过'?'传递参数(2)请求方式为GET

6513e1b1d94b62edb51768867b0ae0b1.png

参数信息: 查询字符串

aac2161263ba26cc8d8630fa7cffc199.png

指定form的method属性时:用户名:

第二种情况:

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

466a762542cfc41b6b582eab5906ae56.png

参数信息: 表单数据

c4f5125f778e95170651e8ec56bc1a54.png

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

00dc18877399360c39d0978d18d89e3e.png

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

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

a1c66819d002be9b7d1324305b914f4e.png

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=

6cb44a8282c3831333a3cbdca0882691.png

可以发现,后台的doGet()是获取不到参数type的.

同时发现,type参数是没有加入到“查询字符串”的

16cfc203ecbe4bdc5850c18be2ef95e6.png

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

99e143a1270653b7a9264639a7e2e047.png

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

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

86963dd19e4d8ab6060e6f51d044ac9c.png

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

0de6600ceb4d38395d7ad76ab4397fd3.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值