【问题标题】:Struts 2 subactionStruts 2 子动作
【发布时间】:2012-04-20 09:15:23
【问题描述】:
我有一个 struts2 表单。
在此表单中,要求用户填写几个字段。
其中 2 个字段是通过从另一个操作中选择一个对象来填充的。
事实上:
主表单 => 拾取按钮 => 新操作,新表单要填写 => 返回主表单并填写相应字段。
我的问题是用户完成子动作后,我想回到主窗体但又不会丢失他之前填写的所有内容...
我不知道如何处理这个问题,我应该将主表单中的每个字段都传递给子操作吗?
【问题讨论】:
标签:
java
struts2
struts-action
【解决方案1】:
有几种方法浮现在脑海中,具体取决于因素将确定最适合您的方法。
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”按钮时,表单会展开并包含必填字段,然后当他们点击本小节中的“update”时,它会关闭并更新其余参数的领域。您需要将客户端的 JS 与通常的 XML 或 JSON 响应相结合。对于您自己的页面,JSON 是一种更简单的方法,要生成 JSON 响应,请参阅struts2-json-plugin。
在大多数情况下,我会选择#3。如果我知道该操作只能从调用操作中使用和/或我想要一个非常安全的书签形式(如果可能,使用 GET 传递所有参数),可能是 #1。 #2 在更复杂的场景中,需要多个操作进行协作,并且由于某些奇怪的原因我无法使用 ajax。注意 #3 和 #2 对书签不太友好,而且在不使用客户端存储的情况下,它们通常对状态不太友好。
【解决方案2】:
将您的主窗体存储在会话中。
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接口的一部分。每次调用动作时,它将在所有参数读数之前和“执行”方法之前执行。
【解决方案3】:
您需要以下条件才能拥有一个工作的 struts2 平台:
- 2 个带字段的 struts 表单类
- 一个 struts 动作类
- 一个jsp页面
- struts 配置文件
然后进行以下流程:
- 加载第一个表单时,将其 bean 保存在第二个表单中
通过一个字段
- 从第一个表单返回后,在第二个表单中加载其字段
通过上述字段形成