首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Struts2(九):开发自己的Struts2拦截器(编码与配置)

2012-10-28 
Struts2(9):开发自己的Struts2拦截器(编码与配置)???? 要开发自己的Struts2拦截器类,需要实现Interceptor

Struts2(9):开发自己的Struts2拦截器(编码与配置)

???? 要开发自己的Struts2拦截器类,需要实现Interceptor接口,并实现相应的三个方法 。或继承AbstractInterceptor类,只实现doIntercept方法。这两个类都在xwork.jar包中,路径为com.opensymphony.xwork2.interceptor。

?

拦截器类MyInterceptor

public class MyInterceptor implements Interceptor {public void destroy() {System.out.println("destroy...");}public void init() {System.out.println("init...");}public String intercept(ActionInvocation invocation) throws Exception {System.out.println("my interceptor...");String result = invocation.invoke();return result;}}

?init()方法会在服务器启动时自动执行,只会执行一次。

?

写好自己的拦截器类后,在struts2的配置文件struts.xml文件中也要做相应的配置,在package那层下,与其它action同级

<interceptors> <interceptor name="myInterceptor" name="code"><action name="register" name="code"><interceptor-ref name="defaultStack"></interceptor-ref>

?

默认的拦截器在struts2-core.jar包的根目录下,名称为struts-default.xml

?

我们在定义一个struts.xml文件时,都会声明此配置文件继承struts-default,如下,只有在使用了自定义的拦截器后,action才不会再调用默认的拦截器,所以需要手工将其再配置一次。

<package name="struts2" extends="struts-default">

?

2,在拦截器中定义变量hello,在配置文件中可定义此变更的值,可以声明拦截器处赋值,也可在使用的action处赋值,如
在声明处

<interceptor name="myInterceptor" name="code"><action name="register" name="code"><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack>

?拦截器栈采用的是先进后出的操作顺序,即在执行目标对象方法前,先按栈中拦截器的顺序执行拦截器中的方法,再执行目标对象的方法,执行完再按逆序执行栈中的方法。

interceptor1
interceptor2
execute(目标对象的方法)
interceptor2
interceptor1

?

4,改变默认拦截器,如下配置,如下可以声明一个默认拦截器,它与action平级

<default-interceptor-ref name="myStack"></default-interceptor-ref>

如果一个action中没有配置一个自定义地拦截器,则它会默认使用默认拦截器。注意:只能有一个默认的拦截器

?

5,方法过滤拦截器:需要继承MethodFilterInterceptor并实现doIntercept方法

自定义的拦截器会拦截action中的所有方法(除了javabean方法,即get,set方法)

public class MyMethodInterceptor extends MethodFilterInterceptor {protected String doIntercept(ActionInvocation invocation) throws Exception {System.out.println("myMethodFilterInterceptor....");return invocation.invoke();}

?

在配置文件中声明此拦截器。

<interceptor name="myMethodInterceptor" name="code"><action name="register" class="com.test.action.RegisterAction"><result name="success">/success.jsp</result><result name="input">/register.jsp</result><interceptor-ref name="myMethodInterceptor"><param name="includeMethods">test1,execute</param> <!-- 包含,--><param name="excludeMethods">test2,execute</param> <!-- 不包含,当一个方法在includeMethods和excludeMethods都有声明时,则includeMethods优先--></interceptor-ref><interceptor-ref name="myStack"></interceptor-ref></action>

?

热点排行