• 解决表单action属性传参时值为null的问题


    一. 异常重现

    最近壹哥有个学生在学习Servlet进行Web开发时,尝试着使用表单中的action传递参数,结果他发现在Servlet中无法接收到前端传过来的参数值。

    我们先来看看他的代码,具体代码如下所示:

    1. 前端代码参数

    这里用action配置了后端接口及传递的参数1001。

    1. <form action="/user?id=1001">
    2. <input type="submit" value="提交" />
    3. </form>

    2. 后台Servlet代码

    这里是对应的后端Servlet代码,可以从请求参数中获取id参数的值。

    1. @WebServlet("/user")
    2. public class MyServlet extends HttpServlet {
    3. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. String id = request.getParameter("id");
    5. System.out.println(id);
    6. }
    7. }

    上面的代码执行之后,最终的打印结果是: null

    这个学生就很好奇,为什么id的值是null?不应该是1001吗?这是怎么回事呢?

    二. 异常原因

    对于这样的结果,这个同学表示很疑惑,那么结果为什么是null呢?他始终想不明白原因,于是就来找壹哥给他解决。于是壹哥就拿来他的代码,给他仔细排除了起来。

    通过debug调试,我发现,如果是从url中直接访问http://localhost:8080/user?id=1001时,则可以接收到前端传来的数据。但当利用form表单传参时,获取的值却是null。由此可见,问题应该出在action参数上面,而不是我们的后端代码有问题!

    之所以会出现上述现象,这是因为当action传参时,默认用的是get请求方式,get请求会将action中的参数给清除掉,也就是url中的参数被清除掉了,传递时变成了http://localhost:8080/user? 这种形式,所以Servlet代码中自然就无法获取到对应的请求参数了。

    三. 解决方案

    那么这个问题该怎么解决呢?这里壹哥给出如下2种具体的解决方案。

    1. 第一种方案,我们可以将表单中的请求方式改为post。因为post请求是以请求体的方式传递参数,url中的参数不会被清理。

    2. 第二种方案,我们可以使用隐藏控件传参,这时无论是get/post请求都可以。

    这里壹哥就给大家展示使用隐藏控件传参的代码示例:

    1. <form action="/user">
    2. <input type="hidden" name="id" value="1001"/>
    3. <input type="submit" value="提交" />
    4. </form>

    大家以后要记住,如果我们是以get请求传参,则会以url方式传递;如果是以post请求传参,则会将id参数以请求体的方式传到后台Servlet中。

    现在你知道这个问题是怎么产生、怎么解决的吗?如果你还有其他问题,可以将问题在评论区贴出来,壹哥看到就会给你详细解答哦。

  • 相关阅读:
    conda config包含无效channel解决办法
    【1day】复现宏景OA KhFieldTree接口 SQL注入漏洞
    2023年天津农学院专升本专业课参考教材
    解决在uniapp中自定义组件onLoad回调不执行
    Springcloud中Feign传递参数
    Java自学注意细节快速成长
    蛋白纯化-实验设计
    Java重写和重载的区别,
    java基于ssm的高校人事员工工资管理系统
    AI中英文翻译软件,一键批量多语种翻译
  • 原文地址:https://blog.csdn.net/syc000666/article/details/125495576