如果使用的不是struts-default.xml里面缺省的解释器,那么我们需要在web.xml当中对解释器
进行声明,并指定路径等操作,以便在package、action等位置进行使用。具体如下:
<!--在web.xml当中-->
<interceptors>
<interceptor name="autowiring" class="interceptor.ActionAutowiringInterceptor"/>
</interceptors>
使用指定的Interceptor的位置有两个
1.指定action当中引用使用解释器
2.在包内所有action指定使用一个解释器
用法如下(并未实践过)
<!--在action当中使用的时候-->
<action name="my" class="com.fdar.infoq.MyAction" >
<result>view.jsp</result>
<interceptor-ref name="autowiring"/>
</action>
<!--在package当中指定-->
<default-interceptor-ref name="autowiring"/>
<!--把上面这条语句放在package定义以后紧跟就可以了-->
有一点要注意的是:对解释器定义位置的先后顺序以及放置的位置很关键。因为如果想要让
action可以使用解释器,那么必须在使用前给出定义引用位置也就是上述情况1中的语句。
这有点像C语言里面函数声明的味道。
另外,一个package可以缺省的指定,或者指定唯一的解释器。我感觉这个解释器的作用范围
类似与全局变量,而action自己指定的解释器引用可能会覆盖了包中的解释器。这是书中
没有解释的解释器作用范围。我想一个试验就可以证明了。大家可以参考struts2 core。
书中还提到,我们在action中可能遇到的解释器并不是一个。在struts-default.xml中有这样的
定义大家可以参考:
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servlet-config"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
实际上我们在文件中配置了一个叫做解释器栈的一个结构,那么我们引用这些解释器的时候
就无需逐一引用,从而避免造成无法管理的混乱局面。引用方法如下:
<action name="my" class="com.fdar.infoq.MyAction" >
<result>view.jsp</result>
<interceptor-ref name="basicStack"/>
</action>
这里与上面给出的引用单个解释器的形式是一样的。如果在package当中,我们也可以用
<!--在package当中指定-->
<default-interceptor-ref name="basicStack"/>
<!--把上面这条语句放在package定义以后紧跟就可以了-->
的形式完成操作。
这里我有一个疑问,也请大家讨论:
我们是不是可以模块一点,把解释器、解释器栈、解释器配置文件作为逐渐增大的一个模块
在工程里面用.xml文件形式保存,以extends的方式进行引用呢?我没看到相关介绍,大家可以
尝试。当然我有时间也会去尝试的。