A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马文帅 初级黑马   /  2019-6-30 10:37  /  870 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2019-7-4 09:46 编辑

第一部分:监听器(组成和分类)
1、监听器的概述
        1.1 一个类监听另一个java的变化

        1.2 组成
        (1)事件源:汽车
        (2)监听器:报警器
        (3)在事件源绑定监听器:在汽车上安装报警器
        (4)事件:踢汽车一脚,报警器会响

        (5)在js里面 button,绑定事件 onclick

        (6)点击button按钮,触发onclick事件,调用onclick里面的方法执行


1.2 javaweb中的监听器(三类)
        (1)创建监听器步骤
        = 创建servlet的步骤:
        == 创建类继承HttpServlet,doget和dopost方法
        == 在web.xml中配置

        第一类:监听三个域对象的创建和销毁
        (1)servletContext:范围整个web项目。服务器启动时候创建,服务器关闭销毁
        = 创建类实现接口 ServletContextListener
        == 两个方法
        === contextInitialized(ServletContextEvent sce) :servletcontext域对象创建时候执行这个方法
        === contextDestroyed(ServletContextEvent sce) :servletcontext域对象销毁时候执行这个方法
        
        = 在web.xml中配置
                 <listener>
                        <listener-class>cn.itcast.listener01.TestContextListener</listener-class>
                  </listener>


        (2)session:范围会话。request.getSession()创建。
                        session销毁有三种方式:调用方法;默认过期时间30分钟;非正常关闭服务器销毁

                        cookie分成两类:
                        = 会话级别的cookie:关闭浏览器cookie销毁
                        = 持久化的cookie:在一定时候一直有效,使用方法 setMaxAge(秒)
                        = 销毁持久化cookie:setMaxAge(0),路径一致 setPath("/");

                        关闭浏览器session是否销毁?不会销毁
                        
        = 创建列实现接口 HttpSessionListener
        == 方法:
        === sessionCreated(HttpSessionEvent se) :session创建时候执行这个方法
        === sessionDestroyed(HttpSessionEvent se) :session销毁时候执行这个方法
        = 在web.xml中进行配置

        = 问题:
        访问一个JSP会不会创建session? 默认会创建session对象
        访问一个Servlet会不会创建session? 不写request.getSession(),不会创建session对象
        访问一个html会不会创建session? 不会


        (3)request:范围一次请求
        = HttpServletRequest 和 ServletRequest

        = 创建类实现ServletRequestListener 接口
        = 两个方法:
        == requestInitialized(ServletRequestEvent sre) :request创建时候执行这个方法
        == requestDestroyed(ServletRequestEvent sre) :request域销毁时候执行这个方法

        问题:
        访问JSP的时候会不会创建request对象?     会创建request对象
        访问Servlet的时候会不会创建request对象? 会创建request对象
        访问一个html的时候会不会创建request?    会创建request对象

        = 技巧:ctrl f5 无缓存刷新
        
        = 如果在servlet里面向域对象设置值,在jsp获取域对象里面的值
        == el表达式
        == jstl标签库的forEach标签
        <c:forEach var="" items="">


        第二类:监听三个域对象里面的属性的变化(添加值,替换,移除)
        = 向域对象添加值 使用setAttribute("itcast","aa")
        = 替换值:  setAttribute("itcast","bb")
        = 移除:removeAttribute();

        (1)实现接口
        ServletContextAttributeListener:监听servletcontext域属性的变化
        = attributeAdded(ServletContextAttributeEvent scab) :向域对象添加值执行这个方法
        = attributeReplaced(ServletContextAttributeEvent scab) 替换域对象添加值执行这个方法
        = attributeRemoved(ServletContextAttributeEvent scab) :移除域对象添加值执行这个方法


        HttpSessionAttributeListener :监听HttpSession域属性的变化
        = attributeAdded(HttpSessionBindingEvent se) :向域对象添加值执行这个方法
        = attributeReplaced(HttpSessionBindingEvent se) :替换域对象添加值执行这个方法
        = attributeRemoved(HttpSessionBindingEvent se)  :移除域对象添加值执行这个方法
        
        
        ServletRequestAttributeListener:监听Request域属性的变化
        = attributeAdded(ServletRequestAttributeEvent se) :向域对象添加值执行这个方法
        = attributeReplaced(ServletRequestAttributeEvent se) :替换域对象添加值执行这个方法
        = attributeRemoved(ServletRequestAttributeEvent se)  :移除域对象添加值执行这个方法


        = 在jsp中嵌入java代码有三种方式
        <%!  %>: 定义的变量成员变量
        <%=  %>
        <%   %>

        = 代码
            <%--  向session域里面设置值,替换值,移除值 --%>
            <%
                //设置值
                session.setAttribute("aa", "itcast");
                //替换值
                session.setAttribute("aa", "itheima100");
                //移除
                session.removeAttribute("aa");
             %>


        第三类:监听session域里面javabean的变化
        (0)两个特点:
        第一个要求:不需要配置,自动感知到
        第二个要求:在javabean里面直接实现接口

        = 在javabean里面实现这个 HttpSessionBindingListener接口
        (1)绑定     :把javabean放到session里面
        (2)解除绑定 :从session域里面把javabean移除

        = 在javabean里面实现HttpSessionActivationListener接口
        (3)钝化 :正常关闭服务器,把session序列化到本地硬盘
        (4)活化 :反序列化到项目中

        = 如果进行session序列化的操作时候,session里面的对象必须实现序列化接口的对象
        

