我已经接管了一个已有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实例?
答案 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" />
TestForm
是ActionForm
的名称(在 struts-config.xml
文件中定义)。