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;
    }
}

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

  核心代码:

  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>
时间: 2024-12-10 04:50:59

JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现的相关文章

struts2第四天——拦截器和标签库

一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能,有很多拦截器,每次执行一部分拦截器,比如一些默认拦截器等 默认拦截器的位置在 core的jar包的struts-default.xml里边<interceptor>标签里边 二.拦截器基本原理 拦截器在什么时候执行: 在action对象创建之后和action方法执行之前进行执行(使用在相关位置打断

Struts2环境配置和登陆功能的实现

最近在学习SSH框架,通过用struts实现一个简单的登陆功能,来学习struts相关知识,着重了解了struts的配置. 1.在Eclipse下创建StrutsDemo项目,并将struts2所必须的jar包导入lib目录下. 主要有如下7个jar包:commons-fileupload.commons-io.freemarker.javassiat.ognl.struts2-core.xwork. 2.在src目录下建立一个struts.xml文件用于配置struts. struts.xml

struts2标签库(1)

struts2标签库 struts2标签库是一个比较完善而且功能强大的标签库,该标签库大大的简化了试图页的代码,从而能够提高视图页面的维护效率,struts2标签库功能强大,而且简单易用. 优点 struts2标签库的标签不依赖于任何表现层技术,其提供了大部分的标签,能够在各种表现层技术中使用,包括最常见的jsp页面Velocity和FreeMarket等模板技术中也能够使用.以下是他的优点: 1)易于安装.标签库很容易从一个jsp项目迁移到其他的项目中. 2)易于扩展.可以无限制地扩展和增加j

Struts2拦截器和标签

一.struts2拦截器 1.struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面. 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器. 3 struts2里面默认拦截器位置,在struts2-core.jar jar包里面有一个struts-default.xml文件,在里面配置了默认拦截器. 4拦截器在action被创建之后,方法执行之前执行. 5拦截器的底层使用的两个原理 (1)aop思想:struts2的

struts2.1.6教程五、拦截器

在前面我们已经初步使用过拦截器,下面继续细细探讨. 1.概述strust2中的拦截器 拦截器是Struts2框架的核心,它主要完成解析请求参数.将请求参数赋值给Action属性.执行数据校验.文件上传等工作.Struts2设计的灵巧性,拦截器起了关键性的作用,当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可:如果不需要该功能时,也只需要取消该拦截器的配置即可.    Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在stru

Struts2系列:(12)拦截器

学习拦截器 1.拦截器能够做什么?(Why 和 What) 2.如何定义拦截器?(How to use) 3.如何注册拦截器?(How to use) 4.如何使用拦截器?(How to use) 1.拦截器能够做什么? Struts2 拦截器在访问某个 Action 方法之前或之后实时拦截的可插拔的组件. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 实现原理:当请求action时,Struts 查找配置文件,根据其配置实例化拦截器对象,并形成一个列表,

struts2框架学习笔记6:拦截器

拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; //拦截器的第一种创建方式 //拦截器的生命周期:随项目启动创建,随项目关闭而销毁 public class MyInterceptor implements Intercepto

Struts2整体回顾 之 Action,拦截器,值栈及关联关系

一.首先看一下当我们使用Struts时,一个请求所走的流程. 二.值栈的示意图 三.一个请求中,拦截器和值栈的时序图 4.请求.值栈结合图 Struts2整体回顾 之 Action,拦截器,值栈及关联关系,布布扣,bubuko.com

自定义简单的struts2的s标签

一:自定标签前需要了解的知识: BodyTagSupport类的方法: 编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(); 他们执行顺序如下: doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag() doStartTag()方法可返回EVAL_BODY_