Struts2 中拦截器和Action的调用关系
来源:互联网 发布:python 判断奇数偶数 编辑:程序博客网 时间:2024/05/16 07:04
所谓的拦截器就是指实现了Interceptor接口的类,该接口中定义了三个方法:init(),destroy(),intercept()。init()用于在服务器启动的时候,初始化这个拦截器。destroy()用于清理分配给拦截器的资源,intercept()是用来起拦截作用的,这个方法还有一个ActionInvocation类型的参数invocation,并且返回一个字符串。ActionInvocation类中有一个方法,是invoke(),这个方法很重要,它的作用是首先判断一下有没有其他的拦截器了,如果有,则继续进入下一个拦截器,如果没有那么就进入Action中执行业务逻辑。intercept()方法的执行过程也很特殊,在invoke()函数之前的代码先执行,执行到invoke()时,判断一下,进入下一个拦截器,或是进行Action的业务处理,等到执行完所有请求转发的Action时,会再回到intercept()方法,继续执行invoke()后面的内容。
注意上面红颜色的部分,为什么是执行完所有的请求转发的Action呢?这是因为执行完当前的Action,可能会请求转发或是重定向到另一个Action中或是结果页面,若是重定向的话,那么就不是在一个请求过程中了,就会重新发一次请求,请求另一个Action,因为一个拦截器只会对一个特定的Action起作用,所以重定向,就完全是另一次请求过程了。然而在拦截器中,若是重定向到另一个Action的话,那么当前的Action就算完成了它的业务逻辑,就会返回执行invoke()方法之后的内容,然后,再进行另一次请求过程。如果是请求转发的话,那么Action之间是在一个请求过程中,等到所有的请求转发的Action执行完之后,才会去执行invoke()后面的内容。
下面,举两个例子对比一下:
有一个jsp页面,两个Action:Action1和Action2
第一次:Action1和Action2之间是请求转发关系
第二次:Action1和Action2之间是重定向关系
- Login.jsp:
- <form action="/struts2/test/action1" method="post">
- 姓名:<input type="text" name="username"/><br/>
- 密码:<input type="password" name="password"/><br/>
- <input type="submit" value="提交"/>
- </form>
- 拦截器:MyInterceptor.java:
- package com.suo.interceptor;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.Interceptor;
- public class MyInterceptor implements Interceptor {
- @Override
- public void destroy() {
- // TODO Auto-generated method stub
- System.out.println("destroy invoke !");
- }
- @Override
- public void init() {
- // TODO Auto-generated method stub
- System.out.println("init invoke !");
- }
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- System.out.println("before invoke !");
- String result=invocation.invoke();
- System.out.println("after invoke !");
- return result;
- }
- }
- Action1.java:
- package com.suo.actions;
- import com.opensymphony.xwork2.ActionSupport;
- public class Action1 extends ActionSupport {
- private String username;
- private String password;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String execute()
- {
- System.out.println("action1 invoke !");
- return SUCCESS;
- }
- }
- Action2.java:
- package com.suo.actions;
- import com.opensymphony.xwork2.ActionSupport;
- public class Action2 extends ActionSupport {
- private String username;
- private String password;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String execute()
- {
- System.out.println("action2 invoke !");
- return SUCCESS;
- }
- }
- <interceptors>
- <interceptor name="myInterceptor" class="com.suo.interceptor.MyInterceptor"></interceptor>
- </interceptors>
- <action name="action1" class="com.suo.actions.Action1">
- <result name="success" type="chain"><!--注意这里是请求转发类型-->
- <param name="actionName">action2</param>
- </result>
- <interceptor-ref name="myInterceptor"></interceptor-ref><!--这里是引用自定义的拦截器-->
- <interceptor-ref name="defaultStack"></interceptor-ref>
- <!--注意,每一个action都有一个默认的拦截器,如果指定了自定义的拦截器,那么默认的拦截器就失去作用了,所以这里要再加上默认的拦截器-->
- </action>
- <action name="action2" class="com.suo.actions.Action2">
- <result name="success">/WEB-INF/result/action.jsp</result>
- </action>
- before invoke !
- action1 invoke !
- action2 invoke !
- after invoke !
- before invoke !
- action1 invoke !
- after invoke !
- action2 invoke !
- <interceptors>
- <interceptor name="myInterceptor" class="com.suo.interceptor.MyInterceptor">
- <param name="suo">piao</param><!--传递一个参数-->
- </interceptor>
- </interceptors>
- Struts2 中拦截器和Action的调用关系
- Struts2 中拦截器和Action的调用关系
- Struts2 中拦截器和Action的调用关系
- struts2中拦截器的全局拦截和自定义拦截
- struts2拦截器中 如果获取当前请求action 和请求的方法
- Struts2中Action标签与workflow拦截器的冲突。
- struts2 中package的默认拦截器不能拦截某些action的原因
- struts2 拦截器的调用
- Struts2拦截器获取调用步骤及Action类
- struts2拦截器实现Action调用后逻辑处理
- Struts2—拦截器之计算action调用时间
- struts2拦截器的方法过滤功能在Action动态方法调用中的应用
- struts2 中action的动态方法调用
- Struts2中Action的动态调用方法
- Struts2中调用Action的方法
- Struts2中Action类的方法调用
- Struts2中Action的动态调用方法
- Struts2中Action的动态方法调用
- MySQL分页存储过程及其调用
- poj 3259 Wormholes
- Red Hat配置镜像media为yum源
- 终于写下一行伟大的代码
- 【Env】Solaris10下安装gcc-5.1.0
- Struts2 中拦截器和Action的调用关系
- 指针的危险
- 2440裸机开发
- 【Caffe代码解析】SyncedMemory
- 第一章第四题
- 腾讯互联网终极报告小结
- 求方程cos(x)-x=0的一个实根
- [每天读书半小时] Java RESTful Web Service实战
- 【Unity3d学习笔记】基础引擎操作