我正在使用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
答案 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
中的属性,他们甚至不会关心它是一个子类实例。