1 Struts2框架拦截器的简介:
服务器启动时实例化"StrutsPrepareAndExecuteFilter", 读取struts所有的配置文件, 把struts.xml中的每一个action都实例化, 当一个请求访问的时候, "StrutsPrepareAndExecuteFilter"会把请求拦截下来, 匹配一个ActionMapper, 然后ActionMapper创建ActionProxy, 然后去执行默认拦截器栈, 再执行Action, 然后返回结果(有些拦截器需要做一些运行期的清理和监控工作, 后置拦截).
2 自定义拦截器:
创建一个自定义的拦截器类, 继承"com.opensymphony.xwork2.ActionInvocation"类
package com.rl.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("前置拦截...");
//让拦截器走下去, 返回一个结果码
String resultCode = arg0.invoke();
System.out.println("后置拦截...");
return resultCode;
}
}
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>
<constant name="struts.devMode" value="true"></constant>
<package name="person" extends="struts-default" namespace="/person">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="com.rl.interceptor.MyInterceptor"></interceptor>
</interceptors>
<action name="save" class="com.rl.action.PersonAction1" method="save">
<!-- 引用拦截器 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/form1.jsp</result>
</action>
</package>
</struts>
success.jsp页面的打印信息:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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">
</head>
<body>
<%
System.out.println("页面响应...");
%>
<h5>success</h5>
</body>
</html>
访问结果:
拦截器的执行顺序是: 前置拦截-->action动作类-->页面执行-->后置拦截
如果每个acting都要引用一次拦截器则太过繁琐, 解决方式:
<?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>
<constant name="struts.devMode" value="true"></constant>
<!-- 定义一个默认包
-->
<package name="basePackage" extends="struts-default" abstract="true">
<interceptors>
<!-- 定义一个自定义拦截器 -->
<interceptor name="myInterceptor" class="com.rl.interceptor.MyInterceptor"></interceptor>
<!-- 定义一个自定义拦截器栈 -->
<interceptor-stack name="rlStack">
<!-- 拦截器栈里面默认拦截器和自定义拦截器(拦截器栈也可以引用过来) -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默认拦截器栈为自定义拦截器栈 -->
<default-interceptor-ref name="rlStack"></default-interceptor-ref>
</package>
<package name="person" extends="basePackage" namespace="/person">
<action name="save" class="com.rl.action.PersonAction1" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form1.jsp</result>
</action>
</package>
</struts>
以上配置则保证所有action都会使用"com.rl.interceptor.MyInterceptor", 如果有某些action不需要, 则需让自定义的拦截器类继承"com.opensymphony.xwork2.interceptor.MethodFilterInterceptor"
拦截器类:
package com.rl.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor2 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.out.println("前置拦截2...");
//让拦截器走下去, 返回一个结果码
String resultCode = arg0.invoke();
System.out.println("后置拦截2...");
return resultCode;
}
}
"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>
<constant name="struts.devMode" value="true"></constant>
<!-- 定义一个默认包
-->
<package name="basePackage" extends="struts-default" abstract="true">
<interceptors>
<!-- 定义一个自定义拦截器 -->
<interceptor name="myInterceptor" class="com.rl.interceptor.MyInterceptor"></interceptor>
<interceptor name="myInterceptor2" class="com.rl.interceptor.MyInterceptor2"></interceptor>
<!-- 定义一个自定义拦截器栈 -->
<interceptor-stack name="rlStack">
<!-- 拦截器栈里面默认拦截器和自定义拦截器(拦截器栈也可以引用过来) -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="myInterceptor2"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默认拦截器为自定义拦截器栈 -->
<default-interceptor-ref name="rlStack"></default-interceptor-ref>
</package>
<!-- 继承默认包
-->
<package name="person" extends="basePackage" namespace="/person">
<action name="save" class="com.rl.action.PersonAction1" method="save">
<result name="success">/success.jsp</result>
<result name="input">/form1.jsp</result>
</action>
<action name="delete" class="com.rl.action.PersonAction1" method="delete">
<!-- 配置要排除的拦截器栈 -->
<interceptor-ref name="rlStack">
<!--
"要排除的拦截器名".excludeMethods
"delete": 方法名, 防止如果action标签中没有指定method的情况
-->
<param name="myInterceptor2.excludeMethods">delete</param>
</interceptor-ref>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>