浅谈Struts(四)

一、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">即为配置不需要拦截哪些方法,剩余包内的方法均需要拦截。

二、文件的上传和下载

  

               

时间: 2024-08-13 19:14:02

浅谈Struts(四)的相关文章

Office 365 SharePoint 迁移浅谈 (四)使用Migration Tools

下边我们再来谈下微软最近推出的另外一款可以迁移SharePoint 的产品,SharePoint Migration Tools,它的功能会比SharePoint Migration API要强很多,本身也是图形化界面的操作方式,比较简单,但是这个产品目前还只支持SharePoint 2013,目的端也只支持国际版O365,现在还是个测试版本. 之前使用SharePoint Migration API时Version History,权限这些都没办法迁移,但是SharePoint Migrati

浅谈DevExpress&lt;四&gt;:TreeList中的拖拽功能

本篇要实现的目标,简单来说就是把一个treelist的节点用鼠标拖到另外的节点(自身或其他的listview)上,如下图: 1  2  3  首先,在窗口中拉入两个listview,第一个创建三列(上),第二个创建两列(下),如下图: 为第一个listview创建一些节点: 定义一个取得拖拽对象中节点的方法: private TreeListNode GetDragNode(IDataObject data) { return (TreeListNode)data.GetData(typeof(

浅谈算法和数据结构: 四 快速排序

原文:浅谈算法和数据结构: 四 快速排序 上篇文章介绍了时间复杂度为O(nlgn)的合并排序,本篇文章介绍时间复杂度同样为O(nlgn)但是排序速度比合并排序更快的快速排序(Quick Sort). 快速排序是20世纪科技领域的十大算法之一 ,他由C. A. R. Hoare于1960年提出的一种划分交换排序. 快速排序也是一种采用分治法解决问题的一个典型应用.在很多编程语言中,对数组,列表进行的非稳定排序在内部实现中都使用的是快速排序.而且快速排序在面试中经常会遇到. 本文首先介绍快速排序的思

安卓开发_浅谈Android动画(四)

Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属性动画类 方法 描述 setDuration(long duration) 设置动画持续时间的方法 setEvaluator(TypeEvaluator value) 设置插值计算的类型 setInterpolator(TimeInterpolator value) 设置时间插值器的类型 addUp

浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)

主要内容: SP的算法流程 SP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 SP与CoSaMP的性能比较 一.SP的算法流程 压缩采样匹配追踪(CoSaMP)与子空间追踪(SP)几乎完全一样,因此算法流程也基本一致. SP与CoSaMP主要区别在于"Ineach iteration, in the SP algorithm, only K new candidates are added, while theCoSAMP algorithm adds 2K

浅谈javascript继承【读javascript设计模式第四章节继承有感】

javascript继承,无任是类式继承,原型式继承还是渗元式继承都是通过不同方法去围绕着prototype转,简单分析下三种不同继承方法是如何围绕prototype转的 一:类似继承,先上关键代码 function extend(subClass,supClass){ var fn = function(){}; fn.prototype = supClass.prototype; subClass.prototype = new fn(); subClass.prototype.constr

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色 本篇文章是系列文章中的第四篇,也是最后一篇,本篇文章需要前三篇的文章知识作为基础,前三篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 简介 生产环境下的数据是如果可以写在资产负债表上的话,我想这个资产所占的数额一定不会

浅谈Spring(四)AOP实例

在<浅谈Spring(三)AOP原理>中我详细的介绍了AOP的基本概念和实现原理,这里给出代码示例. 一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class TestAspect { public void doAfter(JoinPoint jp) { System

!! 浅谈Java学习方法和后期面试技巧

浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要的,比如循环系列.For,while,do-while.这方面只要大家用心点基本没什么难点. 二.面向对象:oop面向对象的时候,偏重理论,相信这方面的文章也很多,大家可以多看看,在这就不说了.重点掌握面向对象的三大特征和基本原理. 三.java核心一:这方面主要偏重API,所以在学习了这章的时候,