struts2总结之二

Struts2工作原理:
Struts2基本工作过程
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action, StrutsPrepareAndExecuteFilter 把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个Action Invocation的实例。
7、Action Invocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
Struts2拦截器介绍:使用拦截器可以实现横切功能并使这些实现相对action甚至Struts2框架保持独立。
可以实现和使用自己所需的特性且不用修改框架的底层代码。
使用拦截器可以达到以下目的:
在调用Action之前,提供预处理逻辑
与Action进行交互,提供执行信息,比如设置请求中的参数
在调用Action之后,提供后处理逻辑
修改返回的结果,进而修改呈现给用户的内容
捕获异常从而替换可执行的处理过程或返回一个不同结果
配置一个内置的timer拦截器
获取执行某个Action组件所耗费的时间,以便做一个粗略的性能调试。
在struts.xml中的某个Action组件的配置中添加<interceptor-ref>标签
比如:
<action name="helloworld" class="demo.web.HelloWorldAction">
<interceptor-ref name="timer" />
<result>/success.jsp</result>
</action>
说明:<interceptor-ref>的name属性为拦截器的别名,这里引用的是Struts2的内置的,具体地在struts-default.xml的struts-default包中定义有
如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“mystack”/>把拦截器定义为默认拦截器。
注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。


具体实例如下:
在struts2.xml文件中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="csdn" extends="struts-default" namespace="/csdn">

<!-- 声明自定义拦截器 -->
<interceptors>
<interceptor name="myTimer" class="cn.csdn.strut2.interceptors.MyDateInterceptor"/>
<!-- 自己定义的拦截器栈 -->
<interceptor-stack name="mystack">
<!-- 使用struts2自带拦截器-->
<interceptor-ref name="timer"/>
<!-- 使用自定义的拦截器 -->
<interceptor-ref name="myTimer"/>
<!-- 引用struts2中默认的拦截器栈 -->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>

<!-- 使用自己定义的拦截器栈作为默认的拦截器栈 -->
<default-interceptor-ref name="mystack"/>
<!-- 全局结果集 -->
<global-results>
<result name="input">/index.jsp</result>
</global-results>

<!-- action -->
<action name="upload" class="cn.csdn.struts2.action.UserAction" method="execute">
<!-- 使用struts2自带拦截器
<interceptor-ref name="timer"/>
-->
<!-- 使用自定义的拦截器
<interceptor-ref name="myTimer"/>
-->
<result>/index.jsp</result>
</action>
<!-- action -->
<action name="uploads" class="cn.csdn.struts2.action.UserAction" method="execute">
<!-- 自定义拦截器栈的引用
<interceptor-ref name="mystack"/>
-->
<result>/index.jsp</result>
</action>
<!-- action -->
<action name="uploadss" class="cn.csdn.struts2.action.UserAction" method="execute">
<result>/index.jsp</result>
</action>
</package>
</struts>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值