zoukankan      html  css  js  c++  java
  • JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

    一、自定义拦截器

      1.架构

      

      2.拦截器创建

    //拦截器:第一种创建方式
    //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
    public class MyInterceptor implements Interceptor{}
    //创建方式2: 继承AbstractInterceptor -> struts2的体贴
    //帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
    public class MyInterceptor2 extends AbstractInterceptor{}
    //创建方式3:继承MethodFilterInterceptor 方法过滤拦截器
    //功能: 定制拦截器拦截的方法.
    //    定制哪些方法需要拦截.
    //    定制哪些方法不需要拦截
    public class MyInterceptor3 extends MethodFilterInterceptor{}

      3.拦截器api

            //放行
            String result = invocation.invoke();
            //前处理
            System.out.println("MyInterceptor3 的前处理!");
            //放行
            String result = invocation.invoke();
            //后处理
            System.out.println("MyInterceptor3 的后处理!");
            //不放行,直接跳转到一个结果页面
            //不执行后续的拦截器以及Action,直接交给Result处理结果.进行页面跳转
            return "success";

      4.拦截器配置

        <package name="inter" namespace="/" extends="struts-default" >
        <interceptors>
        <!-- 1.注册拦截器 -->
            <interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3"></interceptor>
        <!-- 2.注册拦截器栈 -->
            <interceptor-stack name="myStack">
                <!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
                <interceptor-ref name="myInter3">
                    <!-- 指定哪些方法不拦截
                     <param name="excludeMethods">add,delete</param> -->
                     <!-- 指定哪些方法需要拦截 -->
                     <param name="includeMethods">add,delete</param>
                </interceptor-ref>
                <!-- 引用默认的拦截器栈(20个) -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>    
        </interceptors>
        <!-- 3.指定包中的默认拦截器栈 -->
            <default-interceptor-ref name="myStack"></default-interceptor-ref>
            <action name="Demo1Action_*" class="cn.itcast.a_interceptor.Demo1Action" method="{1}" >
                <!-- 为Action单独指定走哪个拦截器(栈) 
                <interceptor-ref name="myStack"></interceptor-ref>-->
                <result name="success" type="dispatcher" >/index.jsp</result>
            </action>
        </package>
            <!-- 补充知识:定义全局结果集 -->
            <global-results>
                <result name="toLogin" type="redirect" >/login.jsp</result>
            </global-results>

    二、struts2标签

      1.标签体系

     

      2.struts2标签结构

      3.控制标签

      准备Action然后再到jsp练习struts2标签

    public class Demo2Action extends ActionSupport {
    
        public String execute() throws Exception {
            
            List<String> list = new ArrayList<>();
            list.add("tom");
            list.add("jerry");
            list.add("jack");
            list.add("rose");
            list.add("hqy");
            
            ActionContext.getContext().put("list", list);
            return SUCCESS;
        }
    
    }

      开始练习控制标签:

     <%@ taglib prefix="s" uri="/struts-tags" %>
    <!-- 遍历标签 iterator -->
    <!-- ------------------------------------- -->
    <s:iterator value="#list" >
        <s:property /><br>
    </s:iterator>
    <!-- ------------------------------------- --><hr>
    <s:iterator value="#list" var="name" >
        <s:property value="#name" /><br>
    </s:iterator>
    <!-- ------------------------------------- --><hr>
    <s:iterator begin="1" end="100" step="1"  >
        <s:property />|
    </s:iterator>
    <!-- ------------------if else elseif------------------- --><hr>
    
    <s:if test="#list.size()==4">
        list长度为4!
    </s:if>
    <s:elseif test="#list.size()==3">
        list长度为3!
    </s:elseif>
    <s:else>
        list不3不4!
    </s:else>

      4.数据标签

    <!-- ------------------property 配合ognl表达式页面取值 ------------------- --><hr>
    <s:property value="#list.size()" />
    <s:property value="#session.user.name" />

      5.表单标签

        <!-- struts2表单标签 -->
        <!-- 好处1: 内置了一套样式.  -->
        <!-- 好处2: 自动回显,根据栈中的属性  -->
        <!-- theme:指定表单的主题
                xhtml:默认
                simple:没有主题
         -->
        <s:form action="Demo3Action" namespace="/" theme="xhtml" >
            <s:textfield name="name" label="用户名"  ></s:textfield>
            <s:password name="password" label="密码" ></s:password>
            <s:radio list="{'男','女'}" name="gender" label="性别" ></s:radio>
            <s:radio list="#{1:'男',0:'女'}" name="gender" label="性别" ></s:radio>
            <s:checkboxlist list="#{2:'抽烟',1:'喝酒',0:'烫头'}" name="habits" label="爱好" ></s:checkboxlist>
            <s:select list="#{2:'大专',1:'本科',0:'硕士'}" headerKey="" headerValue="---请选择---" name="edu" label="学历" >
            </s:select>
            <s:file name="photo" label="近照" ></s:file>
            <s:textarea name="desc" label="个人简介" ></s:textarea>
            <s:submit value="提交" ></s:submit>
        </s:form>

      6.非表单标签

       在action中添加错误信息

    this.addActionError("我是错误信息 哈哈哈");

      取出错误信息

        <s:actionerror/>

    三、练习:登陆功能

      核心代码:

      Action代码:

    public class UserAction extends ActionSupport implements ModelDriven<User> {
        private User user = new User();
        private UserService us  = new UserServiceImpl();
        
        public String login() throws Exception {
            //1 调用Service 执行登陆操作
            User u = us.login(user);
            //2 将返回的User对象放入session域作为登陆标识
            ActionContext.getContext().getSession().put("user", u);
            //3 重定向到项目的首页
            return "toHome";
        }
    
        @Override
        public User getModel() {
            return user;
        }
    }

      Service层代码:

    public class UserServiceImpl implements UserService {
        private UserDao ud = new UserDaoImpl();
        @Override
        public User login(User user) {
            //打开事务
            HibernateUtils.getCurrentSession().beginTransaction();
            //1.调用Dao根据登陆名称查询User对象
            User existU = ud .getByUserCode(user.getUser_code());
            //提交事务
            HibernateUtils.getCurrentSession().getTransaction().commit();
            
            if(existU==null){
                //获得不到=>抛出异常提示用户名不存在
                throw new RuntimeException("用户名不存在!");
            }
            //2 比对密码是否一致
            if(!existU.getUser_password().equals(user.getUser_password())){
                //不一致=>抛出异常提示密码错误
                throw new RuntimeException("密码错误!");
            }
            //3 将数据库查询的User返回
            return existU;
        }
    }

      Dao层代码:

    public class UserDaoImpl implements UserDao {
        @Override
        public User getByUserCode(String user_code) {
            //HQL查询
            //1.获得Session
            Session session = HibernateUtils.getCurrentSession();
            //2 书写HQL
            String hql = "from User where user_code = ? ";
            //3 创建查询对象
            Query query = session.createQuery(hql);
            //4 设置参数
            query.setParameter(0, user_code);
            //5 执行查询
            User u = (User) query.uniqueResult();
            return u;
        }
    }

    四、练习:校验登陆拦截器

      核心代码:

      拦截器代码:

    public class LoginInterceptor extends MethodFilterInterceptor {
        //指定不拦截登陆方法. 其他方法都拦截
        
        @Override
        protected String doIntercept(ActionInvocation invocation) throws Exception {
            
            //1.获得session
            Map<String, Object> session = ActionContext.getContext().getSession();
            //2.获得登陆标识
            Object object = session.get("user");
            //3.判断登陆标识是否存在
            if(object == null){
                //不存在=>没登录=>重定向到登录页面
                return "toLogin";
            }else{
                //存在=>已经登陆=>放行
                return invocation.invoke();
            }    
        }
    }

      struts.xml配置文件代码:

    <?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>
        <!-- 指定struts2是否以开发模式运行
                1.热加载主配置.(不需要重启即可生效)
                2.提供更多错误信息输出,方便开发时的调试
         -->
        <constant name="struts.devMode" value="true"></constant>
        <package name="crm" namespace="/" extends="struts-default" >
            <interceptors>
                <!-- 注册拦截器 -->
                <interceptor name="loginInterceptor" class="cn.itheima.web.interceptor.LoginInterceptor"></interceptor>
                <!-- 注册拦截器栈 -->
                <interceptor-stack name="myStack">
                    <interceptor-ref name="loginInterceptor">
                        <param name="excludeMethods">login</param>
                    </interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!-- 指定包中的默认拦截器栈 -->
            <default-interceptor-ref name="myStack"></default-interceptor-ref>
            <!-- 定义全局结果集 -->
            <global-results>
                <result name="toLogin" type="redirect" >/login.jsp</result>
            </global-results>
            <global-exception-mappings>
                <!-- 如果出现java.lang.RuntimeException异常,就将跳转到名为error的结果 -->
                <exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
            </global-exception-mappings>
            
        
            <action name="CustomerAction_*" class="cn.itheima.web.action.CustomerAction" method="{1}" >
                <result name="list" >/jsp/customer/list.jsp</result>
                <result name="toList" type="redirectAction">
                     <param name="actionName">CustomerAction_list</param>
                     <param name="namespace">/</param>
                 </result>
            </action>
            <action name="UserAction_*" class="cn.itheima.web.action.UserAction" method="{1}" >
                <result name="toHome" type="redirect" >/index.htm</result>
                <result name="error"  >/login.jsp</result>
            </action>
        </package>
    </struts>

      补充知识:检查当前页面的父页面是否是自己,不是的话进行跳转,解决页面嵌套问题。

    <script type="text/javascript">
        window.onload=function(){
            
            if(window.parent != window){// 如果是在框架中
                //就让框架页面跳转到登陆页面
                window.parent.location.href = "${pageContext.request.contextPath}/login.jsp";
            }
            
        };
    </script>
  • 相关阅读:
    BZOJ1000 A+B Problem
    网络最大流
    树形结构
    BZOJ2521 最小生成树 最小割
    HDU5266 LCA 树链剖分LCA 线段树
    BZOJ3991 寻宝游戏 LCA 虚树 SET
    深度优先搜索DFS
    斯特林数
    Noip2017 普及 T3 Chess
    键盘自动机
  • 原文地址:https://www.cnblogs.com/xieyupeng/p/7045904.html
Copyright © 2011-2022 走看看