一、Struts2的拦截器(Intercept)

  作用:把多个Action中的共有代码,提取至拦截器,从而减少Action中的冗余代码。

  1、Action拦截器

    a、编写interceptor类

public class MyInterceptor implements Interceptor{
    //ActionInvocation 参数的作用:
    //                    1、决定了请求轨迹:ai.invoke();
    //                    2、获取值栈对象:ValueStack vs = ai.getStack();
    //                    3、获取请求访问目标的Action对象:ai.getAction();
    //
    //
    //String 返回值代表路径跳转,类似于String execute();的返回值。
    @Override
    public String intercept(ActionInvocation ai)throws Exception{
        System.out.println("-----myInterceptor invoke----");
        //ai.invoke();
        return "error";
    }

}

    b、struts.xml文件的配置

<package name="p1" extends="struts-default" namespace="/p1">
    <interceptors>
        <interceptor name="myInter" class="xxxxxx.MyInterceptor"/>

        <interceptor-stack name="myStack">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="myInter"/>
        </interceptor-stack>
    </interceptors>

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

  <action name="target" class="xxxx.TargetAction">    <interceptor-ref name="myStack"></interceptor-ref>    <result name="success">/admin/result.jsp</result>  </action>
</package>

    默认拦截器栈:

      配置文件中的<default-interceptor-ref>节点,就是声明了默认拦截器栈,说明这个包下的所有Action,都会自动被该拦截器栈拦截。

    拦截器栈:

      配置文件中的<interceptor-stack>节点便为拦截器栈。可以看到下方的<aciton>节点中直接通过拦截器栈的name属性引用该拦截器栈,拦截器栈中拦截器的配置顺序,决定了拦截器的使用顺序。 

      可以看到,拦截器栈中第一行<interceptor-ref name="defaultStack"/>拦截器,是并没有声明的,而是平白无故自己出来的。下面就要来讨论一下struts2的系统拦截器。

    系统拦截器:

      系统拦截器有许多,提供了不同的功能,举个最常见的例子,struts2接收client数据就是在struts2的系统拦截器parms拦截器中完成的。在该params拦截器中,获得当前访问Action,然后通过反射获取到该Action的成员变量的名字,然后再通过该成员变量的名字,用底层最原始的request.getParameter();方法来获取到client传过来的数据,之后还要进行类型转换等等一系列操作,最后执行ai.invoke()跳转到当前的Action中。

      而这个系统拦截器是在struts2-core.jar中写好并声明过的。我们自定义拦截器之后,只在Action中引入我们自定义的拦截器,系统拦截器就会失效,导致许多便捷的功能都没办法使用。所以,如上面代码所写,在我们引入自己的拦截器时,应该将我们自己的拦截器与系统拦截器绑定在一起,共同组成一个拦截器栈来进行使用,并且一定要注意的是,要将系统拦截器放在第一行。

  2、方法拦截器

    作用:在DMIAction的开发过程中,一个Action中写入了许多方法,这是要拦截的时候应该应用方法拦截器针对方法来进行拦截,而不是粗暴的对整个Action来进行拦截。

    a、编写MethodInterceptor类

public class MyMethodInterceptor extends MethodFilterInterceptor{
    //ActionInvocation ai的作用:
    //                1、控制请求轨迹
    //                2 、获取ValueStack
    //                3、获取目标Action

    //String 返回值:跳转错误页面的路径。

    @Override
    protected String doIntercept(ActionInvocation ai)throws Exception{
        System.out.println("-------MyMethodInterceptor-------");
        //ai.invoke();
        return "error";
    }
}

    b、struts.xml配置文件

<interceptors>
    <interceptor name="myMethodInterceptor" class="xxxx.MyMethodInterceptor">
        <param name="includeMethods">m1,m2</param>
    </interceptor>

    <interceptor-stack name="myStack">
        <interceptor-ref name="defaultStack"></interceptor-ref>
        <interceptor-ref name="myMethodInterceptor"></interceptor-ref>
    </interceptor-stack>

</interceptors>

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

    其中<param name="includemethods">节点即为配置需要拦截哪些方法。还有一种写法为<param name="excludeMethods">即为配置不需要拦截哪些方法,剩余包内的方法均需要拦截。             

浅谈Struts2(四)的更多相关文章

  1. 浅谈struts2之chain

    转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...

  2. 浅谈 Struts2 面试题收藏

    Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...

  3. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  4. 浅谈Struts2(三)

    一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input ty ...

  5. 浅谈struts2的国际化----i18n

    可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization    i 开头,n 结尾. 总共18个字母,今天的主要内容就是环绕这 四个字母. ...

  6. 浅谈Struts2

    学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2. 为什么要用Struts2? 这里列举一些Servlet的缺点: 1.每写一个servlet在web.xml中都要 ...

  7. [SSH 2] 以网站主页面浅谈Struts2配置

    导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点 ...

  8. 小学生之浅谈Struts2与struts1的运行机制

    Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...

  9. 浅谈Struts2(二)

    一.struts2的跳转 1.action跳转JSP a.默认为forward <action name="action1" class="com.liquidxu ...

随机推荐

  1. Windows Azure 社区新闻综述(#70 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 ·   如何选择 No ...

  2. Qt程序设计——txt文本中获取字符串的问题

    QT对txt文本进行读写一般是采用QFile和QTextStream结合使用,在此不细说,主要说一下读取txt文本的注意事项.因为txt文本中有中文也有英文还有数字,要准确获得需要的字串可就要多一个心 ...

  3. 【leetcode系列】Valid Parentheses

    非常经典的问题,使用栈来解决,我这里自己实现了一个栈,当然也能够直接用java自带的Stack类. 自己实现的栈代码: import java.util.LinkedList; class Stack ...

  4. Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D

    游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同相应的动画就是clip,每一个运动都是一段单独的动画,使用Play()或CrossFade(),直接 ...

  5. js substr()与substring()的区别

    定义和用法 substr 方法用于返回一个从指定位置开始的指定长度的子字符串. 语法 stringObject.substr(start [, length ]) 参数 描述 start 必需.所需的 ...

  6. rac安装中遇到的问题

    ssh 建立面密码登陆时成功,但测试时却不成功,原因在于访问远端的文件时权限不够造成的: grid文件夹:755 grid账户下的.ssh文件夹:700 建立公共ip时需要设定域名:192.168.1 ...

  7. SQL中存储过程和自定义函数的区别(转载)

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  8. 浅谈SpringMVC(一)

    一.SpringMVC引言 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MV ...

  9. Chain of Responsibility模式

    熟悉VC/MFC的都知道,VC是“基于消息,事件驱动”,消息在VC开发中起着举足轻重的作用.MFC提供了消息的处理的链式处理策略,处理消息的请求将沿着预定好的路径依次进行处理.消息的发送者并不知道该消 ...

  10. PHP图片裁剪函数(图像不变形)

    PHP图片裁剪函数(图像不变形) <? *exif_imagetype -- 判断一个图像的类型 *说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形 * 参数说明:输入 需要处理图片的 ...