支柱 2 子操作



我有一个 struts2 表单。在此表单中,要求用户填写多个字段。其中 2 个字段是通过从另一个操作中选取对象来填充的。

事实上:主窗体 =>拾取按钮 =>新操作,要填充新窗体 =>返回主窗体并填写相应的字段。

我的问题是,在用户完成子操作后,我想返回主窗体,但不会丢失他之前填写的所有内容......

我不知道如何处理这个问题,我应该将主窗体中的每个字段传递给子操作吗?

我想到几种方法,具体取决于因素将确定最适合您的方法。

1)每次发送要保留的所有参数。 最简单的方法是使用隐藏字段。模型驱动在这里也可能有意义,或者将多个操作放入一个类中,无论哪种方式,它都会突出显示这些操作共享一组通用属性。

2) 像瓦西里推荐的那样将值存储在会话中,但是 Struts2 具有范围拦截器......如果您需要经常这样做,则值得一看(请参阅页面上的最后一个示例): http://struts.apache.org/2.3.1.2/docs/scope-interceptor.html 但是要做到这一点有点棘手,因为如果这是一个办公应用程序并且用户像我一样,我们将在任何给定时间打开十几个窗口。在这种情况下,您还需要考虑向每个"流"添加一个令牌(请参阅:struts2 令牌标签),这将防止在执行刷新时出现十几个窗口之一,以从我期望的内容中获取最新数据,而不是从所有操作使用的某些全局存储中被污染。还有其他一些方法可以处理流/对话...例如,有人写了一个插件,我想它会实现刚才解释的内容:http://code.google.com/p/struts2-conversation/

总是值得快速浏览一下 struts2 插件以确保您没有重新发明轮子,尽管我必须说我不能保证该插件。

3)不要让他们离开页面。这是非常光滑的...如果您需要选择其他参数,当他们单击"pickup"按钮时,使用必填字段展开表单,然后当他们单击此小节中的"更新"时,它将关闭并更新其余字段。 您将需要在客户端将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;
  }

"准备"方法是准备性的一部分。每次调用acton时,它将在所有参数读取之前和"execute"方法之前执行。

您需要以下内容才能拥有一个有效的 struts2 平台:

  1. 2 个支柱形成带有字段的类
  2. 支柱动作类
  3. 一个 jsp 页
  4. 支柱配置文件

然后完成以下过程:

  • 加载第一个窗体时,将其 Bean 保存在第二个窗体中通过字段
  • 从第一个窗体返回后,在第二个窗体中加载其字段通过上述字段形成表单

最新更新