1 拦截器与过滤器的区别?
- Struts2的核心功能都是依赖拦截器实现
- Filter:过滤器,过滤从客户端向服务器发送的请求。
- Interceptor:拦截器,拦截是客户端对Action的访问。更细粒度化的拦截。(拦截Action中的具体的方法)。
2 Struts的拦截器入门
2.1 编写拦截器类
- 实现Interceptor接口
服务器启动的时候执行init方法,在String str = invocation.invoke()前的是前处理,在其后的是后处理
package com.itykd.web.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor1 implements Interceptor{
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("MyInterceptor1销毁了.....");
}
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("MyInterceptor1初始化.....");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
System.out.println("MyInterceptor1执行了....");
String str = invocation.invoke();
System.out.println("MyInterceptor1执行结束了....");
return str;
}
}
- 继承AbstractInterceptor类
package com.itykd.web.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("MyInterceptor2执行了....");
String str = invocation.invoke();
System.out.println("MyInterceptor2执行结束了....");
return str;
}
}
- 继承MethodFilterInteceptor类
package com.itykd.web.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor3 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("MyInterceptor3执行了....");
String str = invocation.invoke();
System.out.println("MyInterceptor3执行结束了....");
return str;
}
}
2.2 在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.ognl.allowStaticMethodAccess" value="true"/>
<package name="demo1" extends="struts-default" namespace="/">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="myInterceptor1" class="com.itykd.web.interceptor.MyInterceptor1"/>
<interceptor name="myInterceptor2" class="com.itykd.web.interceptor.MyInterceptor2"/>
<interceptor name="myInterceptor3" class="com.itykd.web.interceptor.MyInterceptor3"/>
</interceptors>
<action name="interceptorAction1" class="com.itykd.web.action.InterceptorAction1">
<result name="success">/demo1.jsp</result>
<!-- 引入拦截器栈 (一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了)-->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myInterceptor1"/>
<interceptor-ref name="myInterceptor2"/>
<interceptor-ref name="myInterceptor3"/>
</action>
</package>
</struts>
- 定义一个拦截器栈
<?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.ognl.allowStaticMethodAccess" value="true"/>
<package name="demo1" extends="struts-default" namespace="/">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="myInterceptor1" class="com.itykd.web.interceptor.MyInterceptor1"/>
<interceptor name="myInterceptor2" class="com.itykd.web.interceptor.MyInterceptor2"/>
<interceptor name="myInterceptor3" class="com.itykd.web.interceptor.MyInterceptor3"/>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myInterceptor1"/>
<interceptor-ref name="myInterceptor2"/>
<interceptor-ref name="myInterceptor3"/>
</interceptor-stack>
</interceptors>
<action name="interceptorAction1" class="com.itykd.web.action.InterceptorAction1">
<result name="success">/demo1.jsp</result>
<!-- 引入拦截器栈 (一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了)-->
<interceptor-ref name="myStack"/>
</action>
</package>
</struts>
- 拦截的Action类
package com.itykd.web.action;
import com.opensymphony.xwork2.ActionSupport;
public class InterceptorAction1 extends ActionSupport{
public String execute() {
System.out.println("InterceptorAction1开始执行了.....");
return SUCCESS;
}
}