struts2拦截器的使用(二)
2012-06-11 11:03
399 查看
在struts2中的拦截器的基础上进行修改,以实现Interceptor接口的方式创建一个新的拦截器,如下所示:
Java代码
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation)
throws Exception {
System.out.println("开始拦截");
invocation.invoke();
System.out.println("结束拦截");
return "success";
}
}
方式二、继承AbstractInterceptor抽象类
代码如下所示:
Java代码
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyAbstractInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation)
throws Exception {
System.out.println("Abs开始拦截");
String result = invocation.invoke();
System.out.println("Abs结束拦截");
return result;
}
}
AbstractInterceptor的源代码如下所示:
Java代码
public abstract class AbstractInterceptor
implements Interceptor
{
public void init()
{
}
public void destroy()
{
}
public abstract String intercept(ActionInvocation paramActionInvocation)
throws Exception;
}
方式三、继承MethodFilterInteceptor类
Java代码
public class MyMethodFilterInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation)
throws Exception {
System.out.println("method开始拦截");
String result=invocation.invoke();
System.out.println("method结束拦截");
return result;
}
}
配置文件如下所示:
Xml代码
<package name="myDemo" namespace="/demo" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="demo.action.MyInterceptor" />
<interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />
<interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />
</interceptors>
<action name="login" class="demo.login.action.LoginAction">
<result name="success">/WEB-INF/jsp/success.jsp</result>
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="absInterceptor" />
<interceptor-ref name="methodInterceptor" />
</action>
</package>
或者为
Xml代码
<package name="myDemo" namespace="/demo" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="demo.action.MyInterceptor" />
<interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />
<interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />
</interceptors>
<interceptor-stack name="myInterceptors">
<interceptor-ref name="myInterceptor" />
<interceptor-ref name="absInterceptor" />
<interceptor-ref name="methodInterceptor" />
</interceptor-stack>
<action name="login" class="demo.login.action.LoginAction">
<result name="success">/WEB-INF/jsp/success.jsp</result>
9ee1
<interceptor-ref name="myInterceptors" />
</action>
</package>
分析:当配置到此,实质便为LoginAction配置了三个拦截器,当我们点击登录时会在控制台打印出如下语句:
开始拦截
Abs开始拦截
method开始拦截
--先执行拦截器,再执行此Action
method结束拦截
Abs结束拦截
结束拦截
其实当我们点击登录时,本来是要访问LoginAction,最后会把LoginAction的执行结果传递给访问者。但是当我们配置了拦截器时,当我们去访问Action时,会首先被拦截,随后拦截器执行一些操作后才会继续把请求传递下去。下面作图说明拦截流程:
结合现实理解:比如我们要去某楼层找某人(LoginAction)取一个资源(LoginAction处理后返回的结果,这里表现为success.jsp),(1)进楼层时会被大门保安拦截检查(第一个拦截器:MyInterceptor拦截器),(2)检查通过后再进电梯时会被电梯保安员检查(第二个拦截器:MyAbstractInterceptor拦截器),(3)检查通过后再上到某楼层会被楼层保安员检查(第三个拦截器:MethodAction拦截器
),(4)检查通过后会找到某个(LoginAction),并与某个交谈(LoginAction处理),随后某个人和我们会带着请求的资源出去,(5)出去时,会依次被楼层,电梯,大门保安员检查,最终检查通过。某个人把资源给我们(实质就是返回请求资源给客户端)。 其实拦截器的执行流程和过滤器差不多,所以我们不防用过滤器的眼光来看这些拦截器。
注意:我们在为LoginAction配置拦截器时,都没使用默认的拦截器,是原因这里的测试可以不用,但是以后在我们使用自定义的拦截器是,一定要加上默认的拦截器,否则会导致许多不可预知的结果。
补充:从上面的图并结合代码,我们可以看出拦截器的核心过程应该是ActionInvocation对这些拦截器回调处理,下面我们我们作图分析ActionInvocation的实现过程:
上面分别使用了三种方式来创建自定义的拦截器,第一种方式是最原始的实现方式,第二种方式的好处是我们可以不必重写所有的方法,较常用。第三种方式进行了扩展.
Java代码
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation)
throws Exception {
System.out.println("开始拦截");
invocation.invoke();
System.out.println("结束拦截");
return "success";
}
}
public class MyInterceptor implements Interceptor { @Override public void destroy() { } @Override public void init() { } @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("开始拦截"); invocation.invoke(); System.out.println("结束拦截"); return "success"; } }
方式二、继承AbstractInterceptor抽象类
代码如下所示:
Java代码
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyAbstractInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation)
throws Exception {
System.out.println("Abs开始拦截");
String result = invocation.invoke();
System.out.println("Abs结束拦截");
return result;
}
}
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyAbstractInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("Abs开始拦截"); String result = invocation.invoke(); System.out.println("Abs结束拦截"); return result; } }
AbstractInterceptor的源代码如下所示:
Java代码
public abstract class AbstractInterceptor
implements Interceptor
{
public void init()
{
}
public void destroy()
{
}
public abstract String intercept(ActionInvocation paramActionInvocation)
throws Exception;
}
public abstract class AbstractInterceptor implements Interceptor { public void init() { } public void destroy() { } public abstract String intercept(ActionInvocation paramActionInvocation) throws Exception; }
方式三、继承MethodFilterInteceptor类
Java代码
public class MyMethodFilterInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation)
throws Exception {
System.out.println("method开始拦截");
String result=invocation.invoke();
System.out.println("method结束拦截");
return result;
}
}
public class MyMethodFilterInterceptor extends MethodFilterInterceptor { @Override protected String doIntercept(ActionInvocation invocation) throws Exception { System.out.println("method开始拦截"); String result=invocation.invoke(); System.out.println("method结束拦截"); return result; } }
配置文件如下所示:
Xml代码
<package name="myDemo" namespace="/demo" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="demo.action.MyInterceptor" />
<interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />
<interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />
</interceptors>
<action name="login" class="demo.login.action.LoginAction">
<result name="success">/WEB-INF/jsp/success.jsp</result>
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="absInterceptor" />
<interceptor-ref name="methodInterceptor" />
</action>
</package>
<package name="myDemo" namespace="/demo" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="demo.action.MyInterceptor" /> <interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" /> <interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" /> </interceptors> <action name="login" class="demo.login.action.LoginAction"> <result name="success">/WEB-INF/jsp/success.jsp</result> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="absInterceptor" /> <interceptor-ref name="methodInterceptor" /> </action> </package>
或者为
Xml代码
<package name="myDemo" namespace="/demo" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="demo.action.MyInterceptor" />
<interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />
<interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />
</interceptors>
<interceptor-stack name="myInterceptors">
<interceptor-ref name="myInterceptor" />
<interceptor-ref name="absInterceptor" />
<interceptor-ref name="methodInterceptor" />
</interceptor-stack>
<action name="login" class="demo.login.action.LoginAction">
<result name="success">/WEB-INF/jsp/success.jsp</result>
9ee1
<interceptor-ref name="myInterceptors" />
</action>
</package>
<package name="myDemo" namespace="/demo" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="demo.action.MyInterceptor" /> <interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" /> <interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" /> </interceptors> <interceptor-stack name="myInterceptors"> <interceptor-ref name="myInterceptor" /> <interceptor-ref name="absInterceptor" /> <interceptor-ref name="methodInterceptor" /> </interceptor-stack> <action name="login" class="demo.login.action.LoginAction"> <result name="success">/WEB-INF/jsp/success.jsp</result> <interceptor-ref name="myInterceptors" /> </action> </package>
分析:当配置到此,实质便为LoginAction配置了三个拦截器,当我们点击登录时会在控制台打印出如下语句:
开始拦截
Abs开始拦截
method开始拦截
--先执行拦截器,再执行此Action
method结束拦截
Abs结束拦截
结束拦截
其实当我们点击登录时,本来是要访问LoginAction,最后会把LoginAction的执行结果传递给访问者。但是当我们配置了拦截器时,当我们去访问Action时,会首先被拦截,随后拦截器执行一些操作后才会继续把请求传递下去。下面作图说明拦截流程:
结合现实理解:比如我们要去某楼层找某人(LoginAction)取一个资源(LoginAction处理后返回的结果,这里表现为success.jsp),(1)进楼层时会被大门保安拦截检查(第一个拦截器:MyInterceptor拦截器),(2)检查通过后再进电梯时会被电梯保安员检查(第二个拦截器:MyAbstractInterceptor拦截器),(3)检查通过后再上到某楼层会被楼层保安员检查(第三个拦截器:MethodAction拦截器
),(4)检查通过后会找到某个(LoginAction),并与某个交谈(LoginAction处理),随后某个人和我们会带着请求的资源出去,(5)出去时,会依次被楼层,电梯,大门保安员检查,最终检查通过。某个人把资源给我们(实质就是返回请求资源给客户端)。 其实拦截器的执行流程和过滤器差不多,所以我们不防用过滤器的眼光来看这些拦截器。
注意:我们在为LoginAction配置拦截器时,都没使用默认的拦截器,是原因这里的测试可以不用,但是以后在我们使用自定义的拦截器是,一定要加上默认的拦截器,否则会导致许多不可预知的结果。
补充:从上面的图并结合代码,我们可以看出拦截器的核心过程应该是ActionInvocation对这些拦截器回调处理,下面我们我们作图分析ActionInvocation的实现过程:
上面分别使用了三种方式来创建自定义的拦截器,第一种方式是最原始的实现方式,第二种方式的好处是我们可以不必重写所有的方法,较常用。第三种方式进行了扩展.
相关文章推荐
- struts2拦截器使用(用户session失效后的统一页面指向)
- struts2技巧与解惑——使用包(package)和拦截器(interceptor)分配和处理权限
- 使用Struts2的拦截器实现权限控制
- Struts2使用过滤器和拦截器进行简单权限校验
- Struts2拦截器的使用收藏
- struts2拦截器使用注解
- 防止表单重复提交(拦截器)一些struts2标签的使用
- Struts2拦截器的使用
- Struts2使用自定义拦截器导致Action注入参数丢失、url参数
- Struts2登录拦截器的使用
- 在Struts2下使用[拦截器]配合[session监听器]实现在线会员统计与防止重复登录
- Struts2使用拦截器完成权限控制示例
- Struts2拦截器的使用 (详解)
- struts2注解使用拦截器interceptor和interceptor-stack
- Struts2拦截器的使用 (详解)
- Struts2拦截器的使用
- springmvc和struts2拦截器的简单使用以及配置
- struts2的拦截器(1):拦截器的配置和使用
- struts2默认拦截器与自定义拦截器在使用时的注意事项
- 使用struts2自定义拦截器,要引入defaultStack