一. 异常重现
最近壹哥有个学生在学习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中。
现在你知道这个问题是怎么产生、怎么解决的吗?如果你还有其他问题,可以将问题在评论区贴出来,壹哥看到就会给你详细解答哦。
标签:传参,请求,壹哥,参数,action,null,Servlet,id From: https://blog.51cto.com/u_7044146/5966093