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>
  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/xieyupeng/p/7045904.html
Copyright © 2011-2022 走看看