拦截器基础知识
拦截器是struts2的重要组成部分,拦截器拦截到用户的请求之后,大量拦截器将会对对用户请求进行处理,然后才调用用户开发的Action实例的方法来处理请求。
Struts2已经默认启用了大量通用功能的拦截器,只要我们配置Action的package继承了struts-default包,这些拦截器就会起作用。
Struts2内建了大量的拦截器,这些拦截器以name-class 对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识;class指定了该拦截器的实现类。
几个内建拦截器:
params:是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
prepare:如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。
配置拦截器:
在struts.xml文件中定义拦截器只需为拦截器指定一个拦截器名,就完成拦截器定义。
定义拦截器使用<interceptor.../>元素来定义,格式如下:
<interceptor name="拦截器名" class="拦截器实现类"/>
还可以把多个拦截器连在一起组成拦截器栈。
如果需要在Action执行前同时做登录检查、安全检查和记录日志,则可以把这三个动作对应的拦截器组成一个拦截器栈。定义拦截器栈使用<interceptor-stack .../>元素,拦截器栈是由多个拦截器组成的。因此需要在<interceptor-stack.../>元素中使用<interceptor-ref.../>元素来定义多个拦截器引用。即拦截器栈由多个<interceptor-ref.../>元素指定的拦截器组成。
从程序功能上来看,拦截器栈和拦截器是统一的,它们包含的方法都会在Action的execute方法执行之前自动执行。
因为拦截器栈和拦截器的功能几乎完全相同,可以出现以下情况:拦截器栈里可以包含拦截器栈。一个拦截器栈中包含另一个拦截器栈,而不是直接写成另一个拦截器栈中所包含的所有拦截器,是为了软件复用。
使用拦截器栈:
一旦定义了拦截器栈和拦截器后,可以使用这个拦截器栈和拦截器来拦截Action了,拦截器(包含拦截器栈)的拦截行为将会在Action的execute方法执行之前被执行。
配置默认拦截器:
当配置一个包时,可以为其指定默认拦截器(栈)。一旦为某个包指定了默认的拦截器,如果该包中的Action没有显示指定拦截器,则默认的拦截器将会起作用。
配置默认拦截器使用<default-interceptor-ref.../>元素,该元素作为<package.../>元素的子元素使用,为该包下的所有Action配置默认的拦截器。
配置默认拦截器是一种使用拦截器的方式——避免在每个Action中单独配置拦截器,通过在该包下配置拦截器,可以实现为该包下所有Action同时配置相同的拦截器。
实现拦截器类:
大部分Web应用的通用功能,都可以通过直接使用这些拦截器来完成。
如果用户要开发自定义的拦截器类,应该实现com.opensymphony.xwork2.interceptor.Interceptor接口。该接口里包含了如下三个方法:
Init():在该拦截器被实例化之后,在该拦截器执行拦截之前,系统将回调该方法。
对于每个拦截器而言,其init()方法只执行一次。因此,该方法的方法体主要用于初始化性资源,例如数据库连接等。
Destroy():该方法与init()方法对应。在拦截器实例被销毁之前,系统回调该拦截器的destroy方法,该方法用于销毁init()方法里打开的资源。
Intercept(ActionInvocationinvocation):该方法是用户需要实现的拦截动作。就像Action的execute一样,intercept方法会返回一个字符串作为逻辑视图。如果该方法直接返回了一个字符串,系统会跳转到该逻辑视图对应的实际视图资源,不会调用被拦截的Action.
拦截方法的拦截器:
在某些情况下,不想拦截所有的方法,只需要拦截指定的方法,就使用struts2拦截器的方法过滤特性。Struts2提供了一个MethodFilterInterceptor类。
<actionname="viewBook">
<result>/WEB-INF/content/viewBook.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authority"/>
</action>
上面名为viewBook的Action,没有指定class属性,默认使用ActionSupport类。
考虑到这个拦截器的重复使用,可能多个Action都需要跳转到login逻辑视图,故将login的结果映射定义成一个全局结果映射。
<global-results>
<result name="login">/WEB-INF/content/login.jsp</result>
</global-results>
以上只是个人的看书笔记,可能有点乱。