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文件中配置拦截器,注意需要配置默认拦截器。
拦截器(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文件中配置拦截器,注意需要配置默认拦截器。
相关文章推荐
- Struts2自定义拦截器实例—登陆权限验证
- Struts2 Day 05 : 运行流程、自定义拦截器、上传下载、表单重复提交、输入验证
- 修改指定拦截器的参数(Struts2)
- Struts2拦截器之ModelDrivenInterceptor
- struts2 拦截器和actioninvocation、PreResultListener
- Struts2自定义拦截器实例—登陆权限验证
- JavaWeb框架_Struts2_(三)---->Struts2的拦截器
- struts2拦截器
- Struts2自定义拦截器
- struts2 拦截器的配置
- Struts2中拦截器与过滤器的执行顺序
- Struts2中拦截器的简单实现
- Struts2第一个拦截器
- Struts2拦截器
- Struts2 在登录拦截器中对ajax请求的处理
- struts2中的拦截器
- Struts2拦截器实现安全验证
- struts2 18拦截器详解(十三)
- Struts2自定义拦截器
- struts2 18拦截器详解(十六)