对于JSP的Struts中是否存在对活动表单的通用引用?

时间:2010-02-10 22:00:19

标签: java jsp struts

我正在使用struts 1.3.10

在JSP中,我可以从与操作关联的表单中引用对象。所以我可以:

<bean:define id="someObject" name="myCurrentActionForm" property="someObject"/>

我在struts-config.xml中定义了我的表单。

在上面的例子中,“someObject”实际上是在myCurrentActionForm继承的基类中定义的。

但我需要以通用的方式引用“someObject”。

我试过了:

<bean:define id="someObject" name="baseForm" property="someObject"/>

使用对基本表单类的引用,但是出现无法找到该属性的错误。

我需要在一个通用的JSP片段中定义这个bean。有没有办法以通用的方式引用与动作相关的表单?

TIA

2 个答案:

答案 0 :(得分:1)

我是这样做的。

<jsp:useBean id="baseForm" class="web.common.BaseForm" scope="application"/>

这会在我可以使用的应用程序范围内创建一个实例。

答案 1 :(得分:1)

如果您使用:

<jsp:useBean id="baseForm" class="web.common.BaseForm" scope="application"/>

以后再使用:

<bean:define id="someObject" name="baseForm" property="someObject"/>
你不应该有问题。 <jsp:useBean>将在应用程序范围内创建对象(如果该对象不存在),<bean:define>在检索它时应该没有问题,因为它pageContext.findAttribute(...)搜索所有范围。

如果你在“任何范围内”找到“找不到bean:”baseForm“,这意味着当你拨打<bean:define>时,表单不存在(可能你没有先调用<jsp:useBean>?)

另一方面,应用程序范围不仅意味着所有JSP文件都可以访问bean,而且所有客户端都将共享同一个对象。如果该bean具有您在用户之间共享的状态,则最终可能会遇到问题。一个用户可以访问另一个用户的机密数据。

编辑:要明白这一点......您只想在JSP文件中以通用方式引用当前的操作表单(无论是什么),而不依赖于您的名称在struts-config(myCurrentActionForm,someOtherCurrentActionForm等)中指定,只使用像baseForm这样的限定符?

如果是,那么您可以自己创建一个父Action类,所有其他操作类都将扩展。在此父类的execute(mapping, form, request, response)方法中,您只需在所需范围内放置对form的引用(您可以从mapping对象中提取确切的范围,或者只将其存储在任何范围内你想要的,使用baseForm名称 - 我会远离应用范围)。

然后,您可以使用Template Method Pattern来调用子类操作execute方法,或者您可以求助于调用父execute方法的子类execute方法来执行的事情。

一旦进入JSP,您就可以使用baseForm访问表单。标签不关心范围是什么,因为它们将搜索直到找到对象为止。如果您坚持使用web.common.BaseForm中的属性,他们甚至不会关心它是一个子类实例。