Struts 2 拦截器教程1
2010-01-14 17:29
218 查看
Struts 2 拦截器例题
通过这个例子我们可以了解怎样在执行动作(action)之前或之后调用拦截器。让我们看看下面的图。
当向Struts 2框架传入一个请求时,下面的动作是被循环执行的。
框架首先找到哪个动作(action)类被调用并且查找与动作(action)相关联的拦截器(interceptor)。
框架创建一个动作调用器(ActionInvocation)的实例并调用invoke()方法。这里框架处理控制动作调用器(ActionInvocation)是为了进一步处理请求处理。
动作调用器(ActionInvocation)是动作(action)和关联拦截器(interceptor)的封装体。
动作调用器(ActionInvocation)调用在栈中的第一个拦截器(interceptor)的intercept()方法。我们使用下面的例子说明,这个例子非常的简单,值使用了一个记录log的拦截器(interceptor)。
LoggingInterceptor的intercept()方法代码如下:
正如你所看到的,第一个logMessage()方法被调用并记录log信息。之后调用动作调用器(ActionInvocation)的invoke()方法,最后动作调用器(ActionInvocation)将循环调用栈中的下一个拦截器(interceptor),直到最后一个被调用。
在执行完所有的拦截器(interceptor)之后,动作(action)类将被调用。最后返回字符串并发送给相应的视图(view)。这是正常的运行流程。
但是如果发生错误,那么这个请求处理将被终止。之后的拦截器(interceptor)也不会被调用,动作(action)也不会被执行。如果任何或最终结果发送给用户,那么拦截器(interceptor)将以颠倒的顺序调用来进行后处理。
现在让我们来看一下正常的流程。这个例子里只有一个拦截器(interceptor)在栈中。所以在记录"START_MESSAGE"之后,动作调用器(ActionInvocation)的invoke()方法将被调用,然后动作(action)返回"success"消息,然后再次调用拦截器(interceptor)做后处理,这个时候"FINISH_MESSAGE"被记录并返回结果(result)。基于结果(result)的相应视图(view)将被发送给用户。
使用拦截器(interceptor)的好处:
极其灵活。
动作(action)类更简洁更集中。
代码的可读性和重用性。
测试代码更方便。
可以为每个请求在栈中添加相应的拦截器(interceptor)和自定义动作(action)进程。
让我们来看看下面的例子。在index.jsp页面中我们转向了"TestLogger" URL。
在struts.xml文件中,TestLogger URL被映射到TestLoggerAction类中。
interceptor-ref用来给动作(action)添加拦截器(interceptor)。所有的拦截器(interceptor)都被定义到struts-default.xml文件的struts-default包中。
现在TestLoggerAction类的execute方法将被调用。代码如下:
根据在XML文件中的设置,将被转向success页面。
下面是输出结果:
源代码:下载
源代码 + lib:下载
通过这个例子我们可以了解怎样在执行动作(action)之前或之后调用拦截器。让我们看看下面的图。
当向Struts 2框架传入一个请求时,下面的动作是被循环执行的。
框架首先找到哪个动作(action)类被调用并且查找与动作(action)相关联的拦截器(interceptor)。
框架创建一个动作调用器(ActionInvocation)的实例并调用invoke()方法。这里框架处理控制动作调用器(ActionInvocation)是为了进一步处理请求处理。
动作调用器(ActionInvocation)是动作(action)和关联拦截器(interceptor)的封装体。
动作调用器(ActionInvocation)调用在栈中的第一个拦截器(interceptor)的intercept()方法。我们使用下面的例子说明,这个例子非常的简单,值使用了一个记录log的拦截器(interceptor)。
LoggingInterceptor的intercept()方法代码如下:
public String intercept(ActionInvocation invocation) throws Exception { //预处理 logMessage(invocation, START_MESSAGE); String result = invocation.invoke(); //后处理 logMessage(invocation, FINISH_MESSAGE); return result; }
正如你所看到的,第一个logMessage()方法被调用并记录log信息。之后调用动作调用器(ActionInvocation)的invoke()方法,最后动作调用器(ActionInvocation)将循环调用栈中的下一个拦截器(interceptor),直到最后一个被调用。
在执行完所有的拦截器(interceptor)之后,动作(action)类将被调用。最后返回字符串并发送给相应的视图(view)。这是正常的运行流程。
但是如果发生错误,那么这个请求处理将被终止。之后的拦截器(interceptor)也不会被调用,动作(action)也不会被执行。如果任何或最终结果发送给用户,那么拦截器(interceptor)将以颠倒的顺序调用来进行后处理。
现在让我们来看一下正常的流程。这个例子里只有一个拦截器(interceptor)在栈中。所以在记录"START_MESSAGE"之后,动作调用器(ActionInvocation)的invoke()方法将被调用,然后动作(action)返回"success"消息,然后再次调用拦截器(interceptor)做后处理,这个时候"FINISH_MESSAGE"被记录并返回结果(result)。基于结果(result)的相应视图(view)将被发送给用户。
使用拦截器(interceptor)的好处:
极其灵活。
动作(action)类更简洁更集中。
代码的可读性和重用性。
测试代码更方便。
可以为每个请求在栈中添加相应的拦截器(interceptor)和自定义动作(action)进程。
让我们来看看下面的例子。在index.jsp页面中我们转向了"TestLogger" URL。
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=TestLogger.action">
在struts.xml文件中,TestLogger URL被映射到TestLoggerAction类中。
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="test" extends="struts-default"> <action name="TestLogger" class="vaannila.TestLoggerAction"> <interceptor-ref name="logger" /> <result name="success">/success.jsp</result> </action> </package> </struts>
interceptor-ref用来给动作(action)添加拦截器(interceptor)。所有的拦截器(interceptor)都被定义到struts-default.xml文件的struts-default包中。
现在TestLoggerAction类的execute方法将被调用。代码如下:
package vaannila; public class TestLoggerAction { public String execute() { System.out.println("Inside Action"); return "success"; } }
根据在XML文件中的设置,将被转向success页面。
下面是输出结果:
INFO: Starting execution stack for action //TestLogger Inside Action INFO: Finishing execution stack for action //TestLogger
源代码:下载
源代码 + lib:下载
相关文章推荐
- 拦截器权限控制使用Struts 拦截namespace进行权限控制-java教程
- Struts 2 拦截器教程2
- Struts2.x教程(三) Struts2拦截器
- SSH(Struts2+Spring4+Hibernate4)框架教程之配置篇
- 【ssh】struts文件上传拦截器(单,多文件上传,以及错误信息的返回)
- [原创]java WEB学习笔记65:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) ModelDriven拦截器 paramter 拦截器
- Struts2教程8:拦截器概述
- Struts拦截器使用
- [置顶] 使用struts拦截器+注解实现网络安全要求中的日志审计功能
- Struts1.x教程(二) Struts进阶使用
- Struts2.1.x+Spring2.5.x+Hibernate3.2.x实例教程(2)V0.1
- 利用Struts拦截器限制上传图片的格式和大小
- Struts中拦截器过滤敏感字符
- struts拦截器
- Struts_Interceptor 拦截器
- struts2.1.6教程八、验证机制
- Struts2.x教程(一) Struts2介绍
- 半路杀出程咬金-你的程序是否能做到?Struts 2的拦截器-你手中的程咬金(9)