1.拦截器的概述
拦截器是Struts2的核心组成部分,他可以动态拦截Action调用的对象,类似于Servlet中的过滤器。
2.拦截器的工作原理
拦截器是以代理方式调用的,他在一个Action执行前后进行拦截,围绕着Action和Result的执行而执行。
首先执行Action配置的拦截器,Action和Result执行之后,拦截器再次执行。
3.拦截器的配置
- 拦截器
//配置拦截器
<interceptor name="interceptorName" class="interceptorClass">
<param name="paramName">paramValue</param>
</interceptor>
- 拦截器栈
拦截器栈是由多个拦截器构成的。
定义拦截器栈用interceptors元素和interceptor-stack子元素,配置多个拦截器时使用interceptor-ref元素。
<interceptors>
<interceptor-stack name="interceptorStackName">
<interceptor-ref name="interceptorName1">
<interceptor-ref name="interceptorName2">
<interceptor-ref name="interceptorName3">
......
</interceptor-stack>
</interceptors>
- 默认拦截器
默认拦截器可以对指定的包中所有的Action都能起到拦截的作用。配置默认拦截器使用default-interceptor-ref元素。
//name必须是已存在的拦截器或者拦截器栈
<default-interceptor-ref name="name">
- 拦截器的简单实现
- index.jsp
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:form action="testAction">
<s:textfield label="msg" name="message"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
- struts.xml
<package name="hello" namespace="/" extends="struts-default">
<action name="testAction" class="com.action.InterceptorAction">
<result name="success">/success.jsp</result>
<!-- 如果使用系统其他拦截器,该Action的默认拦截器会消失,必须手动添加默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!--配置token拦截器(令牌拦截器,避免重复提交) -->
<interceptor-ref name="token"></interceptor-ref>
<result name="invalid.token">/error.jsp</result>
</action>
</package>
- InterceptorAction.java
public class InterceptorAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String execute() throws Exception {
System.out.println("页面提交的message");
Thread.sleep(1000);
System.out.println(message);
return SUCCESS;
}
}
- error.jsp和success.jsp页面自己添加。