一、拦截器(是一个普通的类)类似于过滤器。拦截器实现与过滤器实现一样,功能比过滤器更加强大,配置性比较好,使用更加方便。匹配url来使用。拦截器是从webwork里出来的,它与AOP的开发模式是一样的。实现拦截器是用动态代理的。拦截器是struts2的核心。
二、拦截器有几个对象:目标对象、拦截对象、对目标对象生成的代理对象(代理对象是系统动态产生出来的)。拦截器是从功能上来说的,他是一个普通的java类。
三、JDK的动态代理必须是面向接口的。实现接口的类是目标对象、实现InvocationHandler接口的是一个处理器类、用到Proxy类的对象是代理类。真正执行的是代理。
四、拦截器像一个入口与出口一样,把action的逻辑方法包到中间。它在调用action方法之前执行一段代码,之后也可以执行一段代码,拦截器主要是从配置里实现的。
五、拦截器也有init与destroy方法,实现拦截器要实现com.opensymphony.xwork2.interceptor.Interceptor接口它里面的intercept是处理拦截的方法与过滤器的doFilter一样,它也存在init(初始化)与destory(销毁)方法作用也是一样的。Interceptor是拦截器最顶层的接口。
六、Interceptor接口里的intercept(ActionInvocation invocation)返回一个字符串主要是invocation这个参数。invocation它是ActionInvocation接口的实例,它是invoke方法是调用下一个拦截器或执行action。
七、拦截器与过滤器一样,也有拦截器链,它实际上是一个拦截器栈,相当于一串拦截器来拦截一个action,它的顺序与配置有关。
八、在struts.xml里这样配置拦截器:在package包里添加一个interceptors标签,它里面有interceptor-stack是用于配置拦截器栈的,而interceptor是用来配置一个拦截器的。
九、interceptor里的name是设置拦截器的名字,而class是指定这个拦截器是那一个类。如果要具体应用要在一个具体的action里配置。在action里添加一个interceptor-ref标签来进行应用拦截器,它的name属性表示在package里配置的拦截器名字也可以是拦截器栈的名字。
配置代码如下:
<interceptors>
<interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
<param name="hello">world</param>
</interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
十、struts2里有一个struts-default.xml它是struts2的一个默认配置文件,而struts.xml是一个指定文件,struts2可以让配置文件里的package像类一样可以继承。struts-default.xml里有一个struts-default包它里面有基本信息的定义如上传文件、国际化等。而拦截器栈里也可以存在拦截器栈。
十一、当添加一个default-interceptor-ref就是说明这个拦截器或拦截器栈是整个包的默认拦截器。
十二、所以我们的struts.xml也就有一个默认的拦截器或拦截器栈。当在action里引用一个拦截器的话,它不会把默认的拦截器加到action里去,必须再手工导入。defaultStack是struts2里提供的默认拦截器,它用于完成基本的功能。导入代码:<interceptor-ref name="defaultStack"></interceptor-ref>
十三、在配置拦截器时候可以增加参数设置,用<param>,但是拦截器里必须有这个属性,在使用拦截器的时候也可以再次给参数值,但是前面的将被复盖。
十四、拦截器栈定义用interceptor-stack其中name用的是栈的名字,里面用interceptor-ref标签的name属性指定拦截器或拦截器栈的名字。拦截器栈里的拦截器栈还可以定义其他东西,所以拦截器栈与拦截器没有什么区别。
十五、default-interceptor-ref标签可以用来替换掉struts2里的默认拦截器或拦截器栈。
十六、com.opensymphony.xwork2.interceptor.AbstractInterceptor类它实现了Interceptor接口,简化了拦截器的实现。实际上它是个抽象类,在里面init与destroy方法什么也不做而把intercept作为一个抽象方法,在实际工作中更多的是实现这个抽象类,而不是Interceptor接口。
十七、实际上拦截器栈的先后顺序是与栈的配置顺序有关的。在拦截器开始的时候是从上到下,而面结束的时候是从下到上的。
十八、默认拦截器的作用是引用到所有的action里,前提是action里面没有引用其他的拦截器,如果有,必须再手工加上。
所有Action的默认拦截器设置:
<default-interceptor-ref name="myStack"></default-interceptor-ref>
十九、拦截器是一种标准的AOP思想,它不把代码写死,而是写进配置里,先配置再执行。
二十、一般的拦截器实际上会拦截action里所有的逻辑方法,而com.opensymphony.xwork2.interceptor.MethodFilterInterceptor继承了AbstractInterceptor拦截器,它是方法过滤拦截器。里面的excludeMethods与includeMethods分别代表的是拦截方法与不拦截方法的集合,在配置里用param指定,多个方法用逗号隔开。
二十一、MethodFilterInterceptor类是一个抽象类,而主要的是doIntercept方法,它执行了要拦截的方法。
二十二、使用MethodFilterInterceptor拦截器时在action里指定时才可以指定要拦截与不拦截的方法。
二十三、在使用MethodFilterInterceptor时,如果拦截方法配置与不拦截方法配置相冲突时以最后的为基准而覆盖前面那个。
二十四、com.opensymphony.xwork2.interceptor.PreResultListener是一个监听器,是用一个拦截器来注册这个监听器。监听器是在action逻辑方法执行方法完后显示结果之前执行监听器里的代码。
二十五、写一个类实现PreResultListener监听器,然后用拦截器的ActionInvocation实例的addPreResultListener方法来注册监听器。
二十六、其中监听器的beforeResult方法里的String参数是转发的结果页面,也就是struts.xml里result标签的name属性值,例如:success,input等。
二十七、session在struts2里把它从web容器里脱离出来了,形成一个Map。
二十八、global-results里的result全部的概念,而Action.字段也刚好是从全局中找的。
二十九、拦截器在验证用户是否登录中的使用:
若登录则保存session的值:
@SuppressWarnings("unused")
Map map=ActionContext.getContext().getSession();
map.put("user","valid");
拦截器:
public class AuthInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
Map map = invocation.getInvocationContext().getSession();//得到execute()中保存在session中的值
if (map.get("user") == null) {
return Action.LOGIN;//若为空则返回登录页面,需在struts.xml中配置
} else {
return invocation.invoke();//若成功则到达指定页面
}
}
}
Struts.xml中配置拦截器:
<interceptor name="auth"
class="com.test.interceptor.AuthInterceptor">
</interceptor>
//应用拦截器:
<interceptor-ref name="auth"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
若验证用户没登录则跳转到登录页面,在struts.xml中配置全局action:
<global-results>
<result name="login" type="redirect">/login2.jsp</result>
</global-results>