day16-(listener&filter)

回顾:
ajax:
    异步请求
原生的ajax(了解)
    1.创建一个核心对象 XMLHttpRequest
    2.编写回调函数
        xmlhttp.onreadystatechange=function(){
            if(xmlhttp.readyState==4 && xmlhttp.status==200){
                alert(xmlhttp.responseText);
            }
        }
    3.open操作
        xmlhttp.open("请求方式","请求路径");
    4.send操作
        xmlhttp.send([参数]);
            post请求的参数放在send里面
            注意:若请求方式为post且有参数 必须设置一个头
jquery中ajax
    掌握:
        $.get(url,params,function(data){},type);
            type:以后常用的是json
        $.post(url,params,function(data){},type);
    了解:
        jquery对象.load(...)
    理解:
        $.ajax(选项)
            选项:
                url
                type
                data
                success:fn
                error:fn
                dataType:"json"
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
listener(了解) 监听器
filter(★)    过滤器
//////////////////////////
listener:
    监听器
    作用:
        监听web中中的域对象 ServletContext ServletRequest HttpSession
    监听内容:
        监听三个对象的创建和销毁
        监听三个对象属性的变化
        监听session中javabean的状态
    
    注意:listener全部是接口
        
监听三个对象的创建和销毁
    ServletContextListener
    ServletRequestListener
    HttpSessionListener
监听三个对象属性的变化
    ServletContextAttributeListener
    ServletRequestAttributeListener
    HttpSessionAttributeListener
监听session中javabean的状态
    HttpSessionActivationListener(钝化和活化)
    HttpSessionBindingListener(绑定和解绑)

使用步骤:
    1.编写一个类 实现接口
    2.重写方法
    3.编写配置文件(大部分都是)
    
演示各个监听器
    监听三个对象的创建和销毁
        ServletContextListener
            创建:服务器启动的时候,会为每一个项目都创建一个servletContext
            销毁:服务器关闭的时候,或者项目被移除的时候
            以后用来加载配置文件
        ServletRequestListener
            创建:请求来的时候
            销毁:响应生成的时候
        HttpSessionListener
            创建:
                java中第一次调用request.getSession的时候
                jsp访问的时候创建
            销毁:
                三种情况:
                    session超时
                    手动销毁session
                    服务器非正常关闭
    监听三个对象属性的变化(添加 替换 删除)
        ServletContextAttributeListener
        ServletRequestAttributeListener
        HttpSessionAttributeListener
    监听session中javabean的状态
        注意:这两个接口需要javabean实现.是让javabean感知到自己的状态
        
        HttpSessionBindingListener(绑定和解绑)
            检测java是否添加到session或者从session中移除
        HttpSessionActivationListener(钝化和活化)
            钝化:javabean从session中序列化到磁盘上
            活化:javabean从磁盘上加载到了session中
            可以通过配置文件修改javabean什么时候钝化
                修改一个项目
                    只需要在项目下/meta-info创建一个context.xml
                    内容如下:
                        <Context>
                            <!--
                                maxIdleSwap    :1分钟 如果session不使用就会序列化到硬盘.
                                directory    :itheima 序列化到硬盘的文件存放的位置.
                            -->
                            <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
                                <Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
                            </Manager>
                        </Context>
        
//////////////////////////////////////////////////
案例1-自动登录
需求:
    登录的时候,勾选自动登录,登录成功之后,关闭浏览器,下一次访问网站的时候完成登录操作(自动登录).
技术分析:
    filter
    cookie
//////////////////////////////////
filter:过滤器
    过滤请求和响应
    作用:
        自动登录.
        统一编码.
        过滤关键字
        ....
    Filter是一个接口
编写filter步骤:
    1.编写一个类
        a.实现filter接口
        b.重写方法
    2.编写配置文件
        a.注册filter
        b.绑定路径
    3.测试

Filter接口的方法:
    init(FilterConfig config):初始化操作
    doFilter(ServletRequest request, ServletResponse response, FilterChain chain):处理业务逻辑
    destroy() :销毁操作
filter的生命周期(了解)
    filter单实例多线程
    filter在服务器启动的时候 服务器创建filter 调用init方法 实现初始化操作
    请求来的时候,创建一个线程 根据路径调用dofilter 执行业务逻辑
    当filter被移除的时候或者服务器正常关闭的时候 调用destory方法 执行销毁操作.
FilterChain:过滤链
    通过chain的dofilter方法,可以将请求放行到下一个过滤器,直到最后一个过滤器放行才可以访问到servlet|jsp
    doFilter()放行方法
