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

一. 异常重现

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

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

1. 前端代码参数

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

<form action="/user?id=1001">

    <input type="submit" value="提交" />

</form>

2. 后台Servlet代码

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

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

上面的代码执行之后,最终的打印结果是: 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请求都可以。

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

<form action="/user">

    <input type="hidden" name="id" value="1001"/>

    <input type="submit" value="提交" />

</form>

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一一哥Sun

您的鼓励是我继续创作的动力哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值