2013-02-03 63 views
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="${bean.field} 

请求参数I通过用request.getParameter访问doPost方法的参数。 它适用于表单的首次提交,但在第二次提交时,即使表单中填充了第一次提交的值,也没有名为“field”的请求参数。

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

+0

您如何重新显示重定向的GET请求上的数据?在重定向的GET请求应该做什么的表单提交?为什么它会再次使用相同的servlet? – BalusC

+0

BalusC,回答你的问题:我用EL表达式value =“$ {sessionScope.bean.field}”或value =“$ {bean.field}”重新显示我的表单中的数据。例如,数据将在“partial submissin”的情况下发送到同一个servlet。假设用户填写了表单上的一些输入内容。它们由servlet处理,但同一个网页随后会重新显示已输入的数据,以便用户可以继续填充缺少的字段 – facewindu

回答

0

我找到了解决方案,但我不喜欢它。

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

  • 在第二提交,请求参数映射不包含形式的内容(即使它们显示在形式,因为它们被从会话属性检索) 我测试的request.getParameter的无效,并且如果它为空,我不更新我的会话属性。

它的工作原理,但我并不觉得干净,我敢肯定,我失去了一些东西,所以我离开这个打开的任何其他的想法。 谢谢。

相关问题