这就是我想要做的。看起来很简单,但我无法使其正常工作。 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,该Servlet格式化会话bean并将其发送到JSP2。
问题:当用户选择从JSP2返回到JSP1进行更改时,所有数据都将以表格形式丢失。
我该如何工作?
最佳答案
选项1的可能解决方案:
在JSP2中,将请求参数放在隐藏的表单字段中,以便可以将它们提交到servlet。在Servlet中,您必须手动读取请求参数。但是您不需要会话,可以从JSP2返回JSP1,更改一些值,然后再次提交给JSP2。然后,在JSP2上的提交将更改后的值传输到servlet。
更新:
在第二个选项中:重新提交后bean属性保持不变的原因是,将jsp:setProperty
标记放置在jsp:useBean
内。有了这个星座,仅在bean创建时调用jsp:setProperty
。在第二次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属性。关于java - java session bean-重新加载数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3945908/