您的位置:首页 > 编程语言 > Java开发

struts2的拦截器(上)

2012-07-11 00:58 295 查看
struts2 之拦截器

拦截器(interceptor)是框架的核心组成部分。struts2的很多功能都是构建在拦截器基础之上的,如文件的上传下载,国际化,转换器和数据校验等。

配置拦截器

在struts.xml中,使用<interceptor>元素指定拦截类与拦截器名即可。语法格式:<interceptor name="名" class="拦截器对应的java类" />
name属性为拦截器指定一个名称,class属性指定拦截器类所在的路径。

拦截器栈
为了能在多个动作中方便的引用一个或者几个拦截器,可以使用拦截器栈将这些拦截器作为一个整体来引用。语法格式:
<interceptors>
<interceptor-stack name="栈名">
<interceptor-ref name="拦截器名" />
</interceptor-stack>
</interceptors>
注:在struts2核心包struts2-core-x.x.x.x.jar中,存在一个struts-default.xml文件,若己经配置了许多拦截器栈。

例如:
<interceptors>
<interceptor-stack name="mystack">
<interceptor-ref name="timer" />
<interceptor-ref name="logger" />
</interceptor-stack>
</interceptors>
<action name="first" class="action.FirstAction" >
<param name="who">xiaoxue</param>
<interceptor-ref name="mystack"/>
</action>

可在一个拦截器栈中包含另一个拦截器栈。

为拦截器指定参数,两种形式:
定义拦截器时使用,使用<interceptor>元素实现。
例:
<interceptor name="名" class="实现的类">
<param name="参数名">参数值</param>
</interceptor>

使用拦截器时指定参数,使用<interceptor-ref>。
例:
<interceptor-ref name="defaultStack">
<param name="excludeMethods">default</param>
<interceptor-ref>

使用拦截器
在struts.xml文件中配置拦截器后,就可以在配置Action时使用这个拦截器,使用时的配置元素是<interceptor-ref>,拦截行为将在Action的execute()方法被执行之前执行。

例:
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="拦截器a" class="对应的java类" />
<interceptor name="拦截器b" class="对应的java类" />
</interceptors>
<!-- 在Action中使用拦截器 -->
<action name="public" class="action.PublishAction">
<result name="success">/success.jsp</result>
<interceptor-ref name="拦截器a"/>
<interceptor-ref name="拦截器b />
</action>
<action name="checkLogin" class="action.DefaultAction">
<result name="success">/success.jsp</result>
<interceptor-ref name="拦截器a" />
<interceptor-ref name="defaultStack" />
</action>
配置语法与在拦截器栈中引用拦截器是一样的。defaultStack是struts2框架的默认拦截器栈,如果定义包时使用如下形式:
<package name="default" extends="struts-default">
这样如果在子包中没有为Action指定拦截器,defaultStack拦截器栈将对Action执行拦截。

自定义默认拦截器
自定义拦截器需要使用<default-interceptor-ref>元素,它是<package>的子元素,它的name属性必须是己存在的拦截器或者拦截器栈名字。
例:
<struts>
<package name="testInterceptor" extends="struts-default">
<interceptors>
<interceptor name="拦截器a" class="对应的java类" />
</interceptors>
<default-interceptor-ref name="拦截器a" />

<action name="success">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>

如果需要将多个拦截器配置为默认拦截器,可以将这些拦截器定义为一个拦截器栈。

也可以为自定义的默认拦截器指定参数,例如:
<struts>
<package name="testInterceptor" extends="struts-default">
<interceptors>
<interceptor name="拦截器a" class="对应的java类" />
</interceptors>
<default-interceptor-ref name="拦截器a" />
<param name="参数名">参数值</param>
</default-interceptor-ref>
<action name="success">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>

通过在<package>元素下为包定义自定义拦截器,可以实现为此包下所有Action同时配置相同的拦截器。

与拦截器相关的配置元素
<interceptors>, <interceptor>, <interceptor-stack>, <interceptor-ref>, <param>, <default-interceptor-ref>

使用拦截器注解
struts2在com.opensymphony.xwork2.intercepor.annotations包中定义了3个拦截器注解类型,从而可以直接通过注解的方式来指定在action执行之前和之后需要调用的方法。

Before
标注一个Action方法,该方法将在Action的处理方法(如execute())执行之前被调用。如果标注的方法有返回值,并且不为null,那么这个这个返回值将作为Action的结果代码。

After
标注一个Action方法,该方法将在Action的处理方法执行之后被调用。如果标注的方法有返回值,它将被忽略。

BeforeResult
标注一个Action方法,该方法将在Action的处理方法执行之后,在Result执行之前被调用。如果有返回值将被忽略。

由于一个注解可以标注多个方法,方法执行的先后顺序可以通过priority参数来指定,该参数对3种类型注解都起作用。

如果要使用拦截器注解,还需要配置AnnotationWorkflowInterceptor拦截器。开发者需要自己在struts.xml中实现。
例:
<interceptors>
<interceptor name="annotationInterceptor" calss="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>
<interceptor-stack name="annoationStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="annotationInterceptor"/>
</interceptor-stack>
</interceptors>
实例见<struts2完全学习手册》一书的page 136页。

自定义拦截器
定义一个拦截器时,需要将该类实现Interceptor接口,或者继承抽象拦截器类AbstactInterceptor。

interceptor接口声明格式如下:
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}

AbstractInterceptor类
格式如下:
public abstract class AbstactInterceptor implements Interceptor {
public void init();
public void destroy();
public abstract String intercept(ActionInvocation invocation) throws Exception;
}

例:见书page 138

使用自定义拦截器
首先在struts.xml文件中,对自定义拦截器进行配置。然后在配置Action时,使用<interceptor-ref>元素引入。
书page 140 大例子
首先,写注册页面register.jsp和处理它的请求的类文件RegisterAction.java,以及返回的逻辑视图显示文件myRegister.jsp。
其次,创建拦截器类RegisterInterceptor.java。这个类要继承AbstractInterceptor抽象类,并实现 intercept方法。
最后,在struts.xml文件中配置拦截器,注意需要配置默认拦截器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息