Struts ActionForm 在请求范围内丢失

Struts ActionForm Lost from Request scope

我已经接管了一个有 10 年历史的 Struts 1.2 应用程序的维护工作。 (对于 post 来说太复杂和专有了。)

该应用程序使用了几个以前存储在会话中的 ActionForm。 因为最新的更改请求要求我们同时打开多个ActionForm,所以我将ActionForm的配置从会话范围更改为请求范围 struts-config.

此更改破坏了一些在 PageContext 对象中查找 ActionForm 的自定义标记代码。 (而且它可能会破坏我们由于这个错误而无法测试的其他功能。)

代码正在寻找带有 TagUtils.getRealValueFromBean

我已尝试在此调用中调整参数以指定请求范围并尝试查看请求对象的属性,但 ActionForm 不存在! Java JSP 中的代码显示 Request 对象中没有此类属性。 (我听说刷新事件可以创建一个新的 ActionForm,但这里的 Request 对象中没有任何 ActionForm。 然而,在从数据库中检索对象的 Action 底部,ActionForm 存在于 Request 对象中。

我创建了一个带有可在会话或请求范围内配置的 ActionForm 的小型测试应用程序,但从 Request 检索 ActionForm 工作正常!

知道 where/how 追踪 ActionForm 是如何被破坏的吗?

否则如何在保持 scope=session 的同时支持 ActionForm 的多个实例?

您可以尝试以下方法:

假设 scope="session"Foo 作为我的域 class:

public class Foo {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

然后:

  • ActionForm:

    private static Map map = new HashMap();
    
    public Foo getFoo(String page) {
        if (!map.containsKey(page)) {
            map.put(page, new Foo());
        }
        return (Foo) map.get(page);
    }
    
    public void setFoo(String page, Foo foo) {
        map.put(page, foo);
    }
    
  • 输入JSP

    <html:text property="foo(page1).name" />
    

    其中 page1 是任意名称,例如:您当前页面的名称。 foo(page1).name 是 属性 的名称,因此它在发送到服务器时由 Struts 自动填充。

  • 输出JSP

    • With Expression Language (EL):

      ${TestForm.getFoo('page1').name}
      
    • 与Struts:

      <bean:write name="TestForm" property="foo(page1).name" />
      

    其中 TestForm 是我的 ActionForm 的名称(在 struts-config.xml 文件中定义)。