Struts2中的拦截器

1、struts2中的内建拦截器

struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中,name为拦截器的名字,至关于该拦截器的惟一标识。class指定了该拦截器的实现类。在package中继承了Struts2的默认struts-default包,则能够自由使用这些内建拦截器。java

    1)alias:实如今不一样请求中类似参数别名的转换;spring

    2)autowiring:自动装配的拦截器,用于与spring整合;session

    3)chain:构建一个Action链,使当前Action能够访问前一个Action的属性;app

    4)conversionError:负责处理类型转换错误的拦截器,负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误;ide

    5)createSession:负责建立一个HttpSession对象。this

    6)debugging:当使用Struts2的开发模式,该拦截器提供更多的提示信息;spa

    7)execAndWait:后台执行Action,负责将等待画面发送给用户。debug

    8)exception:负责处理异常,它将异常映射为结果。日志

    9)fileUpload:负责文件上传,解析表单中文件域的内容。code

    10)i18n:支持国际化的拦截器,把所选的语言、区域放入用户Session中;

   11)model-driven:用于模型驱动的拦截器,当某个Action类实现了ModelDrien接口时,它负责把getModel()方法的结果放入堆ValueStack中;

    12)logger:负责日志记录的拦截器,主要输出Action的名字;

    13)scoped-model-driven:若是一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定范围中找到指定的Model,并经过setModel方法将该Model传给Action实列;

    14)params:负责解析Http请求中的参数,并将参数值设置为Action中的参数;

    15)prepare:若是Action实现了Preparable接口,将会调用该拦截器的prepare()方法;

    16)static-params:将xml中action标签下的<param>标签中的参数传入action。

    17)scope:范围转换拦截器,它能够将Action状态信息保存到HttpSession范围内,或者保存到ServletContext范围;

    18)servlet-config:若是某个Action须要直接访问Servlet API ,就是经过这个拦截器实现。

    19)roles:只有当浏览者取得适合的受权后,才能够调用被该拦截器拦截的Action;

    20)timer:负责输出执行Action的执行时间;

    21)token:用于阻止重复提交,

    22)token-session:负责把token保存至HttpSession中;

    23)validation:经过执行在xxxAction-validation.xml中定义的校验器从而完成数据校验;

    24)workflow:负责调用Action类中的validate方法,若是校验失败则返回input试图;

2、配置拦截器

<!-- 配置拦截器 -->
<interceptor name="拦截器名称" class="拦截器实现类"></interceptor>

除了以上配置外还能够将多个拦截器合在一块儿配置拦截栈

<interceptor-stack name="loggerStack">
        <!--使用内置拦截器-->
		<interceptor-ref name="logger" />
		<interceptor-ref name="debugging" />
</interceptor-stack>

在一个拦截器中能够配置多个拦截器,也能够引用其余的拦截栈

当Action中没有声明使用拦截器时,该Action所在包的默认拦截器才会生效。每一个package只能配置一个默认拦截器。

<default-interceptor-ref name="默认拦截器" />

3、自定义拦截器

1)继承com.opensymphony.xwork2.ActionInvocation抽象类,重写intercept(ActionInvocation arg0)方法。

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.shcredit.controller.appkind.AddAppKindInfoAction;

public class SimpleInterceptor extends AbstractInterceptor {
	//拦截器的名称
	private String name;
	
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		System.out.println("进入"+name+"拦截器。。。。。。。");
		//取得被拦截的Action实列
		AddAppKindInfoAction action = (AddAppKindInfoAction)arg0.getAction();
		//若是该拦截器后没有其余拦截器,则执行AddAppKindInfoAction中的execute方法
		String result = arg0.invoke();
		return result;
	}

}

2)xml文件中,在须要使用该拦截器的package中配置该拦截器,而后在action中引入该拦截器便可。

<interceptors>
			<!-- 为拦截器指定参数值 -->
			<interceptor name="simple" class="com.shcredit.controller.interceptor.SimpleInterceptor">
				<param name="name">mySimple</param>
			</interceptor>
</interceptors>
<action name="add" class="com.shcredit.controller.appkind.AddAppKindInfoAction">
			<!-- 使用Simple拦截器 -->
			<interceptor-ref name="simple">
			</interceptor-ref>
</action>

4、方法拦截器

在默认状况下,若是咱们为某个Action定义了拦截器,该拦截器就会拦截action中的全部方法,在一些状况下咱们须要拦截一些特定的方法,就可使用到方法拦截器进行拦截。

1)实现com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类,重写其doIntercept(ActionInvocation action)回调方法。

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.shcredit.controller.appkind.AddAppKindInfoAction;
import com.shcredit.vo.info.AppKindInfoVO;

public class MyfliterIntercept extends MethodFilterInterceptor { 
	private String name;//拦截器的名字
	
	public void setName(String name) {
		this.name = name;
	}

	/* 拦截方法的拦截器,继承MethodFilterInterceptor
	 * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation)
	 */
	@Override
	protected String doIntercept(ActionInvocation action) throws Exception {
		AddAppKindInfoAction appKindAction = (AddAppKindInfoAction)action.getAction();
		System.out.println("进入appKindAction拦截器。。。。。。");
		AppKindInfoVO appKind = appKindAction.getAppKind();
		String invoke = action.invoke();
		return invoke;
	}

}

2)在xml中对方法拦截器的配置和以前的同样,须要注意的是它能够选择配置拦截方法

<interceptor-ref name="myfilter">
				<!--从新定义name属性的属性值-->
				<param name="name">更名后的拦截方法过滤器</param>
				<!--指明须要被拦截的方法-->
				<param name="includeMethods">execute,testFliter,setAppKind</param>
				<!--指明不被拦截的方法-->
				<param name="excludeMethods">testNoFliter</param>
</interceptor-ref>

5、拦截结果的拦截器

在Action中的execute执行以后,返回试图以前可使用PreResultListener进行监听,在拦截器中使用该监听器,只要该拦截器被触发,该监听也将会被触发。

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener;

public class MyPreResultListener implements PreResultListener {

	@Override
	public void beforeResult(ActionInvocation arg0, String arg1) {
		System.out.println("进入beforeResult");
        //会致使死循环,进入action中的execute方法后进入该拦截器,又进入execute...
        //arg0.invoke();
		System.out.println("返回的逻辑试图名:"+arg1);
	}

}
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class BeforeResultInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
        //为该拦截器添加MyPreResultListener监听器
		arg0.addPreResultListener(new MyPreResultListener());
		System.out.println("执行execute方法以前的拦截");
		String invoke = arg0.invoke(); 
		System.out.println("execute方法执行以后的拦截");
		return invoke;
	}

}

将BeforeResultInterceptor拦截器配置在xml中,便可。

注意:不要在MyPreResultListener中调用invoke(),会致使死循环。

相关文章
相关标签/搜索