我有一个包含表单的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}位于表单的值字段中)
=&GT;使用第二种方法,即使是第一个表单提交也会因空指针异常而失败,但我不明白为什么。
如果我恢复使用请求参数而不是会话对象
value="${bean.field}
我通过doPost方法中的request.getParameter访问参数。 它适用于第一次提交表单,但在第二次提交时,即使表单填充了第一次提交的值,也没有名为“field”的请求参数。
总结我所说的话: - 当我使用请求参数时:为什么第二次提交时没有名为“field”的请求参数? - 当我使用session属性时:为什么在第一个表单提交时它为null?
答案 0 :(得分:0)
我找到了解决问题的方法,但我不喜欢它。
在第一次提交时,请求参数映射包含表单输入内容。 所以我通过request.getParameter(....)方法获取它们,并使用request.getSession.setAttribute(.....)
在第二次提交时,请求参数映射不包含表单内容(即使它们是从表单中显示的,因为它们是从会话属性中检索的) 我测试了request.getParameter的nullity,如果它为null,我不会更新我的session属性。
它有效,但我发现它并不干净,而且我确定我错过了一些东西,所以我把它留给任何其他想法。 感谢。
答案 1 :(得分:0)
使用#{...} EL表达式