java session bean - 重装数据?

时间:2010-10-15 20:32:18

标签: java jsp session javabeans

这就是我想要做的。看起来很简单,但我无法让它发挥作用。 JSP1 - 用户填写表单,提交给JSP2。 JSP2填充Bean中的表单值并显示数据,并提供用户选项以返回和修改(history.back()),或提交给Servlet。我提出了三种不同的选择,每种都有问题。

选项1:JSP1 - 标准html表单,提交给JSP2

<form name="testform" method="post" action="jsp2.jsp">
...
City: <input name="currentCity" type="text" />

JSP2 -

<jsp:useBean id="workorder" type="com.mycompany.app.WorkorderBean" class="com.mycompany.app.WorkorderBean" scope="request">
    <jsp:setProperty name="workorder" property="*" />
</jsp:useBean>
...
currentCity: ${workorder.currentCity}

问题 - 当JSP2提交给控制器时,我调用WorkorderBean workorder = (WorkorderBean) request.getAttribute("workorder");它返回null。所以'scope = request'不会从JSP到servlet。

选项2:相同的场景,但在JSP2上使用'scope = session'。
问题:当用户选择返回JSP1并修改数据,然后重新提交给JSP2时,JSP2不使用新值,因为它已经将bean作为会话bean。
问题:当我从JSP1提交时,有没有办法可以清除会话bean?我认为我不能用Javascript做到这一点。

选项3:让JSP1提交给Servlet,它将会话bean格式化并发送到JSP2。
问题:当用户选择从JSP2返回到JSP1进行更改时,所有数据都会在表单中丢失。

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

最好的办法是在第二页上有一个带有隐藏字段的表单。

然后在第一个表单上,您应该查看输入数据的请求。

所以,你最终得到了这个:

GET /jsp1

显示初始表单,为空。然后POST到JSP2

POST /jsp2
fname=Frank&lname=Jones&city=Atlanta

jsp2然后REDIRECT回到自己:

GET /jsp2?fname=Frank&lname=Jones&city=Atlanta

它会显示这些值。

如果用户点击BACK,那么他们会看到原来的作品。如果你为他们提供一个“返回”链接,并且它是一个真正的链接,它应该像JSP2,而只是它的JSP1:

GET /jsp1?fname=Frank&lname=Jones&city=Atlanta

如果他们选择继续,那么你POST到Servlet:

POST /servlet
fname=Frank&lname=Jones&city=Atlanta

在JSP2上,您有一个隐藏的表单:

<form action="/servlet" method="POST">
    <input type="hidden" name="fname" value="Frank"/>
    ...
    <input type="submit" ... />
</form>

然后,当它完成时,Servlet将重定向到它想要显示的任何JSP。

从根本上说,您只希望浏览器显示它获取的内容,而不是POST的结果。如果你曾经看到当你点击后退按钮并且你得到那个对话框“你想重新提交这个查询”,那是因为上一页的结果来自POST,而不是GET。

您可以在请求中使用参数来帮助推进州。这样可以使信息远离会话,并使“刷新”按钮等用户能够正常工作。

答案 1 :(得分:0)

选项1的可能解决方案:

在JSP2中,将请求参数放在隐藏表单字段中,以便将它们提交给您的servlet。在servlet中,您必须手动读取请求参数。但是你不需要会话,你可以从JSP2返回到JSP1,更改一些值,再次提交给JSP2。然后JSP2上的提交将更改的值传递给servlet。

<强>更新

在第二个选项中:重新提交后bean属性保持不变的原因是,您将jsp:setProperty标记放在jsp:useBean内。有了这个星座,jsp:setProperty只在bean创建时被调用。在JSP2的第二次调用期间,bean workorder已经存在于会话范围内,并且没有jsp:setProperty调用。

如果您将jsp:setProperty标记放在jsp:useBean之外,则可以更改该行为:

<jsp:useBean id="workorder" type="com.mycompany.app.WorkorderBean"
   class="com.mycompany.app.WorkorderBean" scope="session" />
<jsp:setProperty name="workorder" property="*" />  

然后将在每次JSP2调用时调用jsp:setProperty并使用请求参数覆盖bean属性。