09.sruts2拦截器

1.struts拦截器介绍

Struts2的核心就 是拦截器,param,modelDriven,validation,servletAPI等等这些都是拦截器完成的功能。

 

 

服务器启动时实例化StrustPrepareAndExecuteFilter,读取struts所有的配置文件,把struts.xml中的每一个Action实例化,当一个请求访问的时候,StrustPrepareAndExecuteFilter会把请求拦截下来,匹配一个ActionMapper,然后ActionMapper创建ActionProxy,然后去执行默认拦截器栈,在执行Action,然后返回结果,然后默认拦截器再反向执行(做一些运行期的监控和清理工作,不是每一个拦截器都执行后置拦截),最后响应结果返回给页面。 

 

2.自定义拦截器

我们需要继承AbstractInterceptor

创建拦截器类:

public class NyInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("前置拦截执行....");
		String result = invocation.invoke();
		System.out.println("后置拦截执行....");
		return result;
	}

}

配置拦截器:

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	<package name="hello1" extends="struts-default" namespace="/aaa">

		<!-- 拦截器配置 -->
		<interceptors>
			<interceptor name="MyInterceptor" class="com.zy.interceptor.NyInterceptor">                 </interceptor>
		</interceptors>
		
		<action name="zhang" class="com.zy.action.PersonAction" method="save">
			<result name="success">/success.jsp</result>
			<result name="input">/form.jsp</result>
		</action>
		<action name="delete" class="com.zy.action.PersonAction" method="delete">

			<!-- 引用拦截器 -->
			<interceptor-ref name="MyInterceptor"></interceptor-ref>

			<result name="success">/success.jsp</result>
			<result name="input">/form.jsp</result>
		</action>
	</package>
</struts>

 

 我们从结果上可以看懂执行的顺序:前置拦截--àction---页面执行--后置拦截

 

3.拦截器和拦截器栈的配置

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	<!-- 拦截器配置 -->
	<package name="myStruts-Default" extends="struts-default" abstract="true">
		<interceptors>
			 <!-- 自己配置的拦截器 -->
			<interceptor name="myInterceptor" class="com.zy.interceptor.MyInterceptor"></interceptor>
					<!-- 拦截器栈:是把多个拦截器集中到一起统一被引用-->
			<interceptor-stack name="zyStack">
					<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈-->
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="myInterceptor"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
         <!-- 
			把zyStack作为默认拦截器,只要继承了myStruts-Default,执行Action时就会自动先执行rlStack中的所有拦截器
		 -->
		<default-interceptor-ref name="zyStack"></default-interceptor-ref>
	</package>
	<package name="hello1" extends="myStruts-Default" namespace="/aaa">
		<action name="zhang" class="com.zy.action.PersonAction" method="save">
			<result name="success">/success.jsp</result>
			<result name="input">/form.jsp</result>
		</action>
		<action name="delete" class="com.zy.action.PersonAction" method="delete">
			<result name="success">/success.jsp</result>
			<result name="input">/form.jsp</result>
		</action>
	</package>
</struts>

这里action都会被拦截, 不同包下的action也会被拦截

4.排除Action拦截器

如果我们不想让delete使用拦截,要想排除被拦截的Action的执行方法,拦截器需要继承MethodFilterInterceptor

public class MyInterceptor1 extends MethodFilterInterceptor {
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		System.out.println("前置拦截执行....");
		String result = invocation.invoke();
		System.out.println("后置拦截执行....");
		return result;
	}
}

 配置action的排除

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	<!-- 拦截器配置 -->
	<package name="myStruts-Default" extends="struts-default" abstract="true">
		<interceptors>
			 <!-- 自己配置的拦截器 -->
			<interceptor name="myInterceptor" class="com.zy.interceptor.MyInterceptor"></interceptor>
			<interceptor name="myInterceptor1" class="com.zy.interceptor.MyInterceptor1"></interceptor>
					<!-- 拦截器栈:是把多个拦截器集中到一起统一被引用-->
			<interceptor-stack name="zyStack">
					<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈-->
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="myInterceptor"></interceptor-ref>
				<interceptor-ref name="myInterceptor1"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="zyStack"></default-interceptor-ref>
	</package>
	
	<package name="hello1" extends="myStruts-Default" namespace="/aaa">
		<action name="zhang" class="com.zy.action.PersonAction" method="save">
			<result name="success">/success.jsp</result>
			<result name="input">/form.jsp</result>
		</action>
		<action name="delete" class="com.zy.action.PersonAction" method="delete">
			
			<!-- 当前Action需要主动管理默认拦截器栈 -->
			<interceptor-ref name="zyStack">
				<!-- 
					指定要排除的拦截器
					name:要排除的拦截器的名字.exludeMethods
					元素:要排除的方法
				 -->
				<param name="myInterceptor1.excludeMethods">delete</param>
			</interceptor-ref>
			
			<result name="success">/success.jsp</result>
			<result name="input">/form.jsp</result>
		</action>
	</package>
</struts>

 

 http://localhost:8080/strus2/aaa/delete

 http://localhost:8080/strus2/aaa/zhang

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值