这是我想做的。这看起来很简单,但我无法让它起作用。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}Problem -when JSP2提交给控制器,我称之为WorkorderBean workorder = (WorkorderBean) request.getAttribute("workorder");,它返回null。因此,“scope=request”并不能从JSP转换到servlet。
选项2:相同的场景,但在JSP2上使用'scope=session‘。
Problem:当用户选择返回JSP1并修改数据,然后重新提交给JSP2时,JSP2不会使用新值,因为它已经将bean作为会话bean。
问题:在从JSP1提交时,有什么方法可以清除会话bean吗?我不认为我能用Javascript做到这一点。
选项3:让JSP1提交到Servlet,它格式化会话bean并发送到JSP2。
Problem:当用户选择从JSP2返回到JSP1进行更改时,所有数据都会在表单中丢失。
我怎么才能把这事做好?
发布于 2010-10-15 20:50:02
备选案文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="*" /> 然后,jsp:setProperty将在每个JSP2调用时被调用,并用请求参数覆盖bean属性。
发布于 2010-10-15 20:57:59
最好的做法是在第二页上有一个带有隐藏字段的表单。
然后在第一个表单中,您应该让它查看输入数据的请求。
所以,你的结局是:
GET /jsp1显示初始形式,空。然后将其发布到JSP2
POST /jsp2
fname=Frank&lname=Jones&city=Atlanta然后,jsp2重定向回它自己:
GET /jsp2?fname=Frank&lname=Jones&city=Atlanta它会显示这些值。
如果用户回击,那么他们就会看到他们的原始作品。如果您为他们提供了一个“回溯”链接,并且它是一个真正的链接,那么它应该类似于JSP2,只是它是JSP1:
GET /jsp1?fname=Frank&lname=Jones&city=Atlanta如果他们选择继续,那么您将发布到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。
从根本上说,您只想让浏览器显示它得到的东西,而不是文章的结果。如果您在单击“后退”按钮时看到该对话框“您想要重新提交此查询吗”,那是因为上一页的结果来自一个帖子,而不是GET。
在请求中使用参数帮助将状态向前推进。这样可以使会话中的信息远离,并让“刷新”按钮为用户正常工作。
https://stackoverflow.com/questions/3945908
复制相似问题