★url-pattern配置
    3种
    完全匹配    必须以"/" 开始  例如: /a/b
    目录匹配    必须以"/" 开始 以"*"结束  例如:/a/b/*
    后缀名匹配    以"*."开始 以字符结束   例如 :  *.jsp  *.do  *.action
例如:
    afilter  路径  /*
    bFilter  路径  /demo4
★一个资源有可能被多个过滤器匹配成功,多个过滤器的执行顺序是按照web.xml中filter-mapping的顺序执行的
    
///////////////////////////////
步骤分析:
    1.数据库和表
        create database day16;
        use day16;
        create table user(
            id int primary key auto_increment,
            username varchar(20),
            password varchar(20)
        );
        insert into user values(null,'tom','123');
    2.web项目
        jar包 工具类 配置文件
    3.新建一个登录页面 表单
    4.表单提交 loginservlet
        接受用户名和密码
        调用service完成登录操作,返回值User
        判断user是否为空
            若不为空,将user放入session中
                判断是否勾选了自动登录
                    若勾选了:
                        需要将用户名和密码写回浏览器
    5.下次访问网站的时候
        过滤器拦截任意请求
            判断有无指定的cookie
                有cookie,获取用户名和密码
                调用service完成登录操作,返回user
                当user不为空的时候将user放入session中.

当我们换用jack登录的时候发现登录不了
    自动登录只需要登录一次:当session中没有用户的时候
    访问有些资源是不需要自动登录的(和登录还有注册相关的资源)
    
    修改filter的逻辑:
        首先判断session中是否有user
            若没有 并且访问的路径不是和登录注册相关的时候
                才去获取指定的cookie
/////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////
filter总结
    filterConfig:(了解)
        过滤器的配置对象
        作用:
            获取全局管理者
            获取当前filter的名称
            获取当前filter的初始化参数
    
    filter-mapping的子标签(理解)
        servlet-name:匹配那个servlet 值写的是serlvet标签中servlet-name的值
            建议:不要在一个filter中重复的匹配servlet
                例如: serlvet的url-pattern为  /a/b/hello   serlvetname:HelloServlet
                    如果filter中的url-pattern  /*
                    最好不要在写 servlet-name:HelloServlet
                
        dispatcher:
            匹配哪种请求
            默认的是REQUEST,一旦显式的写出来哪种请求,默认就不起作用了
                理解
                    REQUEST:从浏览器发送过来的请求(默认) 理解
                    FORWARD:转发过来的请求 理解
                
                了解
                    ERROR:因服务器错误而发送过来的请求
                    INCLUDE:包含过来的请求
//////////////////////////                
//////////////////////////
案例2-统一字符编码
需求:
    以前我们开发的时候若有参数,第一步都是设置编码,才不会出现乱码,通过过滤器设置,到servlet或者jsp上的时候已经没有乱码问题
技术分析:
    filter 配置路径/* 过滤器的第一个位置
    在filter中重写getParameter(加强)
步骤分析:
    我们只需要在filter中 对request进行加强(例如:只对request.getParameter()进行加强)

    方法加强:
        1.继承(获取构造器)
        2.装饰者模式(静态代理)
        3.动态代理
        
    装饰者书写步骤:
        1.要求装饰者和被装饰者实现同一个接口或者继承同一个类
        2.装饰者中要有被装饰者的引用
        3.对需要加强方法进行加强
        4.对不需要加强的方法调用原来的方法即可
        
    加强request.getParameter(String key)
        首先请求的方式不同,处理的方式也不同
            获取请求的方法
            若是get请求
                new String(value.getBytes("iso8859-1"),"utf-8");
            若是post请求
                只需要设置一句话
                request.setCharacterEncoding("utf-8");
                
    最后将包装过的request对象(MyRequest)传递给servlet即可
///////////////////////////////////////////////////                
///////////////////////////////////////////////////
 关于获取参数的方法
    String getParameter(String name);// arr[0]
    String[] getParameterValues(String name);// map.get(name)
    Map<String,String[]> getParameterMap();
            
            

//////////////////////////////////////////////
//////////////////////////////////////////////
listener 监听器
    监听javaweb中的三个域对象
    
    监听三个对象的创建和销毁
        ServletContextListener
        ServletRequestListener
        HttpSessionListener
    监听三个对象属性的变化
        ServletContextAttributeListener
        ServletRequestAttributeListener
        HttpSessionAttributeListener
    监听javabean在session中的状态
        注意:    javabean实现的接口 不需要在web.xml中配置
        HttpSessionActivationListener(javabean的活化和钝化)
        HttpSessionBindingListener(添加到session中还是从session中移除)
    
    编写步骤:
        1.编写一个类  实现接口
        2.编写配置文件 
            <listener>
                <listener-class>....
            </listener>
/////////////////////////////////////
filter 接口,过滤请求和响应
    编写步骤:
        1.编写一个类 
            实现filter 重写三个方法
        2.编写配置文件    
            注册filter 绑定路径
    filter的生命周期(了解)
    url-pattern配置(和servlet一样)
        一个路径匹配到多个filter的时候,执行顺序有有web.xml中filter-mapping的顺序来决定的
    FilterChain
        必须放行才有可能到下一个Filter或者资源上
//////////////////////

猜你喜欢

转载自www.cnblogs.com/chenyanlong/p/10004576.html
今日推荐