• Struts2核心拦截器


    一、sturts2自带拦截器

     1、params拦截器:提供了框架不可缺少的功能,将请求中的数据设置到Action中的属性上。

     2、staticparams拦截器:将配置文件中通过action元素的子元素param设置的参数设置到对应的Action的属性中。

       <action name="example" class="com.struts2.action.ExampleAction">

                 <param name="exampleFiled">Example</param>

                 <result>success.jsp</result>

       </action>

     3、servletConfig拦截器:提供将源于Servlet API的各种对象注入到Action当中。

      获取Servlet API对象的接口:

      ServletContextAware     设置ServletContext

      ServletRequestAware     设置ServletRequest

      ServletResponseAware   设置ServletResponse

      ParameterAware            设置Map类型的请求参数

      RequestAware               设置Map类型的请求(HttpServletRequest)属性

      SessionAware               设置Map类型的会话(HttpSession)属性

      ApplicationAware           设置Map类型的应用程序的作用域对象(ServletContext)

     4、fileUpload拦截器:将文件和元数据从多重请求(multipart/form-data)转换为常规的请求数据,以便将它们设置在对应的Action的属性上。

     5、validation拦截器:执行数据验证。

     6、workFlow拦截器:提供当数据验证错误时终止流程的功能。

     7、exception拦截器:捕获异常,置于所有的拦截之前。

    二、实现自定义拦截器(间接或直接实现Interceptor接口)

    示例:

    package org.qiujy.common;

     

    import java.util.Map;

     

    import com.opensymphony.xwork2.Action;

    import com.opensymphony.xwork2.ActionInvocation;

    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

     

    /**

     * 权限检查拦截器

     *

     * @author qiujy

     * @version 1.0

     */

    public class AuthorizationInterceptor extends AbstractInterceptor {

     

        /*

         * 拦截Action处理的拦截方法

         *

         */

        public String intercept(ActionInvocation invocation) throws Exception {

     

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

            String userName = (String) session.get("userName");

           

            if (null != userName && userName.equals("test")) {

                System.out.println("拦截器:合法用户登录---");

                return invocation.invoke();

            } else {

                System.out.println("拦截器:用户未登录---");

                return Action.LOGIN;

            }

        }

    }

     三、在sturts.xml文件中配置

    <!DOCTYPE struts PUBLIC

            "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

            "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>

        <package name="my" extends="struts-default">

     

            <interceptors>

            <!-- 定义权限控制拦截器 -->

            <interceptor name="authority"class="org.qiujy.common.AuthorizationInterceptor"/>

            </interceptors>

     

            <!-- 定义全局处理结果 -->

            <global-results>

            <!-- 逻辑名为login的结果,映射到/login.jsp页面 -->

            <result name="login">/login.jsp</result>

            </global-results>

     

            <action name="listall"class="org.qiujy.web.struts2.action.UserAction" method="listAllUser">

                <result name="success">/listall.jsp</result>

                <!-- 使用拦截器 -->

                <interceptor-ref name="defaultStack"/>

                <interceptor-ref name="authority"/>

            </action>

     

            <action name="userOpt"class="org.qiujy.web.struts2.action.UserAction">

                <result name="success">/success.jsp</result>

            </action>

        </package>

    </struts>

    四、拦截器执行原理

     1、拦截器围绕着Action和Result的执行而执行的。

     2、以链式执行,首先执行Action配置的拦截器,在Action和Result执行之后,拦截器再一次执行,并且在执行过程中任何一个拦截器都可以直接返回,

      从而终止余下的拦截器,Action以及Result的执行。

     3、当ActionInvocation的invoke方法执行时,开始执行Action的第一个拦截器,而invoke方法并不是总映射到拦截器。

     4、拦截器执行的过程可以看成是一个递归的过程。

     5、拦截器执行的三个阶段:

         (1)预处理(拦截器可以准备、过滤、改变或者操作任何可以访问的数据,包括Action)。

         (2)方法执行(ActionInvocation的invoke方法执行)。

         (3)Action执行后的处理(客户端呈现数据显示结果)。

    五、自定义拦截器

      拦截器间接或直接地实现了com.opensymphony.xword2.inteceptor.interceptor接口的三个方法。

    (1)void init():拦截器初始化,每个拦截器只执行一次。

    (2)void destory():拦截器实例销毁。

    (3)String intercept(ActionInvocation invocation) throws Exception;执行拦截动作,返回一个字符串作为逻辑视图。

     

  • 相关阅读:
    Mac下终端常用命令
    mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
    Mac版 Intellij IDEA 激活
    解决Pods Unable to find a specification for `xxxxx`问题
    java并发编程(十五)内存可见两种方式 加锁和volatile
    java并发编程(五)正确使用volatile
    java并发编程(十四)同步问题的内存可见性
    java并发编程(十三)经典问题生产者消费者问题
    java并发编程(十三)线程间通信中notifyAll造成的早期通知问题
    java并发编程(十一)线程间的通信notify通知的遗漏
  • 原文地址:https://www.cnblogs.com/boonya/p/2111699.html
Copyright © 2020-2023  润新知