struts2执行流程介绍
1、客户端向Servlet容器(如Tomcat)提交一个请求
2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等)
3、核心控制器被调用,询问ActionMapper来决定请求是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy (备注:JSP请求无需调用Action)
5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、 ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器
8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果
9、拦截器被再次执行
10、过滤器被再次执行
核心接口和类
ActionMapper
根据请求的URI查找是否存在对应Action调用
ActionMapping
保存调用Action的映射信息,如namespace、name等
ActionProxy
在XWork和真正的Action之间充当代理
ActionInvocation
表示Action的执行状态,保存拦截器、Action实例
Interceptor
可以在请求处理之前或者之后执行的Struts 2组件
Struts 2绝大多数功能通过拦截器完成
根据请求的URI查找是否存在对应Action调用
ActionMapping
保存调用Action的映射信息,如namespace、name等
ActionProxy
在XWork和真正的Action之间充当代理
ActionInvocation
表示Action的执行状态,保存拦截器、Action实例
Interceptor
可以在请求处理之前或者之后执行的Struts 2组件
Struts 2绝大多数功能通过拦截器完成
拦截器
Struts 2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能
拦截器方法在Action执行之前或者之后执行
拦截器栈
从结构上看,拦截器栈相当于多个拦截器的组合
在功能上看,拦截器栈也是拦截器
拦截器与过滤器原理很相似
拦截器方法在Action执行之前或者之后执行
拦截器栈
从结构上看,拦截器栈相当于多个拦截器的组合
在功能上看,拦截器栈也是拦截器
拦截器与过滤器原理很相似
拦截器的执行过程是一个递归的过程 :
三阶段执行周期:
1、做一些Action执行前的预处理
2、将控制交给后续拦截器或返回结果字符串
3、做一些Action执行后的处理
1、做一些Action执行前的预处理
2、将控制交给后续拦截器或返回结果字符串
3、做一些Action执行后的处理
自带拦截器:
Params拦截器
负责将请求参数设置为Action属性
servletConfig拦截器
将源于Servlet API的各种对象注入到Action
fileUpload拦截器
对文件上传提供支持
exception拦截器
捕获异常,并且将异常映射到用户自定义的错误页面
validation拦截器
调用验证框架进行数据验证
workflow拦截器
调用Action类的validate(),执行编码验证
负责将请求参数设置为Action属性
servletConfig拦截器
将源于Servlet API的各种对象注入到Action
fileUpload拦截器
对文件上传提供支持
exception拦截器
捕获异常,并且将异常映射到用户自定义的错误页面
validation拦截器
调用验证框架进行数据验证
workflow拦截器
调用Action类的validate(),执行编码验证
Struts 2默认拦截器栈
struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器
<default-interceptor-ref name="defaultStack"/>
defaultStack提供了所有核心的Struts 2功能,满足绝大多数应用程序的需要
只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器
在struts-default.xml中默认的拦截器栈中包含如下拦截器
<default-interceptor-ref name="defaultStack"/>
defaultStack提供了所有核心的Struts 2功能,满足绝大多数应用程序的需要
只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器
在struts-default.xml中默认的拦截器栈中包含如下拦截器
自定义拦截器示例:
public class MyTimerInterceptor extends AbstractInterceptor{
public String intercept(ActionInvocation invocation)
throws Exception {
//预处理工作
long startTime = System.currentTimeMillis();
//执行后续拦截器或Action
String result = invocation.invoke();
//后续处理工作
long execTime = System.currentTimeMillis() - startTime;
System.out.println("The interval time is "+execTime+" ms");
//返回结果字符串
return result;
}
}
</pre><pre name="code" class="java">
配置拦截器:
<package name="packName" extends="struts-default" namespace="/manage">
<interceptors>
<!-- 定义拦截器 -->
<interceptor name="interceptorName" class="interceptorClass" />
<!-- 定义拦截器栈 -->
<interceptor-stack name="interceptorStackName">
<!--指定引用的拦截器-->
<interceptor-ref name="interceptorName|interceptorStackName" />
</interceptor-stack>
</interceptors>
<!--定义默认的拦截器引用-->
<default-interceptor-ref name="interceptorName|interceptorStackName" />
<action name="actionName" class="actionClass">
<!—为Action指定拦截器引用-->
<interceptor-ref name="interceptorName|interceptorStackName" />
<!--省略其他配置-->
</action>
</package>
实现Interceptor接口
void init():初始化拦截器所需资源
void destroy():释放在init()中分配的资源
String intercept(ActionInvocation ai) throws Exception
实现拦截器功能
利用ActionInvocation参数获取Action状态
返回结果码(result)字符串
继承AbstractInterceptor类
提供了init()和destroy()方法的空实现
只需要实现intercept方法即可
推荐使用