首页 > 代码库 > 浅谈Struts(四)

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

二、文件的上传和下载

  

               

浅谈Struts(四)