zoukankan      html  css  js  c++  java
  • Struts2拦截器学习 简单飞扬


      一、什么是拦截器

    提到拦截,使我不得不 想起武侠剧中劫匪们常说的一句话:“此山是我开,此树是我栽,要打此路过,留下买路财!”。难不成程序中也有“打劫”的,说的没错,拦截器就是个打劫的。 在现实生活中,劫匪劫的大都是钱财,当然也有别的什么,那么程序中的“劫匪”劫的又是什么呢?或者说程序中为什么需要它?在我们的日常编程中少不了写一些 重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其它地方中同样需要,在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这 一两个处需要,我们采取这种办法,还说的过去,但是如果系统对这段代码过于依赖,也就是这段代码在系统中出现的过多,如果那一天我们发现这段代码中在某些 地方还需要完善,我们是不是要着个修改它们呢?我估计没有人会这么做,它严重违反了软件开发中一条非常重要的DRY规则,不写重复代码。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西,只是为了在某个程序执行前后,动态的增加一些功能(以前所写通用代码块)或进行一些检查工作。那么这个拦截器到底是怎么实现的呢?实际上它是用Java中的动态代理来实

    现的,具体可以参考设计模式学习笔记(十六)—Proxy模式》。

    二、拦截器在Struts2中的应用

    对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多,在此我就不一一列举了,具体可以参考《Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解》。

    那么怎么在struts2中定义自己的拦截器呢?

    很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:

    publicinterface Interceptor extends Serializable {

        void destroy();

        void init();

        String intercept(ActionInvocation invocation) throws Exception;

    }

    1)    init():在拦截器执行之前调用,主要用于初始化系统资源。

    2)    destroty():init()对应,用于拦截器执行之后销毁资源。

    3)    intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回一个真正的,也就是该actionexecute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。

    通常我们使用拦截器并不需要申请资源,为此Struts2还为我们提供了一个AbstractInterceptor类,该类的init()destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。

    下面创建一个判断用户是否登录的拦截器。代码如下:

    /** 
     *
     * 
    @author <a href="mailto:flustar2008@163.com">flustar</a>
     * 
    @version 1.0 
     * Creation date: Feb 12, 2008 5:05:28 PM
     
    */


    import java.util.Map;
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

    @SuppressWarnings(
    "serial")
    public class CheckLoginInterceptor extends AbstractInterceptor {

        @SuppressWarnings(
    "unchecked")
        
    public String intercept(ActionInvocation actionInvocation) throws Exception {
             System.out.println(
    "begin check login interceptor!");

                
    // 检查Session中是否存在user

                Map session 
    = actionInvocation.getInvocationContext().getSession();

                String username 
    = (String) session.get("user");

                
    if (username != null && username.length() > 0{

                    
    // 存在的情况下进行后续操作。

                    System.out.println(
    "already login!");

                    
    return actionInvocation.invoke();

                }
     else {

                    
    // 否则终止后续操作,返回LOGIN

                    System.out.println(
    "no login, forward login page!");

                    
    return Action.LOGIN;

                }


            }



        }



    创建好拦截器后,还不能使用,还需要我们在struts.xml中配置一下。

    下面看一下怎么配置拦截器。

    <interceptors>

               <interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />

    </interceptors>

    这个定义好的拦截器在Action中怎么使用呢?使用方法很简单,如下:

    <action name=" " class=" " >

               <result> </result>

               <interceptor-ref name="checkLogin" />

    </action>

    一旦我们为某个action引用了自定义的拦截器,struts2默认的拦截器就不会再起作用,因此还需要引用默认拦截器。

    <action name=" " class=" " >

               <result> </result>

               <interceptor-ref name="checkLogin" />

                         <interceptor-ref name="defaultStack" />

    </action>

    但是我们这么做似乎也不太方便,因为如果拦截器checkLogin需要被多个action引用的话,每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。

    <interceptors>

               <interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />

               <!—-定义一个拦截器栈-->

               <interceptor-stack name="mydefault">

                  <interceptor-ref name="defaultStack" />

                  <interceptor-ref name="checkLogin" />

               </interceptor-stack>

    </interceptors>

    <default-interceptor-ref name="mydefault" />

    另外,struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类,该类继承AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单,就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被拦截,那些不需要。通常在引用该拦截器时指定。

    <interceptor-ref name="  ">

           <param name="exculdeMethods"></param>

           <param name="includeMethods"></param>    

    </interceptor-ref>

    exculdeMethods:是不被拦截的方法,如果有多个以逗号分隔。

    includeMethods:需要被拦截的方法,如果有多个以逗号分隔。

    转自:http://www.blogjava.net/flustar/archive/2008/02/17/interceptor.html

  • 相关阅读:
    剑指offer-翻转单词序列
    剑指offer-丑数
    剑指offer-把数组排成最小的数
    mysql笔记(13)-视图的概念和使用
    mysql笔记(12)-外键约束的添加和删除
    mysql笔记(11)-约束的添加、修改和删除
    mysql笔记(10)-数据的插入和更新(insert/update/case)
    mysql笔记(9)-表的创建和删除(drop/truncate/delete)
    mysql笔记(8)-嵌套查询之in、exists
    mysql笔记(7)-多表查询之自然连接、外连接
  • 原文地址:https://www.cnblogs.com/jiandanfy/p/1072509.html
Copyright © 2011-2022 走看看