JavaWeb基础知识day16——Listener&&Filter

Listener

listener:
    监听器
    作用:
        监听web中的域对象 ServletContext ServletRequest HttpSession
    监听内容:
        监听三个对象的创建和销毁
        监听三个对象属性的变化
        监听session中javabean的状态    

    注意:listener全部是接口        
监听三个对象的创建和销毁
    ServletContextListener
    ServletRequestListener
    HttpSessionListener
监听三个对象属性的变化
    ServletContextAttributeListener
    ServletRequestAttributeListener
    HttpSessionAttributeListener
监听session中javabean的状态
    HttpSessionActivationListener(钝化和活化)
    HttpSessionBindingListener(绑定和解绑)
使用步骤:
    1.编写一个类 实现接口
    2.重写方法
    3.编写配置文件(大部分都是)
演示各个监听器
    监听三个对象的创建和销毁
        ServletContextListener
            创建:服务器启动的时候,会为每一个项目都创建一个servletContext
            销毁:服务器正常关闭的时候,或者项目被移除的时候
            以后用来加载配置文件

Spring中public class ContextLoaderListener extends ContextLoader implements ServletContextListener {}

【Spring中配置ContextLoaderListener[ServletContextListener的实现类]监听器,初始化。。。的内容】
    
        contextConfigLocation
        WEB-INF/application-xxx.xml
    

    
        org.springframework.web.context.ContextLoaderListener
    

        ServletRequestListener
            创建:请求来的时候
            销毁:响应生成的时候
        HttpSessionListener
            创建:
                java中第一次调用request.getSession的时候
                jsp访问的时候创建【jsp内置对象】
            销毁:
                三种情况:
                    session超时
                    手动销毁session【session.invalidate()】
                    服务器非正常关闭
    监听三个对象属性的变化(添加 替换 删除)
        ServletContextAttributeListener
        ServletRequestAttributeListener
        HttpSessionAttributeListener
    监听session中javabean的状态
        注意:这两个接口需要javabean实现.是让javabean感知到自己的状态
        
        HttpSessionBindingListener(绑定和解绑)
            检测java是否添加到session或者从session中移除
        HttpSessionActivationListener(钝化和活化)
            钝化:javabean从session中序列化到磁盘上
            活化:javabean从磁盘上加载到了session中
            可以通过配置文件修改javabean什么时候钝化
                修改一个项目
                    只需要在项目下/meta-info创建一个context.xml
                    内容如下:
                        
                            
                            
                                
                            

                        

Listener在spring中的应用

	
		contextConfigLocation
		WEB-INF/application-xxx.xml
	
	 
	
		org.springframework.web.context.ContextLoaderListener
	



Filter

filter:过滤器
    过滤请求和响应
    作用:
        自动登录.
        统一编码.
        过滤关键字

        ....
    Filter是一个接口
编写filter步骤:
    1.编写一个类
        a.实现filter接口
        b.重写方法
    2.编写配置文件
        a.注册filter
        
            该filter类名
            该filter的全限定名
        

        b.绑定路径
        
            该filter类名
            /*
        

    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的顺序执行的
filterConfig:(了解)
    过滤器的配置对象
    作用:
        获取全局管理者         ServletContext getServletContext()  
        获取当前filter的名称         String getFilterName()  
        获取当前filter的初始化参数     String getInitParameter(String name) 
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-mapping在第一个位置】
    在filter中重写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即可

Filter在spring中的应用

Spring中的CharacterEncondingFilter实现统一处理乱码问题。

    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
        
            forceEncoding
            true
        
    
    
    
        CharacterEncodingFilter
        /*
    

 

 

 

你可能感兴趣的:(Java开发,SpringMVC,java基础,Spring,JavaWeb,listener,filter,spring)