我有一个包含表单的 JSP,其中包含多个文本输入。
我可以用一些数据填充文本输入。单击提交按钮后,将按预期调用我的 servlet 的 doPost 方法。按照 PRG 设计模式,我在 doPost 方法的末尾使用“sendRedirect”调用,以避免在例如用户重新加载 wep 页面时再次提交我的表单。
此时一切正常:表格中输入的数据显示在屏幕上。
但是,如果我再次按下提交按钮,我会得到令人讨厌的 nullPointerExceptions,因为传递给我的 servlet 的 doPost 方法的 HttpServletRequest 不再包含我在第一次提交时输入的数据。
我不明白为什么会出现这种行为:表单包含数据,但第二次没有发送。
你能解释一下我的方法有什么问题吗?
[编辑] 我正在尝试另一种方法,通过使用会话属性,这是我的一些代码:
关于 JSP (myJsp.jsp)
<form method="post" action="myServlet">
field: <input type="text" name="field" value="${sessionScope.bean.field}"><br>
<input type="submit" name="lastname">
</form>
在 servlet (myServlet.java)
private Bean myBean;
doPost(...){
doSthWithMyBean(myBean);
response.sendRedirect("myJsp.jsp");
}
doGet(...){
request.getSession().setAttribute("bean",myBean);
this.getServletContext()....("myJsp.jsp").forward(request, response);
//I forget the exact methods on the description above, but you see what I do : I forward the request and response to the same jsp
}
我的理解是: - 第一次加载页面时,会调用 doGet 方法。所以 myBean 被设置为会话的一个属性——当我点击提交时,doPost 方法被调用。由于 myBean 已被设置为会话的属性,我希望自动检索 bean 信息(因为 ${sessionScope.bean.field} 在表单的 value 字段中)
=> 使用第二种方法,即使是第一个表单提交也会因空指针异常而失败,但我不明白为什么。
如果我恢复使用请求参数而不是会话对象
value="${bean.field}
我通过 doPost 方法中的 request.getParameter 访问参数。它适用于表单的第一次提交,但在第二次提交时,即使表单填充了第一次提交的值,也没有名为“字段”的请求参数。
总结一下我所有的谈话:-当我使用请求参数时:为什么第二次提交时没有名为“字段”的请求参数?- 当我使用会话属性时:为什么在第一次提交表单时它为空?