zoukankan      html  css  js  c++  java
  • Struts2拦截器

    基本概念

    Intercetor, 即为拦截器。

    1) 在Struts2中,把每一个功能都用一个个的拦截器实现;用户想用struts的哪个功能的时候,可以自由组装使用。

    2)Struts2中,为了方法用户对拦截器的引用,提供了拦截器栈的定义,里面可以包含多个拦截器。   文件夹(文件, 文件2)  拦截器栈(拦截器,拦截器2)

    3)Struts2中,如果用户没有指定执行哪些拦截器,struts2有一个默认执行的栈,defaultStack;

                一旦如果用户有指定执行哪些拦截器,默认的拦截器栈就不会被执行

     

    拦截器的设计,就是基于组件设计的应用!


    拦截器配置举例

    struts-default.xml文件中,定义了struts提供的所有拦截器!

    //1. 定义拦截器以及拦截器栈
    <interceptors>
        1.1 拦截器定义
        <interceptor name="" class="" /> 
        
        1.2 拦截器栈的定义
        <interceptor-stack name="defaultStack">
        引用了上面拦截器(1.1)
        </interceptor-stack>
    </interceptors>
    
    2. 默认执行的拦截器(栈)
    <default-interceptor-ref name="defaultStack"/>

    ü  API

    |-- Interceptor  拦截器接口

       |-- AbstractInterceptor  拦截器默认实现的抽象类; 一般用户只需要继承此类即可继续拦截器开发

    |-- ActionInvocation 拦截器的执行状态,调用下一个拦截器或Action


    自定义一个拦截器案例

    package loaderman.a_interceptor;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * Action开发测试
     *
     */
    public class HelloAction extends ActionSupport{
    
        public HelloAction() {
            System.out.println("1. Action实例创建了");
        }
    
        @Override
        public String execute() throws Exception {
            System.out.println("3. 执行了请求处理的方法: execute");
            return super.execute();
        }
    }
    package loaderman.a_interceptor;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
    /**
     * 自定义拦截器
     * @author Jie.Yuan
     *
     */
    public class HelloInterceptor implements Interceptor{
    
        // 启动时候执行
        public HelloInterceptor(){
            System.out.println("创建了拦截器对象");
        }
    
        // 启动时候执行
        @Override
        public void init() {
            System.out.println("执行了拦截器的初始化方法");
        }
    
        // 拦截器业务处理方法 (在访问action时候执行? 在execute之前执行?)
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
            System.out.println("2. 执行Action之前");
    
            // 调用下一个拦截器或执行Action  (相当于chain.doFilter(..)
            // 获取的是: execute方法的返回值
            String resultFlag = invocation.invoke();
    
            System.out.println("4. 拦截器,业务处理-结束" + resultFlag);
    
            return resultFlag;
        }
    
    
        @Override
        public void destroy() {
            System.out.println("销毁....");
        }
    
    
    }
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="hello" extends="struts-default">
        
            <!-- 【拦截器配置】 -->
            <interceptors>
            
                <!-- 配置用户自定义的拦截器 -->
                <interceptor name="helloInterceptor" class="loaderman.a_interceptor.HelloInterceptor"></interceptor>
                
                <!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 -->
                <interceptor-stack name="helloStack">
                    <!-- 引用默认栈 (一定要放到第一行)-->
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                    <!-- 引用自定义拦截器 -->
                    <interceptor-ref name="helloInterceptor"></interceptor-ref>
                </interceptor-stack>
                
            </interceptors>
            
            <!-- 【执行拦截器】 -->
            <default-interceptor-ref name="helloStack"></default-interceptor-ref>
            
        
            <!-- Action配置 -->
            <action name="hello" class="loaderman.a_interceptor.HelloAction">
                <result name="success">/index.jsp</result>
            </action>
        
        
        </package>
    </struts>

    拦截器案例

    需求:

             登陆后,显示列表!

    案例准备:

             Struts jar文件

             DbUtils组件

             数据库连接池/ 驱动包

    <body>
           <form method="post" action="${pageContext.request.contextPath }/user_login.action">
               用户名:<input type="text" name="admin.userName"><br/>
               密码:<input type="text" name="admin.pwd"><br/>
               <input type="submit" value="登陆"><br/>
           </form>
      </body>
    public class UserAction extends ActionSupport {
    
        // ---------1. 封装请求数据-----------
        private Admin admin;
        public Admin getAdmin() {
            return admin;
        }
        public void setAdmin(Admin admin) {
            this.admin = admin;
        }
        // ---------2. 调用的Service-----------
        private AdminService adminService = new AdminService();
        
        // 登陆
        public String login() {
            try {
                Admin userInfo = adminService.login(admin);
                // 判断
                if (userInfo == null){
                    // 登陆失败
                    return "input";
                }
                // 登陆成功:数据保存在session中
                ActionContext.getContext().getSession().put("userInfo", userInfo);
                
                // 登陆成功
                return "loginSuccess";
            } catch (Exception e) {
                return ERROR;
            }
        }
        
        // 列表
        public String list() {
            try {
                // 查询全部
                List<Admin> list = adminService.getAll();
                // 保存到request
                ActionContext.getContext().getContextMap().put("listAdmin", list);
                return "list";
            } catch (Exception e) {
                return ERROR;
            }
        }
        
        public String add() {
            return null;
        }
        
        
    }
    <body>
          <h1>欢迎你,${userInfo.userName }</h1>
          <table align="center" border="1">
              <tr>
                  <td>序号</td>
                  <td>编号</td>
                  <td>用户名</td>
                  <td>密码</td>
              </tr>
              <%--@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" --%>
              <!-- 用struts标签迭代数据 -->
              <%@taglib uri="/struts-tags" prefix="s" %>
              <s:iterator var="admin" value="#request.listAdmin" status="st">
                  <tr>
                      <td>
                          <s:property value="#st.count"/>
                      </td>
                      <td>
                          <s:property value="#admin.id"/>
                      </td>
                      <td>
                          <s:property value="#admin.userName"/>
                      </td>
                      <td>
                          <s:property value="#admin.pwd"/>
                      </td>
                  </tr>
              </s:iterator>
              
          </table>
      </body>
    public class UserCheckInterceptor extends AbstractInterceptor{
    
        /**
         * 拦截器业务处理方法
         */
        public String intercept(ActionInvocation invocation) throws Exception {
            // 拿到当前执行的方法名:判断,只有当前方法名不是login,就进行验证
            
            // 获取ActionContext对象
            ActionContext ac = invocation.getInvocationContext();
            
            // 获取action的代理对象
             ActionProxy proxy = invocation.getProxy();
             // 获取当前执行的方法名
             String methodName = proxy.getMethod();
             // 判断
             if (!"login".equals(methodName)) {
                 // 先获取当前登陆的用户
                 Object obj = ac.getSession().get("userInfo");
                 if (obj == null) {
                     // 没有登陆
                     return "input";
                 } else {
                     // 当前用户有登陆
                     return invocation.invoke();
                 }
             } else {
                 // 说明当前用户正在登陆
                 return invocation.invoke();
             }
        }
    
    }
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="user" extends="struts-default">
        
            <!-- 【拦截器配置】 -->
            <interceptors>
                <interceptor name="loginCheck" class="cn.loaderman.interceptor.UserCheckInterceptor"></interceptor>
                <interceptor-stack name="myStack">
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                    <interceptor-ref name="loginCheck"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!-- 【执行拦截器:第一种写法: 当前包下所有的acntion都执行myStack栈】
            <default-interceptor-ref name="myStack"></default-interceptor-ref>
             -->
        
            <!-- 全局配置 -->
            <global-results>
                <result name="error">/error.jsp</result>
            </global-results>
            
            <action name="user_*" class="cn.loaderman.action.UserAction" method="{1}">
                
                <!--第二种写法: 只是在这一个Action中执行myStack栈 
                <interceptor-ref name="defaultStackt"></interceptor-ref>
                <interceptor-ref name="loginCheck"></interceptor-ref>
                -->
                
                <!-- 第三种写法:执行用户栈(与第二种写法一样, 只在当前aciton中执行自定义栈) -->
                <interceptor-ref name="myStack"></interceptor-ref>
                
                
                
                <!-- 1. 登陆失败 -->
                <result name="input">/login.jsp</result>
                
                <!-- 2. 登陆成功 -->
                <result name="loginSuccess" type="redirectAction">user_list</result>
                
                <!-- 3. 列表展示 -->
                <result name="list">/WEB-INF/list.jsp</result>
                
            </action>
            
        </package>
    </struts>
  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/loaderman/p/10032976.html
Copyright © 2011-2022 走看看