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

htmltagsareessentialforwebdevelopmentastheyandendenhancewebpages.1)heSdefinElayout,语义和互动性。2)SemantictagsiCtagSimproveCacsibilitieAndseo.3)pose poseriblesibilityAndseoandseo.3)poser

一致的HTML编码风格很重要,因为它提高了代码的可读性、可维护性和效率。1)使用小写标签和属性,2)保持一致的缩进,3)选择并坚持使用单引号或双引号,4)避免在项目中混合使用不同风格,5)利用自动化工具如Prettier或ESLint来确保风格的一致性。

在Bootstrap4中实现多项目轮播的解决方案在Bootstrap4中实现多项目轮播并不是一件简单的事情。虽然Bootstrap...

如何实现鼠标滚动事件穿透效果?在我们浏览网页时,经常会遇到一些特别的交互设计。比如在deepseek官网上,�...

无法直接通过CSS修改HTML视频的默认播放控件样式。1.使用JavaScript创建自定义控件。2.通过CSS美化这些控件。3.考虑兼容性、用户体验和性能,使用库如Video.js或Plyr可简化过程。

在手机上使用原生select的潜在问题在开发移动端应用时,我们常常会遇到选择框的需求。通常情况下,开发者倾...

在手机上使用原生select的弊端是什么?在移动设备上开发应用时,选择合适的UI组件是非常重要的。许多开发者�...

使用Three.js和Octree优化房间内第三人称漫游的碰撞处理在Three.js中使用Octree实现房间内的第三人称漫游并添加碰�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

WebStorm Mac版
好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。