2

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

实际上:主窗体 => 拾取按钮 => 新动作用新窗体填充 => 返回主窗体并填充相应字段。

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

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

4

3 回答 3

1

有几种方法浮现在脑海中,具体取决于因素将确定最适合您的方法。

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

2)像 Vasily 推荐的那样将值存储在会话中,但是 Struts2 具有范围拦截器......如果您需要经常这样做,那么值得一看(参见页面上的最后一个示例):http ://struts.apache.org/ 2.3.1.2/docs/scope-in​​terceptor.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 对书签不是很友好,而且在不使用客户端存储的情况下,它们通常对状态不太友好。

于 2012-04-21T06:01:37.547 回答
0

将您的主窗体存储在会话中。

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接口的一部分。每次调用动作时,它将在所有参数读数之前和“执行”方法之前执行。

于 2012-04-20T09:49:18.137 回答
0

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

  1. 2个带有字段的struts表单类
  2. 一个struts动作类
  3. 一个jsp页面
  4. 一个struts配置文件

然后进行以下流程:

  • 加载第一个表单时,通过字段将其 bean 保存在第二个表单中
  • 从第一个表单返回后,通过上述字段在第二个表单中加载其字段
于 2012-04-20T09:58:46.977 回答