0

我有一个包含表单的 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 访问参数。它适用于表单的第一次提交,但在第二次提交时,即使表单填充了第一次提交的值,也没有名为“字段”的请求参数。

总结一下我所有的谈话:-当我使用请求参数时:为什么第二次提交时没有名为“字段”的请求参数?- 当我使用会话属性时:为什么在第一次提交表单时它为空?

4

2 回答 2

0

我找到了解决问题的方法,但我不喜欢它。

  • 在第一次提交时,请求参数映射包含表单输入内容。所以我通过 request.getParameter(....) 方法获取它们,并使用 request.getSession.setAttribute(.....) 将它们设置为我的会话属性

  • 在第二次提交时,请求参数映射不包含表单内容(即使它们显示在表单中,因为它们是从会话属性中检索的)我测试request.getParameter的空性,如果它是空的,我不'不更新我的会话属性。

它有效,但我觉得它不干净,而且我确定我遗漏了一些东西,所以我把它留给任何其他想法。谢谢。

于 2013-02-04T21:08:57.753 回答
0

使用 #{...} EL 表达式有效

于 2013-02-15T13:00:58.913 回答