一. 异常重现

最近壹哥有个学生在学习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吗?这是怎么回事呢?

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

二. 异常原因

对于这样的结果,这个同学表示很疑惑,那么结果为什么是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中。

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