拦截器是Struts2的核心组成部分
1.Struts2很多功能都是构建在拦截器基础之上的,例如文件的上传和下载,国际化,数据类型转换和数据校验等等。4.拦截器栈(Interceptor-Stack):将拦截器按一定的顺序联结成一条链,在访问被拦截的方法时,Struts2拦截器链中的拦截器就会按其之前定义的顺序依次调用。
Interceptor接口
每个拦截器都是实现了com.opensympnony.xwork2.interceptor.Interceptor接口的java类:
public interface Interceptor extends Serializable{
void destory();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
--inti:该方法将在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相对资源进行必要的初始化
--intercept:每拦截一个请求,该方法就会被调用一次
--destory:该方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次
由init和destory可以感觉到拦截器是单例的
1.Struts2会依次调用为某个Action而注册的每一个拦截器的intercept方法。
2.每次调用intercept方法时,Struts2会传递一个ActionInvocation接口的实例。
3.ActionInvocation代表一个给定的Action的执行状态,拦截器可以从该类的对象里获得与该Action相关联的Action对象和Result对象,在完成拦截器自己的任务之后,拦截器将调用ActionInvocation对象的invoke方法前进到Action处理流程的下一个环节。
4.AbstractInterceptor类实现了Interceptor接口,并为init,destroy提供了一个空白的实现。
1.先定义一个拦截器类
可以实现Interceptor接口也可以继承AbstractInterceptor抽象类
2.在struts.xml配置文件里配置
<interceptors> <interceptor-stack name="wulStack"> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> <interceptor name="wulinterceptor" class="com.wul.app.interceptors.MyInterceptor"></interceptor> </interceptors> <action name="hello" class="com.wul.app.action.TestAction"> <interceptor-ref name="wulinterceptor"></interceptor-ref> <interceptor-ref name="wulStack"></interceptor-ref> <result>/success.jsp</result> </action>
下面给出范例
struts.xml
<?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> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor-stack name="wulStack"> <interceptor-ref name="wulinterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> <interceptor name="wulinterceptor" class="com.wul.app.interceptors.MyInterceptor"></interceptor> </interceptors> <action name="hello" class="com.wul.app.action.TestAction"> <!-- <interceptor-ref name="wulinterceptor"></interceptor-ref>--> <interceptor-ref name="wulStack"></interceptor-ref> <result>/success.jsp</result> </action> </package> </struts>
package com.wul.app.action; import com.opensymphony.xwork2.ActionSupport; public class TestAction extends ActionSupport{ /** * */ private static final long serialVersionUID = 1L; @Override public String execute() throws Exception { System.out.println("TestAction"); return SUCCESS; } }
package com.wul.app.interceptors; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor { /** * */ private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("before invocation invoke"); String result = invocation.invoke(); System.out.println("after invocation invoke"); //return "success"; return result; } }
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <a href="hello.action">Hello interceptor</a> </body> </html>success.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> success </body> </html>