我有一个 struts2 表格。在此表单中,要求用户填写几个字段。其中 2 个字段是通过从另一个操作中选择一个对象来填充的。
实际上:主窗体 => 拾取按钮 => 新动作用新窗体填充 => 返回主窗体并填充相应字段。
我的问题是,在用户完成子操作后,我想返回主窗体但不会丢失他之前填写的所有内容......
我不知道如何处理这个问题,我应该将主表单中的每个字段都传递给子动作吗?
我有一个 struts2 表格。在此表单中,要求用户填写几个字段。其中 2 个字段是通过从另一个操作中选择一个对象来填充的。
实际上:主窗体 => 拾取按钮 => 新动作用新窗体填充 => 返回主窗体并填充相应字段。
我的问题是,在用户完成子操作后,我想返回主窗体但不会丢失他之前填写的所有内容......
我不知道如何处理这个问题,我应该将主表单中的每个字段都传递给子动作吗?
有几种方法浮现在脑海中,具体取决于因素将确定最适合您的方法。
1) 每次发送你想要保留的所有参数。最简单的方法是使用隐藏字段。模型驱动在这里也可能有意义,或者将多个动作放在一个类中,无论哪种方式,它都强调这些动作共享一组共同的属性。
2)像 Vasily 推荐的那样将值存储在会话中,但是 Struts2 具有范围拦截器......如果您需要经常这样做,那么值得一看(参见页面上的最后一个示例):http ://struts.apache.org/ 2.3.1.2/docs/scope-interceptor.html但是要做到这一点有点棘手,因为如果这是一个办公应用程序并且用户像我一样,我们将在任何给定时间打开十几个窗口。在这种情况下,您还需要考虑添加一个令牌(请参阅:struts2 令牌标签( 还有其他一些处理流程/对话的方法......例如,有人写了一个插件,我想它可以实现刚刚解释的内容: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 对书签不是很友好,而且在不使用客户端存储的情况下,它们通常对状态不太友好。
将您的主窗体存储在会话中。
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接口的一部分。每次调用动作时,它将在所有参数读数之前和“执行”方法之前执行。
您需要以下内容才能拥有一个工作的 struts2 平台:
然后进行以下流程: