1、struts中的拦截器
拦截器:与多滤器类似,拦截器可以在Action执行之前做相似的操作也可以在Action执行之后做回收操作
所以拦截器只能拦截Action的请求,不能拦截其它的请求。
与过滤器的区别:
过滤器是用于过滤URL
拦截器是用于拦截类中的方法和属性。
(过滤器可以拦截任意的请求)
拦截器的分类:
4.1:系统定义的拦截器
4.2:用户自定义的拦截器:拦截器一般用于普遍性的动作,完成一些通用的功能。
例如:记录日志。验证用户是否登录等。
A:编写拦截器(实现Interceptor接口或者继承abstractInterceptor类)
B: 在struts.xml中配置拦截器
C:如何调用拦截器,需要在action中显示调用引用哪一个拦截器。
interceptor-ref name="interceptor_one"
<a href="<%=path%>/interceptor/callIntercep">引用拦截器</a>
4.3:当action引用多个拦截器时,拦截器组成一个拦截器栈的数据结构。栈有先进后出的特点。
而多个过滤器则形成过滤器链。
Request时,第一个执行的拦截器。在REsponse时,最后一个执行。
<interceptor-ref name="interceptor_one"></interceptor-ref>
<interceptor-ref name="interceptor_two"></interceptor-ref>
4.4:拦截执行的先后顺序:
是由Action引用拦截器的先后顺序来决定的。
4.5:拦截器栈:如果多个Action,也需要引用相同的拦截器。可以将这多个拦截器定义一个拦截器栈。
拦截器栈中的拦截器执行的先后顺序是由拦截器栈引用的先后顺序决定。
<a href="<%=path%>/interceptor_stack/callIntercep2">引用拦截器栈</a>
4.6:默认拦截器
配置default-interceptor-ref,那么该package下所有的Action执行时,都会引用默认的拦截器。
<a href="<%=path%>/interceptor_default/callIntercep3">默认拦截器设定</a>
4.7:使用拦截器的问题:
当Action只要引用拦截器/拦截器栈/默认拦截器,struts-default.xml中定义的默认拦截器将不再起作用。
需要自定义的拦截器栈中加入defaultStack
<a href="<%=path%>/interceptor_default/callIntercep3?userid=100&username=admin">拦截器后的问题</a>
拦截器:与多滤器类似,拦截器可以在Action执行之前做相似的操作也可以在Action执行之后做回收操作
所以拦截器只能拦截Action的请求,不能拦截其它的请求。
与过滤器的区别:
过滤器是用于过滤URL
拦截器是用于拦截类中的方法和属性。
(过滤器可以拦截任意的请求)
拦截器的分类:
4.1:系统定义的拦截器
4.2:用户自定义的拦截器:拦截器一般用于普遍性的动作,完成一些通用的功能。
例如:记录日志。验证用户是否登录等。
A:编写拦截器(实现Interceptor接口或者继承abstractInterceptor类)
B: 在struts.xml中配置拦截器
C:如何调用拦截器,需要在action中显示调用引用哪一个拦截器。
interceptor-ref name="interceptor_one"
<a href="<%=path%>/interceptor/callIntercep">引用拦截器</a>
4.3:当action引用多个拦截器时,拦截器组成一个拦截器栈的数据结构。栈有先进后出的特点。
而多个过滤器则形成过滤器链。
Request时,第一个执行的拦截器。在REsponse时,最后一个执行。
<interceptor-ref name="interceptor_one"></interceptor-ref>
<interceptor-ref name="interceptor_two"></interceptor-ref>
4.4:拦截执行的先后顺序:
是由Action引用拦截器的先后顺序来决定的。
4.5:拦截器栈:如果多个Action,也需要引用相同的拦截器。可以将这多个拦截器定义一个拦截器栈。
拦截器栈中的拦截器执行的先后顺序是由拦截器栈引用的先后顺序决定。
<a href="<%=path%>/interceptor_stack/callIntercep2">引用拦截器栈</a>
4.6:默认拦截器
配置default-interceptor-ref,那么该package下所有的Action执行时,都会引用默认的拦截器。
<a href="<%=path%>/interceptor_default/callIntercep3">默认拦截器设定</a>
4.7:使用拦截器的问题:
当Action只要引用拦截器/拦截器栈/默认拦截器,struts-default.xml中定义的默认拦截器将不再起作用。
需要自定义的拦截器栈中加入defaultStack
<a href="<%=path%>/interceptor_default/callIntercep3?userid=100&username=admin">拦截器后的问题</a>
4.8:例子代码:
Interceptor_One.java
package com.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.ValueStack;
public class Interceptor_One implements Interceptor {
@Override
public void init() {
//System.out.println("Interceptor_One的init方法,只执行一次");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//System.out.println("Interceptor_One的intercept方法");
Object objAction = invocation.getAction();
ActionContext context = invocation.getInvocationContext();
ValueStack valueStack = invocation.getStack();
/**
* invocation.invoke:相当于通过拦截,并且执行Action中的Execute方法,
*
* 并且获取Action返回的Result对应的字符串。
*/
System.out.println("Interceptor_One方法执行之前拦截要做的事情");
String result = invocation.invoke();
System.out.println("Interceptor_One方法执行之后拦截要做的事情");
//System.out.println("拦截的Action对象 = " + objAction);
//System.out.println("返回的Result = " + result);
return result;
}
@Override
public void destroy() {
//System.out.println("Interceptor_One的destroy方法,只执行一次");
}
}
Interceptor_Two.java
package com.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class Interceptor_Two extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Interceptor_Two方法执行之前拦截要做的事情");
String result = invocation.invoke();
System.out.println("Interceptor_Two方法执行之后拦截要做的事情");
return result;
}
}
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.i18n.encoding" value="UTF-8"></constant>
<constant name="struts.multipart.maxSize" value="209715200"></constant>
<constant name="struts.action.extension" value="action,,"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="true"></constant>
<constant name="struts.i18n.reload" value="true"></constant>
<constant name="struts.ui.theme" value="simple"></constant>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="ognlAction" class="com.action.OgnlAction">
<result name="ognl">/ognl.jsp</result>
</action>
<action name="tagAction" class="com.action.TagAction">
<result name="tag_form">/tag_form.jsp</result>
<result name="tag_edit">/tag_edit.jsp</result>
<result name="tag_noform">/tag_noform.jsp</result>
<result name="tag_control">/tag_control.jsp</result>
<result name="tag_data">/tag_data.jsp</result>
<result name="tag_ajax">/tag_ajax.jsp</result>
</action>
</package>
<package name="interceptor" namespace="/interceptor" extends="struts-default">
<interceptors>
<interceptor name="interceptor_one" class="com.interceptor.Interceptor_One"></interceptor>
<interceptor name="interceptor_two" class="com.interceptor.Interceptor_Two"></interceptor>
</interceptors>
<action name="callIntercep" class="com.action.CallIntercepAction">
<interceptor-ref name="interceptor_two"></interceptor-ref>
<interceptor-ref name="interceptor_one"></interceptor-ref>
<result name="test_intercep">/test_intercep.jsp</result>
</action>
</package>
<package name="interceptor_stack" namespace="/interceptor_stack"
extends="struts-default">
<interceptors>
<interceptor name="interceptor_one" class="com.interceptor.Interceptor_One"></interceptor>
<interceptor name="interceptor_two" class="com.interceptor.Interceptor_Two"></interceptor>
<!-- 定义一个拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="interceptor_two"></interceptor-ref>
<interceptor-ref name="interceptor_one"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="callIntercep2" class="com.action.CallIntercepAction2">
<!-- 引用拦截器栈 -->
<interceptor-ref name="myStack"></interceptor-ref>
<result name="test_intercep">/test_intercep.jsp</result>
</action>
</package>
<package name="interceptor_default" namespace="/interceptor_default"
extends="struts-default">
<interceptors>
<interceptor name="interceptor_one" class="com.interceptor.Interceptor_One"></interceptor>
<interceptor name="interceptor_two" class="com.interceptor.Interceptor_Two"></interceptor>
<!-- 定义一个拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="interceptor_two"></interceptor-ref>
<interceptor-ref name="interceptor_one"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="callIntercep3" class="com.action.CallIntercepAction3">
<result name="test_intercep">/test_intercep.jsp</result>
</action>
</package>
</struts>