【Struts2】学习和了解拦截器(1)--基础和配置

 

在 struts2 的 Action 中,经常会需要处理一些输入校验,文件上传处理,类型转换处理等等比较通用的操作。可以通过在 配置文件中 指定拦截器,从而可以让 拦截器方法 在 目标方法执行之前 或 之后 自动执行,从而完成通用操作的动态插入。其中 拦截器 与 Action 之间的关系如下图:

三个阶段:
     
     1,ServletDispatcher 实例化一个 ActionProxy 实例,并调用其 execute 方法;
     2,拦截器会先拦截并处理用户请求,然后才到 Action 的 execute 方法处理用户请求;
     3,返回一个逻辑视图名,系统负责将该逻辑视图对应的资源显示给用户;
 
下面通过示例来了解一下如何在 struts2 中配置 拦截器,在 struts.xml 中定义拦截器只需要使用 <interceptor .../> 元素 为 拦截器类 指定一个 拦截器名,就完成了 拦截器 的定义。格式为:
 
<interceptor name="拦截器名" class="拦截器实现类"/>
 
如果希望传入参数给配置的拦截器,则需要在 <interceptor /> 下使用 <param .../> 子元素。格式如下:
 
<interceptor name="拦截器名" class="拦截器实现类">
    <!-- param 可出现 0 次,也可出现 N 次 -->
    <param name="参数名">参数值</param>
</interceptor>
 
也可以将多个 拦截器 组合成一个 拦截器栈,使用 <interceptor-stack .../> 元素进行配置,因为拦截器栈可能由多个已定义的拦截器组成,因此需要使用 <interceptor-ref ../> 来引用已定义的多个拦截器。格式如下:
 
<interceptor-stack name="拦截器栈-1">
    <interceptor-ref name="拦截器-10"/>
    
    <!-- 可以看到这里可以引用其他已定义好的 拦截器栈 -->
    <interceptor-ref name="拦截器栈-2"/>
    
    <!-- 可配置更多的拦截器或拦截器栈的引用 -->
    
</interceptor-stack>
 
在定义拦截器栈中如何为各个引用的各个拦截器指定参数,格式如下:
 
<interceptor-stack name="拦截器栈-1">
    <interceptor-ref name="拦截器-10">
        <param name="参数-101">参数值101</param>
        <param name="参数-102">参数值102</param>
        ... ...
    </interceptor-ref>
</interceptor-stack>
 
其实,在上面也提到了另外一种为 拦截器 指定参数的方式:就是在定义拦截器时指定参数。那么,如果在使用拦截器的时候指定的参数(名)与定义拦截器时指定的同一个参数的参数值不同,则以 使用拦截器 的参数设置为准。
 
下面配置示例参考是在 Action 中使用 拦截器 的配置:
 
<!-- 定义全部的拦截器 -->
<interceptors>
    <!-- 定义拦截器 -->
    <interceptor name="auth" class="com.example.auth.AuthInterceptor"/>
    <interceptor name="validUser" class="com.example.valid.UserInterceptor">
        <param name="param-1">参数值-1</param>
    </interceptor>
</interceptors>

<!-- 配置自定义的 Action -->
<action name="login" class="com.example.auth.LoginAction">
    <result name="error">/error.jsp</result>
    <result name="success>/welcome</result>
    <!-- 拦截器一般配置在 result 元素之后 -->
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="auth"/>
    <interceptor-ref name="validUser">
        <param name="param-1">hello</param>
    </interceptor-ref>
</action>
 

你可能感兴趣的:(struts2,拦截器,Interceptor)