一、sturts2自带拦截器
1、params拦截器:提供了框架不可缺少的功能,将请求中的数据设置到Action中的属性上。
2、staticparams拦截器:将配置文件中通过action元素的子元素param设置的参数设置到对应的Action的属性中。
<action name="example" class="com.struts2.action.ExampleAction">
<param name="exampleFiled">Example</param>
<result>success.jsp</result>
</action>
3、servletConfig拦截器:提供将源于Servlet API的各种对象注入到Action当中。
获取Servlet API对象的接口:
ServletContextAware 设置ServletContext
ServletRequestAware 设置ServletRequest
ServletResponseAware 设置ServletResponse
ParameterAware 设置Map类型的请求参数
RequestAware 设置Map类型的请求(HttpServletRequest)属性
SessionAware 设置Map类型的会话(HttpSession)属性
ApplicationAware 设置Map类型的应用程序的作用域对象(ServletContext)
4、fileUpload拦截器:将文件和元数据从多重请求(multipart/form-data)转换为常规的请求数据,以便将它们设置在对应的Action的属性上。
5、validation拦截器:执行数据验证。
6、workFlow拦截器:提供当数据验证错误时终止流程的功能。
7、exception拦截器:捕获异常,置于所有的拦截之前。
二、实现自定义拦截器(间接或直接实现Interceptor接口)
示例:
package org.qiujy.common;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 权限检查拦截器
*
* @author qiujy
* @version 1.0
*/
public class AuthorizationInterceptor extends AbstractInterceptor {
/*
* 拦截Action处理的拦截方法
*
*/
public String intercept(ActionInvocation invocation) throws Exception {
Map session = invocation.getInvocationContext().getSession();
String userName = (String) session.get("userName");
if (null != userName && userName.equals("test")) {
System.out.println("拦截器:合法用户登录---");
return invocation.invoke();
} else {
System.out.println("拦截器:用户未登录---");
return Action.LOGIN;
}
}
}
三、在sturts.xml文件中配置
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="my" extends="struts-default">
<interceptors>
<!-- 定义权限控制拦截器 -->
<interceptor name="authority"class="org.qiujy.common.AuthorizationInterceptor"/>
</interceptors>
<!-- 定义全局处理结果 -->
<global-results>
<!-- 逻辑名为login的结果,映射到/login.jsp页面 -->
<result name="login">/login.jsp</result>
</global-results>
<action name="listall"class="org.qiujy.web.struts2.action.UserAction" method="listAllUser">
<result name="success">/listall.jsp</result>
<!-- 使用拦截器 -->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authority"/>
</action>
<action name="userOpt"class="org.qiujy.web.struts2.action.UserAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
四、拦截器执行原理
1、拦截器围绕着Action和Result的执行而执行的。
2、以链式执行,首先执行Action配置的拦截器,在Action和Result执行之后,拦截器再一次执行,并且在执行过程中任何一个拦截器都可以直接返回,
从而终止余下的拦截器,Action以及Result的执行。
3、当ActionInvocation的invoke方法执行时,开始执行Action的第一个拦截器,而invoke方法并不是总映射到拦截器。
4、拦截器执行的过程可以看成是一个递归的过程。
5、拦截器执行的三个阶段:
(1)预处理(拦截器可以准备、过滤、改变或者操作任何可以访问的数据,包括Action)。
(2)方法执行(ActionInvocation的invoke方法执行)。
(3)Action执行后的处理(客户端呈现数据显示结果)。
五、自定义拦截器
拦截器间接或直接地实现了com.opensymphony.xword2.inteceptor.interceptor接口的三个方法。
(1)void init():拦截器初始化,每个拦截器只执行一次。
(2)void destory():拦截器实例销毁。
(3)String intercept(ActionInvocation invocation) throws Exception;执行拦截动作,返回一个字符串作为逻辑视图。