struts2拦截器的使用(二)
来源:互联网 发布:php图片投票系统源码 编辑:程序博客网 时间:2024/06/09 21:38
在struts2中的拦截器的基础上进行修改,以实现Interceptor接口的方式创建一个新的拦截器,如下所示:
- public class MyInterceptor implements Interceptor {
- @Override
- public void destroy() {
- }
- @Override
- public void init() {
- }
- @Override
- public String intercept(ActionInvocation invocation)
- throws Exception {
- System.out.println("开始拦截");
- invocation.invoke();
- System.out.println("结束拦截");
- return "success";
- }
- }
public class MyInterceptor implements Interceptor {@Overridepublic void destroy() {}@Overridepublic void init() {}@Overridepublic String intercept(ActionInvocation invocation)throws Exception {System.out.println("开始拦截");invocation.invoke();System.out.println("结束拦截");return "success";}}
方式二、继承AbstractInterceptor抽象类
代码如下所示:
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class MyAbstractInterceptor extends AbstractInterceptor {
- @Override
- public String intercept(ActionInvocation invocation)
- throws Exception {
- System.out.println("Abs开始拦截");
- String result = invocation.invoke();
- System.out.println("Abs结束拦截");
- return result;
- }
- }
import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class MyAbstractInterceptor extends AbstractInterceptor {@Overridepublic String intercept(ActionInvocation invocation)throws Exception {System.out.println("Abs开始拦截");String result = invocation.invoke();System.out.println("Abs结束拦截");return result;}}
AbstractInterceptor的源代码如下所示:
- public abstract class AbstractInterceptor
- implements Interceptor
- {
- public void init()
- {
- }
- public void destroy()
- {
- }
- public abstract String intercept(ActionInvocation paramActionInvocation)
- throws Exception;
- }
public abstract class AbstractInterceptor implements Interceptor{ public void init() { } public void destroy() { } public abstract String intercept(ActionInvocation paramActionInvocation) throws Exception;}
方式三、继承MethodFilterInteceptor类
- public class MyMethodFilterInterceptor extends MethodFilterInterceptor {
- @Override
- protected String doIntercept(ActionInvocation invocation)
- throws Exception {
- System.out.println("method开始拦截");
- String result=invocation.invoke();
- System.out.println("method结束拦截");
- return result;
- }
- }
public class MyMethodFilterInterceptor extends MethodFilterInterceptor {@Overrideprotected String doIntercept(ActionInvocation invocation)throws Exception {System.out.println("method开始拦截");String result=invocation.invoke();System.out.println("method结束拦截");return result;}}
配置文件如下所示:
- <package name="myDemo" namespace="/demo" extends="struts-default">
- <interceptors>
- <interceptor name="myInterceptor" class="demo.action.MyInterceptor" />
- <interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />
- <interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />
- </interceptors>
- <action name="login" class="demo.login.action.LoginAction">
- <result name="success">/WEB-INF/jsp/success.jsp</result>
- <interceptor-ref name="myInterceptor"></interceptor-ref>
- <interceptor-ref name="absInterceptor" />
- <interceptor-ref name="methodInterceptor" />
- </action>
- </package>
<package name="myDemo" namespace="/demo" extends="struts-default"><interceptors><interceptor name="myInterceptor" class="demo.action.MyInterceptor" /><interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" /><interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" /></interceptors><action name="login" class="demo.login.action.LoginAction"><result name="success">/WEB-INF/jsp/success.jsp</result><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="absInterceptor" /><interceptor-ref name="methodInterceptor" /></action></package>
或者为
- <package name="myDemo" namespace="/demo" extends="struts-default">
- <interceptors>
- <interceptor name="myInterceptor" class="demo.action.MyInterceptor" />
- <interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />
- <interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />
- </interceptors>
- <interceptor-stack name="myInterceptors">
- <interceptor-ref name="myInterceptor" />
- <interceptor-ref name="absInterceptor" />
- <interceptor-ref name="methodInterceptor" />
- </interceptor-stack>
- <action name="login" class="demo.login.action.LoginAction">
- <result name="success">/WEB-INF/jsp/success.jsp</result>
- <interceptor-ref name="myInterceptors" />
- </action>
- </package>
<package name="myDemo" namespace="/demo" extends="struts-default"><interceptors><interceptor name="myInterceptor" class="demo.action.MyInterceptor" /><interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" /><interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" /></interceptors><interceptor-stack name="myInterceptors"><interceptor-ref name="myInterceptor" /><interceptor-ref name="absInterceptor" /><interceptor-ref name="methodInterceptor" /></interceptor-stack><action name="login" class="demo.login.action.LoginAction"><result name="success">/WEB-INF/jsp/success.jsp</result><interceptor-ref name="myInterceptors" /></action></package>
分析:当配置到此,实质便为LoginAction配置了三个拦截器,当我们点击登录时会在控制台打印出如下语句:
开始拦截
Abs开始拦截
method开始拦截
--先执行拦截器,再执行此Action
method结束拦截
Abs结束拦截
结束拦截
其实当我们点击登录时,本来是要访问LoginAction,最后会把LoginAction的执行结果传递给访问者。但是当我们配置了拦截器时,当我们去访问Action时,会首先被拦截,随后拦截器执行一些操作后才会继续把请求传递下去。下面作图说明拦截流程:
结合现实理解:比如我们要去某楼层找某人(LoginAction)取一个资源(LoginAction处理后返回的结果,这里表现为success.jsp),(1)进楼层时会被大门保安拦截检查(第一个拦截器:MyInterceptor拦截器),(2)检查通过后再进电梯时会被电梯保安员检查(第二个拦截器:MyAbstractInterceptor拦截器),(3)检查通过后再上到某楼层会被楼层保安员检查(第三个拦截器:MethodAction拦截器
),(4)检查通过后会找到某个(LoginAction),并与某个交谈(LoginAction处理),随后某个人和我们会带着请求的资源出去,(5)出去时,会依次被楼层,电梯,大门保安员检查,最终检查通过。某个人把资源给我们(实质就是返回请求资源给客户端)。 其实拦截器的执行流程和过滤器差不多,所以我们不防用过滤器的眼光来看这些拦截器。
注意:我们在为LoginAction配置拦截器时,都没使用默认的拦截器,是原因这里的测试可以不用,但是以后在我们使用自定义的拦截器是,一定要加上默认的拦截器,否则会导致许多不可预知的结果。
补充:从上面的图并结合代码,我们可以看出拦截器的核心过程应该是ActionInvocation对这些拦截器回调处理,下面我们我们作图分析ActionInvocation的实现过程:
上面分别使用了三种方式来创建自定义的拦截器,第一种方式是最原始的实现方式,第二种方式的好处是我们可以不必重写所有的方法,较常用。第三种方式进行了扩展.
- struts2拦截器的使用(二)
- Struts2拦截器的使用
- Struts2拦截器的使用
- struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2的拦截器使用
- struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- STRUTS2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- IOS开发问题解决之限制UITextField输入特定位数小数时,Done按钮失效
- 神九要升天了!!
- 多网卡FTP测试,绑定本地IP地址
- try-catch-finally-return执行路径总结
- PHP 5.3.1 安装包 VC9 VC6 区别是什么?
- struts2拦截器的使用(二)
- 有关专业的碎碎念
- Linux输入文件名从FTP 指定目录下载 文件
- 常用的一些代码块
- 用协议分析工具学习TCP/IP
- 波特率自适应技术在DSP5402上的应用之C++测试程序
- 解决poi导出EXCEL报表之后,金额不能自动求和的问题
- 指令系统
- vs2008每日提示