关闭

【Struts2】:Interceptor的配置和使用

标签: interceptor
1539人阅读 评论(3) 收藏 举报
分类:

        在之前的博客中,介绍了Struts2的内建拦截器和自定义拦截器的一些内容,但是有了这些自带和自定义的拦截器之后,如何去配置和使用,还没有跟大家详细说明,接下来我们就一起学习一下,Struts2中Interceptor的配置和使用。


        Struts2框架里的拦截器配置信息是写在配置文件struts.xml里的,通常我们只需为拦截器类指定一个拦截器名称,就完成了拦截器的定义。定义拦截器使用<interceptor…/>元素来定义,其最简单的格式如下;

<span style="font-size:18px;">        <!-- 通过指定拦截器名称和拦截器实现类来定义拦截器 -->
<span style="white-space:pre">	</span><interceptor name="拦截器名" class="拦截器实现类">

	</interceptor></span>

        如果还需要在配置拦截器的时候传入参数,则需要在<interceptor…/>元素中使用<param…/>子元素进行参数设置,这种方式设置的是拦截器参数的默认参数值。具体格式如下;
<span style="font-size:18px;"><span style="white-space: pre;">	</span><!-- 通过指定拦截器名和拦截器实现类来定义拦截器 -->
	<interceptor name="拦截器名" class="拦截器实现类">
	<!-- 为拦截器指定参数值 -->
		<param name="参数名">参数值</param>
	</interceptor></span>

        除此之外,还可以把多个拦截器放在一起组成一个“拦截器栈”,比如,如果在Action执行之前想要同时做登录检查、安全性检查以及日志记录等等操作,则可以把这三个操作对应的拦截器组成一个拦截器栈。定义拦截器栈使用<interceptor-stack…/>元素,拦截器栈是由多个拦截器组成的,因此需要在<interceptor-stack…/>元素中使用<interceptor-ref…/>元素来定义多个拦截器的引用,即该拦截器栈由多个<interceptor-ref…/>元素指定的拦截器组成。


        如何理解拦截器栈呢?单从结构上来看,拦截器栈是由多个拦截器组成的,但是从功能上来看,拦截器和拦截器栈都是一样的,都是完成对Action的拦截,在Action的execute方法执行之前自动执行,其实,拦截器栈就是一个更大的拦截器而已。拦截器栈的配置信息如下:

<span style="font-size:18px;"><span style="white-space: pre;">	</span><interceptor-stack name="拦截器栈名">
		<interceptor-ref name="拦截器一"/>
		<interceptor-ref name="拦截器二"/>
		<!-- 还可以配置更多的拦截器-->
		...
	</interceptor-stack></span>

        上文我们提到了拦截器栈和拦截器本质上是一种东西,因此拦截器栈里也可以再嵌套或者说是包含拦截器栈,比如下面的配置信息就示例了拦截器栈二引用了拦截器栈一:
<span style="font-size:18px;"><span style="white-space:pre">	</span><interceptor-stack name="拦截器栈1">
		<interceptor-ref name="拦截器一"/>
		<interceptor-ref name="拦截器二"/>
		<!-- 还可以配置更多的拦截器-->
		...
	</interceptor-stack>
			
	<interceptor-stack name="拦截器栈2">
		<interceptor-ref name="拦截器一"/>
		<interceptor-ref name="拦截器栈1"/>
		<!-- 还可以配置更多的拦截器-->
		...
	</interceptor-stack></span>
        这样做的一个做大好处是软件复用,按照软件需求将拦截器分类,组成不同的拦截器栈,然后在程序开发中根据不同的需求去直接调用响应的拦截器栈即可,这样就不用同时调用那么多的拦截器了,灵活组合即可。

        一旦定义了拦截器和拦截器栈之后,就可以使用这个拦截器或者拦截器栈来拦截Action了,拦截器的拦截行为将会在Action的execute方法执行之前执行。通过<interceptor-ref…/>元素可以在Action内使用拦截器,其配置语法和在拦截器栈里面引用拦截器是一样的。如下示例,说明了如何在Action中配置拦截器和拦截器栈。

<span style="font-size:18px;"><span style="white-space: pre;">	</span><!-- 配置本系统所使用的包 -->
	<package name="lee" extends="struts-default">
		<!-- 应用所需使用的拦截器都在该元素下配置 -->
		<interceptors>
			<!-- 配置mySimple拦截器 -->
			<interceptor name="mySimple"
			class="org.ljw.app.interceptor.SimpleInterceptor">
				<!-- 为拦截器指定参数值 -->
				<param name="name">简单拦截器</param>
			</interceptor>
		</interceptors>

		<action name="login" class="org.ljw.app.action.LoginAction">
			<result name="error">/WEB-INF/content/error.jsp</result>
			<result>/WEB-INF/content/welcome.jsp</result> 
			<!-- 配置系统的默认拦截器 -->
			<interceptor-ref name="defaultStack"/>
			<!-- 应用自定义的mySimple拦截器 -->
			<interceptor-ref name="mySimple">
				<param name="name">改名后的拦截器</param>
			</interceptor-ref>
		</action>
		<action name="*">
			<result>/WEB-INF/content/{1}.jsp</result>
		</action>
	</package></span>


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:296502次
    • 积分:11588
    • 等级:
    • 排名:第1316名
    • 原创:150篇
    • 转载:6篇
    • 译文:1篇
    • 评论:2140条
    公告
    在技术的海洋里遨游是一件十分有趣的事情,欢迎各位技术达人与我一同探讨,技术,职业,人生……
    博客专栏
    最新评论