第四章 Adding workflow with interceptor(下)
16. 拦截器只能通过XML文件来配置,不支持Java annotations方式。
17. 在struts.xml类型的文件声明中,interceptors包含一个package中所有的拦截器和拦截器栈
例如struts-default.xml文件中:
<interceptors>
……
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
……
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
……
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
……
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
interceptor用于描述一个拦截器,仅仅是将拦截器名同class对应起来,并不和任何action相结合
interceptor-stack和interceptorref用于定义拦截器栈
default-interceptor-ref用于指定一个package默认的拦截器(栈)
18. 通常情况下,自己定义的actions所在的package通常继承自struts-default.xml,因此也会默认继承defaultStack拦截器栈
可以根据自己的需要修改action的参数,加入需要的拦截器如下所示:
<action name="MyAction" class="org.actions.myactions.MyAction">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<interceptor-ref name="defaultStack"/>
<result>Success.jsp</result>
</action>
当然timer和logger拦截器并没有做什么工作,一般需要在最后加上defaultStack拦截器栈或者自己定义的其他拦截器栈,例如缺少了params拦截器,request中的数据都无法保存到action中,更不要说其他工作了
19. 设置拦截器的参数,例如defaultStack拦截器栈中的workflow拦截器
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
覆盖拦截器的参数,例如覆盖defaultStack拦截器栈中的workflow拦截器的参数
<action name="YourAction" class="org.actions.youractions.YourAction">
<interceptor-ref name="defaultStack">
<param name="workflow.excludeMethods">doSomething</param>
</interceptor-ref>
<result>Success.jsp</result>
</action>
20. 实现自己的拦截器通常需要继承AbstractInterceptor或者实现Interceptor
21. SessionAware接口
Actions that want access to the user's HTTP session should implement this interface.
接口包含的方法
/**
* Sets the Map of session attributes in the implementing class.
* @param session a Map of HTTP session attribute name/value pairs.
*/
public void setSession(Map session);
22. ActionInvocation的一个重要方法
Map session = actionInvocation.getInvocationContext().getSession();