Struts ActionForm从请求范围中丢失

时间:2015-01-18 01:46:28

标签: java struts actionform

我已经接管了一个已有10年历史的Struts 1.2应用程序的维护。 (它过于复杂和专有,无法发布。)

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

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

代码正在寻找ActionForm   TagUtils.getRealValueFromBean

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

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

知道在哪里/如何追踪ActionForm如何被破坏?

或者如何在保留scope=session的同时支持多个ActionForm实例?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

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

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

    • E xpression L anguage(EL):

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

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

    TestFormActionForm的名称(在 struts-config.xml 文件中定义)。