我有一个struts2表单。在此表单中,要求用户填写多个字段。其中2个字段是通过从另一个操作中拾取一个对象来填充的。
事实上: main form =>拾取按钮=> new动作,用新的表单填充=>,返回到主表单并填写相应的字段。
我的问题是,在用户完成子操作后,我希望返回到主窗体,但不想丢失他之前填写的所有内容。
我不知道如何处理这个问题,我应该将主窗体中的每个字段都传递给子操作吗?
发布于 2012-04-21 14:01:38
脑海中浮现出几种方式,这取决于各种因素,它们将决定最适合你的方式。
1)将您每次想要保留的所有参数发送出去。最简单的方法是使用隐藏字段。模型驱动在这里可能也有意义,或者将几个操作放到一个类中,无论哪种方式,它都强调了这些操作共享一组公共属性。
2)像Vasily推荐的那样将值存储在会话中,但是Struts2具有作用域拦截器...如果你需要经常这样做,它是值得一看的(参见第页的最后一个例子):http://struts.apache.org/2.3.1.2/docs/scope-interceptor.html然而,要正确地做到这一点有点棘手,因为如果这是一个办公应用程序,并且用户像我一样,他们在任何给定的时间都会有十几个窗口打开。在这种情况下,您需要考虑在每个“流”中添加一个令牌(参见:struts2 token tag),这将防止在执行刷新操作以从我期望的数据中提取最新数据时,阻止十几个窗口中的一个窗口,而不是从所有操作使用的某个全局存储中获取污染。还有一些其他的方法来处理流程/对话...例如,有人编写了一个插件,我认为它将实现刚才解释的内容:http://code.google.com/p/struts2-conversation/
快速浏览一下struts2插件总是值得的,以确保您不是在重复发明轮子,尽管我必须说我不能保证那个插件。
3)根本不要让他们离开页面。这很圆滑..。如果您需要选择其他参数,则当他们单击"pickup“按钮时,表单将用必填字段展开,然后当他们单击本小节中的”更新“时,表单将关闭并更新其余字段。您需要在客户端结合使用JS和XML或JSON响应。对于您自己的页面,JSON是一种更容易的方法来生成JSON响应,请参阅struts2-json-plugin。
在大多数情况下,我会选择#3。可能是#1,如果我知道动作只会在调用的动作中使用,和/或我想要一个非常书签安全的表单(如果可能的话,用GET传递所有参数)。#2在更复杂的场景中,多个动作需要协作,而我由于某种奇怪的原因不能使用ajax。注意#3和#2对书签不是很友好,而且如果不使用客户端存储,它们通常对状态不是很友好。
发布于 2012-04-20 17:49:18
将你的主表单存储在会话中。
public class Test extends ActionSupport implements Preparable {
private MainForm form;
public void prepare(){
form = (MainForm)ServletActionContext.getRequest().getSession().getAttribute("mainForm");
if(form == null) {
form = new MainForm();
}
}
public String execute(){
//Do something useful
//Do something useful
//Do something useful
return SUCCESS;
}
public MainForm getForm() {
return form;
}
public void setForm(MainForm form) {
this.form = form;
}"prepare“方法是Preparable的一部分。每次调用acton时,它都会在所有参数读数之前和"execute“方法之前执行。
发布于 2012-04-20 17:58:47
您需要具备以下条件才能拥有一个工作的struts2平台:
<代码>G29
然后执行以下流程:
将其字段加载到第二个表单中
https://stackoverflow.com/questions/10243368
复制相似问题