温故知新:struts2_06其他功能:拦截器

struts2的拦截器其实和过滤器是一个概念,虽然自定义的过滤器用的不多,但是struts2的核心功能都是用拦截器来实现的,异常捕获,参数绑定,和国际化等等。

写一个最简单的过滤器的例子,感受一下自定义过滤器的使用就好。
先上action
 1 package demo.action;
 2 
 3 public class InterceptorDemo {
 4     
 5     private String name;
 6     
 7     public String execute(){
 8         System.out.println("我是Execute的方法");
 9         System.out.println("name:" + name);
10         return "success";
11     }
12     
13     //get/set方法略
14     
15 }
16 
创建一个interceptor只需要新建一个类,继承struts2的AbstractInterceptor,重写intercept方法
 1 package demo.interceptor;
 2 
 3 import com.opensymphony.xwork2.ActionInvocation;
 4 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 5 
 6 public class InterceptorDemo extends AbstractInterceptor{
 7 
 8     private static final long serialVersionUID = -1739072578539674220L;
 9 
10     @Override
11     public String intercept(ActionInvocation invocation) throws Exception {
12         
13         System.out.println("我是一个炫酷的拦截器");
14         
15         //校验用户是否登陆等操作
16         //ServletActionContext.getContext().getSession()...
17         
18         //校验用户是否有权限访问等操作
19         //invocation.getProxy().getActionName()...
20         
21         return invocation.invoke();
22     }
23 
24 }
25 
如此一来,拦截器就创建好了,接下来就是对拦截器的配置,看到struts.xml
 1    <package name="interceptorDemo" extends="struts-default" namespace="/">
 2    
 3        <!-- 需要在包内声明拦截器,之后可以定义在action中定义对声明拦截器的引用 -->
 4        <interceptors>
 5            <interceptor name="InterceptorDemo" class=demo.interceptor.InterceptorDemo"/>
 6        </interceptors>
 7    
 8        <!-- 在指定的action中使用指定的拦截器 -->
 9       <action name="interceptorDemo" 
10             class="demo.action.InterceptorDemo" 
11             method="execute">
12             <interceptor-ref name="InterceptorDemo"/>
13       </action>
14
15    </package>
将定义好的拦截器添加到某个action的定义中,让拦截器拦截对应的action,但如果如上述那样去配置的话,除了自定义拦截器的功能,struts2 的拦截器功能都会失效,action中的name值根本拿不到。配置中的每个包都会继承struts-default这个包,简单看一下struts-default.xml这个文件
 1 <interceptor-stack name="defaultStack">
 2   <interceptor-ref name="exception"/>
 3  <interceptor-ref name="alias"/>
 4  <interceptor-ref name="servletConfig"/>
 5  <interceptor-ref name="i18n"/>
 6  <interceptor-ref name="prepare"/>
 7  <interceptor-ref name="chain"/>
 8  <interceptor-ref name="scopedModelDriven"/>
 9  <interceptor-ref name="modelDriven"/>
10  <interceptor-ref name="fileUpload"/>
11  <interceptor-ref name="checkbox"/>
12  <interceptor-ref name="multiselect"/>
                    ...
     <interceptor-ref name="debugging"/>
    </interceptor-stack>
                    ...
    <default-interceptor-ref name="default-stack"/>
                    ...
上述就是部分配置,定义了默认的拦截器栈,也就是一组拦截器,从名字就可以看出很多功能都由拦截器完成,所以,自定义的拦截器也需要引用这一组拦截器,需要在配置中添加默认拦截器栈
1 <action name="interceptorDemo" 
2             class="org.duyt.action.InterceptorDemo" 
3             method="execute">
4             <interceptor-ref name="InterceptorDemo"/>
5             <interceptor-ref name="defaultStack"/>
6 </action>
或者定义一组拦截器栈
 1        <interceptors>
 2            <interceptor name="InterceptorDemo" class="demo.interceptor.InterceptorDemo"/>
 3         
 4            <!-- 声明的拦截器栈一定要引用defaultStack,不然struts2无法发挥作用,参数封装等最基本的功能都会失效 -->
 5            <interceptor-stack name="selfStack">
 6                <interceptor-ref name="InterceptorDemo"/>
 7                <interceptor-ref name="defaultStack"/>
 8            </interceptor-stack>
 9        </interceptors>
10    
11          <!-- 在指定的action中使用指定的拦截器 -->
12       <action name="interceptorDemo" 
13             class="demo.action.InterceptorDemo" 
14             method="execute">
15             <interceptor-ref name="selfStack"/>
16       </action>
这样,自定义的拦截器就能融入到完整的功能之中。

posted on 2014-11-02 09:28 都较瘦 阅读(138) 评论(0)  编辑  收藏 所属分类: MVCFramework


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

公告

博客定位:囿于目前的水平,博客定位在记录自己的学习心得和随手的练习

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