标签:des style blog class code java
虽然没学过struts1吧,但是了解到struts1中并没有拦截器, 到Struts2才有,它是基于WebWork发展起来的, 顾名思义,说到拦截器大家首先肯定会想到它是拦截东西的,起到一个限制的作用,那么好,在这里它是拦截什么的呢?在struts2中拦截器是用来拦截Action的,在执行Action之前拦截器会起一定的作用,执行一些预先处理的代码, 接着去执行Action中相关的方法,之后,又会回到拦截器里面,接着去执行后续的一些操作。刚刚学习,如果我理解的不对的话,请大家留言指正啊。
Struts2拦截器的实现原理我认为还是相对简单的,当请求struts2的Action时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器
public class MyInterceptor implements Interceptor{
@Override
public void destroy() {
System.out.println("--destroy()--");
}
@Override
public void init() {
System.out.println("--init()--");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("--intercept()--");
Map<String,Object> session= invocation.getInvocationContext().getSession();
if(session.get("username")!=null){
return invocation.invoke();
}
else{
return"error";
}
}
}
//当需要对action中指定的方法需要拦截的时候需要用的MethodFilterInterceptor
//public class MyInterceptor extends MethodFilterInterceptor{
public class MyInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("--intercept()--");
Map<String,Object> session= invocation.getInvocationContext().getSession();
if(session.get("username")==null){
return "error";
}
else{
return"user";
}
}
}
不过,struts中还提供了抽象类来简化这一步骤。public class MyInterceptor extends MethodFilterInterceptor和public class MyInterceptor extends AbstractInterceptor,其中AbstractInterceptor提供了init()和destroy()的空实现,使用时只需要覆盖intercept()方法;而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来过滤执行该过滤器的Action的方法。可以通过param来加入或者排除需要过滤的方法。
<interceptors>
<interceptor name="myInterceptor" class="MyInterceptor"></interceptor>
<interceptor-stack name="defaultInterceptorStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>(必须加,否则出错)
</interceptor-stack>
</interceptors>
配置都是在struts.xml里面的,下面是我的一个小例子,注意:在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack。
<package name="testLogin" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="MyInterceptor"></interceptor>
<interceptor-stack name="defaultInterceptorStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>(必须加,否则出错)
</interceptor-stack>
</interceptors>
(这句是设置所有Action自动调用的拦截器堆栈)
<default-interceptor-ref name="defaultInterceptorStack"></default-interceptor-ref>
<action name="Login" class="LoginAction">
<result name="user">/user.jsp</result>
<result name="error">/error.jsp</result>
<interceptor-ref name="defaultInterceptorStack"></interceptor-ref>
</action>
</package>
说明:至于前面说到的Action里边必须在最后引用struts2自带的拦截器缺省堆栈defaultStack,实际我也不是很清
楚,不过后边还会深入的理解这一知识点,再来补充。
这样,我们的拦截器就能使用啦,这只是拦截器很基础的一部分,简单能实现了,刚刚接触ssh,随后还需要通过总结来填充这一部分的学习,记得视频中讲到它与filter有一定的关系与区别,当时没有仔细的考虑,接下来会通过对filter的学习比较它与interceptor的区别。
ssh2——struts2 拦截器,布布扣,bubuko.com
标签:des style blog class code java
原文地址:http://blog.csdn.net/cjr15233661143/article/details/24811969