struts2的拦截器介绍(Interceptors)

Struts2框架内部的工作机制是什么呢?在这里简要说说struts2的拦截器,即一系列的java类。

我们知道,在一个jsp页面中,我们可以指定一个URL链接对应的处理action,当我们点击这个链接的时候,struts2框架会将该请求提交给对应(该关系通过struts2的配置文件struts.xml或者struts2注解来配置)的action处理,处理完后,根据不同的处理结果返回不用的页面。

struts2框架让我们不用关注这些实现细节,以便专注于业务逻辑的实现或者算法的实现。其实,在action的execute方法调用之前,struts2框架会做很多工作:

1. 处理产生的任何异常

2. 将请求的String类型的参数转换成对应的class中的变量(通过名字来映射)。

3. 调用validate方法进行校验,或者通过XML文件来校验。

...

在execute方法执行之后,又会做如下工作:

1. 处理产生的任何异常

2. 将类中的变量转换成String类型,以便在界面中正确的显示。

3. 根据execute的返回值,决定返回哪个页面。

...

上面的这些工作都是由struts2框架自动执行的。它们是由谁来实现完成的呢?答案是:拦截器(Interceptors)。

拦截器是标准的Java类,它们包含在struts2的核心jar中,这些拦截器的执行是按照一定的顺序的。

比如在我们的struts.xml配置文件中,会有这样一句:

<package name="basicstruts2" extends="struts-default">

这是什么意思呢?这里定义了一个package,在该package下的所有action,都会在运行action前和运行action后,执行struts-default拦截器堆栈(通过extends属性指定)。


有时候,struts2默认的拦截器堆栈并不是我们需要的,我们想用其他的一些拦截器,比如logger拦截器和timer拦截器。这个时候我们可以:

<action name="register" class="org.apache.struts.register.action.Register" method="execute">
	<interceptor-ref name="timer" />
	<interceptor-ref name="logger" />
	<interceptor-ref name="defaultStack">
		<param name="exception.logEnabled">true</param>
		<param name="exception.logLevel">ERROR</param>
	</interceptor-ref>
	<result name="success">thankyou.jsp</result>
	<result name="input">register.jsp</result>
</action>
这里,logger拦截器负责记录执行action前、后的日志,timer拦截器负责记录执行该action需要的时间。

上面可以看出,通过interceptor-ref节点来配置拦截器,这里配置了三个拦截器:timer, logger, defaultStack。这三个拦截器作用于register action。

至于我们怎么知道struts2框架提供了哪些拦截器,这些拦截器的名字是什么,defaultStack包含有哪些拦截器,可以参考:http://struts.apache.org/2.3.7/docs/interceptors.html

注意上面的param节点,该节点用于给exception拦截器的setLogEnabled方法和setLogLevel方法提供值,true, ERROR.

上面的代码指定的拦截器,它的作用域为register action。如果我们想给一个包下的所有actoin指定这样一个拦截器方案,可以这样:

<package name="basicstruts2" extends="struts-default" > 


       <interceptors> 

         <interceptor-stack name="appDefault"> 

            <interceptor-ref name="timer" /> 

            <interceptor-ref name="logger" /> 

            <interceptor-ref name="defaultStack" /> 

         </interceptor-stack> 

        </interceptors> 

         

        <default-interceptor-ref name="appDefault" /> 

       <!-- rest of package omitted --> 


</package> 
通过 interceptors节点来定义一个拦截器堆栈,该堆栈包含timer, logger, defaultStack拦截器,并给该堆栈指定一个名字appDefault,然后通过default-interceptor-ref 节点,来指定该package下的所有action使用该拦截器堆栈。

当然,我们也可以把defaultStack去掉,只留timer, logger拦截器。

注:defaultStack是一个拦截器堆栈,它包含很多拦截器,就像这里定义的appDefault。


除了自定义拦截器堆栈(上面的appDefault), 我们也能自己写一个拦截器(例如上面的timer拦截器),然后把自己写的拦截器放入堆栈中。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值