这就是我想要做的。看起来很简单,但我无法让它发挥作用。 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进行更改时,所有数据都会在表单中丢失。
我该如何做到这一点?
答案 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属性。