zoukankan      html  css  js  c++  java
  • Document

    回顾:
    listener(了解)
        监听器,监听javaweb中三个域对象
        监听对象的创建和销毁
            ServletContextListener
                在项目启动的时候加载配置文件
            ServletRequestListener
            HttpSessionListener
        监听对象的属性的变化
            ServletContextAttributeListener
            ServletRequestAttributeListener
            HttpSessionAttributeListener
        监听javabean在session中状态
            注意:让javabean自动感知在session中的状态,不需要在配置文件配置
            HttpSessionActivationListener(钝化和活化)
            HttpSessionBindingListener(绑定和解绑)
        编写:
            1.编写监听器
            2.编写配置文件
                <listener>
                    <listener-class>
                </listener>
        ///////////////////////////////////
    filter(★)
        过滤器,过滤请求和响应
        filter编写步骤:
            1.编写一个类 
                必须实现Filter接口
                必须重写方法
            2.编写配置文件
                注册filter
                绑定路径
        filter生命周期方法:
            doFilter(request,response,chain)
                使用步骤:
                 1.强转
                 2.编写自己的业务
                 3.放行
        url-pattern的配置:
            完全匹配
            目录匹配
            后缀名匹配
        多个filter都匹配到的时候,执行时机是根据在xml中的filter-mapping顺序决定
        
        filter-mapping中的两个子标签
            servlet-name:过滤指定的servlet
            dispatcher:过滤那种方式过来的请求
                REQUEST:只过滤从浏览器发送过来的请求 (默认) 一旦显式的写出来disparcher 默认的就不起作用了
                FORWARD::只过滤请求转发过来的请求
                
    ////////////////////////////////////////////////////////////////////
    注解:了解注解,可以使用注解
    servlet3.0:体验下注解,完成文件上传
    类加载器(了解)
    动态代理(★):加强方法
    ////////////////////////////////////////////////////////////////////
    案例1-模拟junit测试
    需求:
        在一个类的方法中添加一个@MyTest,在另一个类的main方法中,就可以执行带有@MyTest的方法
    技术分析:
        注解
        反射
    ////////////////////////////
    注解:
        jdk5之后提供了一个特性,和类 接口同级
        格式:
            @interface 注解名{}
        作用:
            编译检查
            替代配置文件
            定义注解(元注解:注解上的注解)
            分析代码(用到反射)
        ////////////////////////
        java中3个注解(理解)
            @Override:声明该方法是从分类上继承过来的,执行编译期的检查
            @SuppressWarnings:抑制警告 值有好多,只需要知道一个 all  抑制所有的警告
            @Deprecated:声明 该方法不赞成使用
        ////////////////////////
        自定义注解(理解)
            注解属性:
                注解本质就是一个接口,接口中可以有常量和抽象方法
                抽象方法在注解中就称之为注解属性
            注解属性类型:
                基本类型
                String
                Class
                Annotation
                Enum:枚举
                以上类型对应的一维数组
            注意:
                一旦注解有属性了,使用注解的时候必须赋值,(除非这个注解属性有默认值)
            
            赋值的格式:
                @注解名(属性名=属性值)
                若注解类型为数组,且只有一个值的时候,可以有两种写法
                    方式1:
                        属性名 = { 值 }
                    方式2:
                        属性名=属性值
                若属性名为value的时候,且只需要为这个value属性赋值的时候,value可以省略
        
            元注解:(理解)
                定义在注解上的注解
                    @Retention  规定注解保留到什么阶段  值为RetentionPolicy的三个枚举值
                        SOURCE:只在代码中保留,在字节码文件中就删除了
                        CLASS:在代码和字节码文件中保留
                        RUNTIME:所有阶段都保留
                    
                    @Target 规定注解作用在什么上面     值为ElementType的枚举值
                        TYPE:作用在类 接口 等上面
                        METHOD:作用方法上面
                        FIELD:作用字段上面
        /////////////////////////////////////////////////////
        步骤分析:(了解)
            1.定义一个注解 @MyTest
            2.在一个测试类 MyTestTest 上的添加几个方法
                在方法上添加@MyTest
                
            3.在另一个有主方法的类上添加main方法
                运行main方法的时候,需要将带有 @MyTest注解的方法执行
                
    /////////////////////////////
    案例扩展:
        获取连接的工具类,通过配置四个参数
    步骤分析:
        1.自定义一个注解JDBCInfo
            添加元注解:
                在程序运行的时候使用  @Retention
                只能作用在方法上      @Target
            添加注解属性
                String driverClass() default "com.mysql.jdbc.Driver";
                String url();
                String username() default "root";
                String password();
        2.在jdbcutils工具类中提供一个getConnection,在方法上面添加一个注解 @JDBCInfo(...) 
            getConnection方法需要进行的操作:获取注解上的四个属性值
                获取字节码文件
                获取该方法上的注解
                获取注解的值
        3.运行的时候可以通过getConnection获取一个连接
    /////////////////////////////
    案例2-完成文件上传
    技术分析:
        文件上传
            servlet3.0
            commons-fileupload
            框架
    ////////////////////////////
    servlet3.0
        3.0支持注解开发,没有web.xml这个文件了
        内嵌了文件上传功能
        /////////////////////////
        例如:
            创建servlet
                在类上面添加 @WebServlet(urlPatterns={ "/demo2", "/demo21" },loadOnStartup=2)
            创建listener
                在类上添加 @WebListener
            创建filter
                在类上添加 @WebFilter(urlPatterns="/*")
        /////////////////////
    文件上传
        浏览器端的要求:
            表单的提交方法必须是post
            必须有一个文件上传组件  <input type="file" name=""/>
            必须设置表单的enctype=multipart/form-data
        服务器端的要求:
            servlet3.0中
                需要在servlet中添加注解
                    @MultipartConfig
                接受普通上传组件 (除了文件上传组件):request.getParameter(name属性的值)
                接受文件上传组件 request.getPart(name属性的值);
                    getName():获取的name的属性值
                获取文件名:
                     part.getHeader("Content-Disposition"):获取头信息 然后截取
    //////////
    上传注意的问题:
        名字重复 随机名称
            在数据库中提供两个字段,
                一个字段用来存放文件的真实名称  1.jpg
                另一个字段用来存放文件存放路径  g:/sdfasdf.jpg
            随机名称:
                uuid
                时间戳
        文件安全
            重要的文件存放在 web-inf 或者 meta-inf 或者 服务器创建一个路径
            不是很重要的文件 项目下
            
        文件存放目录
            方式1:日期
            方式2:用户
            方式3:文件个数
            方式4:随机目录
                mkdirs
        ///////////////////////////////////
    类加载器:(了解)
        类加载:
            我们编写的.java文件,jvm会将变成.class文件.该文件要想运行,必须加载内存中,然后会生成一个对象.Class对象
        类加载器层次结构
            引导类加载器    rt.jar
            扩展类加载器    ext/*.jar
            应用类加载器    我们自己编写类
        全盘负责委托机制:
            当一个类运行的时候,有可能有其他类,应用类加载器询问扩展类加载器:你加载过这些类吗?
            扩展类加载器在向上问(引导类加载器):你加载过这些类吗?
            引导类加载器:我查查,有一个是我负责,我加载.
            扩展类加载器:接下来我来查,有几个是我负责,我加载,还有几个类我已经加载完成了,你可以直接使用
            应用类加载器:收到了 剩下的我来
    ////////////////////////    
    案例3-统一编码
    技术分析:
        动态代理
    /////////////////////
    静态代理书写步骤:
        1.要求被装饰者和装饰者实现同一个接口或者继承同一个类
        2.在装饰者中要有被装饰者的引用
        3.对需要加强的方法进行加强
        4.对不需要加强的方法调用原来的方法
    ////////////////////////////
    动态代理:
        在项目运行的时候才创建一个代理对象,对方法进行增强(控制)
        方式1:
            jdk中Proxy类,前提:实现接口
        方式2:
            spring中cglib,前提:继承类
            
        动态的在内存中创建一个代理对象    
            Object Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 
                参数说明:
                    ClassLoader:代理对象类加载器 一般我们使用的是被代理对象的类加载器
                    Class[]:代理对象需要实现接口 一般我们使用的是被搭理对象所实现的所有接口
                    InvocationHandler:执行处理类.在这里面对方法进行加强
    
                invocationHandler中只有一个方法
                    Object invoke(Object proxy, Method method, Object[] args) 
                        参数说明:
                            proxy:代理对象
                            method:当前执行的方法
                            args:当前方法执行的时候所需要的参数
                            返回值:就是当前method对象执行的返回值
     //////////////////////////////////////////////////
     步骤分析:
        过滤器    
            doFilter(Request request,Response response)
        
            将代理request传递过去
            doFilter(Request requestPrxoy,Response response)
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        ////////////////////////////////////////////////
        ////////////////////////////////////////////////
        ////////////////////////////////////////////////
    上午回顾:
    注解:
        注释:给程序员看的
        注解:给jvm看的
        
        java中三个注解:
            @Override:声明该方法是从父类上继承过来的
            @SuppressWarnings:抑制警告 
            @Deprecated:声明该方法不赞成使用
                
        自定义注解:
            注解属性
                类型:
                    基本类型
                    string
                    class
                    annotation
                    enum
                    以上类型的一维数组
                若有属性,使用的时候必须有值
                    
            元注解
                @Retention:声明注解保留到那个阶段
                    SOURCE:
                    CLASS:
                    RUNTIME:
                @Target:声明注解作用在那个部分
                    TYPE:
                    METHOD:
                    FILED:
        注解的格式:
            @interface 注解名{
                
            }
        ///////////////////////////////////
        ///////////////////////////////////
    servlet3.0
        注解开发
            @WebServlet(urlPatterns="/demo1")
            @WebListener
            @WebFilter(urlPatterns="/demo2")
            
        文件上传
            浏览器端的要求:
                表单的提交方式必须是post
                表单必须有文件上传组件
                表单的enctype属性值为 multipart/form-data
            
            服务器获取的时候
                servlet3.0要求
                    添加一个@MultipartConfig
                    获取普通的组件  
                        request.getParameter(name属性的值)
                    获取文件上传组件
                        Part part=request.getPart("name属性的值")
                        
                        //获取文件的名称
                        Stirng sss=part.getHeader("content-disposition")
                        //然后截取才能获取文件名称
                        sss.substring(sss.indexof("filename=")+10,sss.length-1);
                    
                        //获取文件流
                        part.getInputStream();
                        
                        //删除临时文件
                        part.delete()
                    
            上传时候需要注意的问题:
                文件重名 随机名称
                文件安全 重要的文件放在 web-inf meta-inf  服务器磁盘
                目录分离
                    时间
                    用户
                    文件个数
                    随机目录
    
    //////////////////////////////////////////
    动态代理(★)
        jdk中proxy
            前提:实现接口
            
            Proxy.newProxyInstance(被代理对象.getClass().getClassLoader(),被代理对象.getClass().getInterfaces(),new InvocationHandler(){
                invoke(代理对象,当前执行的方法,需要的参数){
                
                
                }
            });
    
    
    
    
        
  • 相关阅读:
    BZOJ3160: 万径人踪灭(FFT,回文自动机)
    BZOJ4044: [Cerc2014] Virus synthesis(回文树+DP)
    codeforces 666E. Forensic Examination(广义后缀自动机,Parent树,线段树合并)
    BZOJ3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
    BZOJ5137: [Usaco2017 Dec]Standing Out from the Herd(广义后缀自动机,Parent树)
    BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
    codeforces 235C. Cyclical Quest(后缀自动机)
    codeforces 204E. Little Elephant and Strings(广义后缀自动机,Parent树)
    BZOJ2119: 股市的预测(后缀数组)
    BZOJ2555: SubString(后缀自动机,LCT维护Parent树)
  • 原文地址:https://www.cnblogs.com/chenyanlong/p/10022721.html
Copyright © 2011-2022 走看看