1.4 监听器总结
        (1)监听器的组成

        (2)javaweb中三类监听器
        第三类:监听监听session域里面javabean的变化(绑定、解除绑定、钝化、活化)
                = 不需要配置,实现接口在javabean里面实现
        
        (3)三个域对象创建和销毁
        (4)访问jsp、servlet、html是否会创建session对象?
        (5)访问jsp、servlet、html是否会创建request对象?


第二部分:过滤器(重点)
1、什么是过滤器
        1.1 发送请求,到目标资源之前,进行过滤

        1.2 饮水机:到饮水机节水,最终的目的:到杯子中,到杯子之前,经过过滤网(过滤)

        1.3 地铁安检:到列车上,到列车之前,安检(过滤)

        1.4 烟:香烟主体(纸+烟草)+ 过滤嘴

        1.5 过滤敏感词汇

        1.6 javaweb的过滤器都可以过滤 servlet、jsp、html


2、实现过滤器
        2.1 创建类实现接口 Filter接口,实现接口里面的三个方法
        2.2 在web.xml中配置
          <filter>
                <filter-name>filter01</filter-name>
                <filter-class>cn.itcast.filter01.TestFilter01</filter-class>
          </filter>
          <filter-mapping>
                <filter-name>filter01</filter-name>
                <url-pattern>/*</url-pattern>
          </filter-mapping>

        2.3 过滤器的入门案例
        (1)在创建类中实现三个方法,doFilter方法,实现过滤的逻辑
        (2)过滤之后,放行,只有放行到目标资源
                 //放行到目标资源
                chain.doFilter(req, resp);

3、FilterChain对象的简介
        3.1 方法:doFilter(ServletRequest request, ServletResponse response) ,放行操作

        3.2 过滤链:一个请求可以 被 多个过滤器进行过滤,每个过滤器只有做放行才可以到下一个过滤器
        
        3.3 如果配置多个过滤器,过滤器执行顺序与下面配置有关
         <filter-mapping>
                <filter-name>filter02</filter-name>
                <url-pattern>/*</url-pattern>
          </filter-mapping>

4、过滤器的生命周期
        4.1 servlet的生命周期:
        (1)第一次访问时候创建,init方法
        (2)每次请求servlet,调用service方法
        (3)servlet销毁时候,调用destroy方法

        4.2 servlet在服务器启动时候创建
        (1)<load-on-startup>2</load-on-startup>

        4.3 过滤器的生命周期
        (1)过滤器什么时候创建:服务器启动时候创建,执行init方法
        (2)每次访问请求时候,如果过滤器可以过滤到,执行doFilter方法
        (3)过滤器销毁,执行destroy()方法

5、FilterConfig对象的介绍
        5.1 在servlet里面对象servletConfig

        5.2 做三件事情
        第一件:获取过滤器的名称 getFilterName()

        第二件:获取初始化参数
        (1)在过滤器里面配置初始化参数
          <filter>
                  <filter-name>filter03</filter-name>
                <filter-class>cn.itcast.filter01.TestFilter03</filter-class>
                <init-param>
                        <param-name>username</param-name>
                        <param-value>mary</param-value>
                </init-param>
                 <init-param>
                        <param-name>password</param-name>
                        <param-value>1314520</param-value>
                </init-param>
          </filter>

          (2)String getInitParameter(String name) :根据参数的名称得到值

          (3)Enumeration getInitParameterNames()  :获取所有的初始化参数的名称

          (4)代码
                  //获取初始化参数
                //根据名称参数的值
                String username = config.getInitParameter("username");
                String password = config.getInitParameter("password");
                System.out.println("************** "+username+" :: "+password);
               
                System.out.println("==========================");
                //得到所有的初始化参数的名称
                Enumeration<String> enumration = config.getInitParameterNames();
                //获取每一个名称
                while(enumration.hasMoreElements()) {
                        String name = enumration.nextElement();
                        //根据名称得到值
                        String value = config.getInitParameter(name);
                        System.out.println("++++++++ "+name+" :: "+value);
                }


        第三件:获取servletcontext对象,getServletContext()
        (1)直接使用 getServletContext()方法得到servletcontext对象


6、过滤器的配置
        6.1 在 <filter-mapping>里面配置
        (1)<url-pattern>
        = 有三种
        == 完全路径匹配   /servlet1
        == 目录匹配       /aa/*    /*
        == 扩展名匹配     *.action   *.do

        == 优先级:完全 > 目录 > 扩展名

        (2)<servlet-name>:专门过滤某一个servlet

        (3)<dispatcher>:
        REQUEST: 过滤请求,默认就是这个值
        FORWARD:专门过滤转发的操作
        INCLUDE:过滤包含
        ERROR:异常

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马