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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-6-21 14:23 编辑

基础加强 学习笔记
注解:
  • 注解和注释的区别
    注释:是给程序员看的注解:是给虚拟机看的(代表程序的一些特殊的功能)
  • JDK中提供的注解
    @override :描述子类重写父类的方法.        JDK1.5版本的时候,该注解只能应用在类的继承上.        JDK1.6版本的时候,该注解可以应用在类的实现上.@SuppressWarnings:压制警告.@Deprecated:描述方法过时.
  • 自定义注解:
    ​    定义类:class    定义接口:interface    定义枚举:enum    定义注解:@interface
  • 注解的属性的类型:
    ​    基本数据类型    String类型    class类型    注解类型    枚举类型    以上类型的一维数组   特殊的属性名称:如果使用注解的时候,只出现了value属性,value属性可以省略的
  • 自定义注解的使用:

    • 先自定义一个注解
    • 定义核心运行类
    • 在核心运行类中:获得测试类的Class,获得Class中的所有方法
      遍历得到每个方法,判断方法上有注解,就执行该方法自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解)

Servlet3.0的使用
  • Servlet3.0中的注解:
    @webServlet:servlet的注解@webListener:监听器的注解@webFilter:过滤器的注解
  • Servlet3.0与Servlet2.5相比提供了三个特性:

  • 注解开发:方便
  • 文件上传:有些API不是特别全
  • 异步请求

  • 文件上传的三要素:

    • 表单的提交的方式必须是POST
    • 表单中需要有文件上传的表单元素:这个元素这个元素必须有name属性和值
    • 表单的enctype属性的值必须是multipart/form-data

    文件上传如果没有设置enctype属性的时候只能获得文件的名称,没有内容设置enctype属性只有设置为multipart/form-data才能获得文件名及文件内容
  • 文件上传的问题:一个目录下存放的文件过多
    按时间分        :一个月一个目录,一个星期一个目录,一天一个目录按数量分        :一个目录下存5000个文件,创建一个新的目录,再去存放按用户分        :为每个用户创建一个单独目录 存放文件按目录分离算法分:使用唯一文件名.hashCode(); 得到一个代表当前这个文件的int类型值int类型占4个字节32位.可以让hashCode值&0xf; 得到一个int值,用这个int值作为一级目录让hashCode右移4位 &0xf ;得到一个int值,用这个int值作为二级目录.依次类推

上传文件示例:
[Java] 纯文本查看 复制代码
//处理文件名乱码
request.setCharacterEncoding("UTF-8");
//获得文件部分
Part part = request.getPart("uploadfile");
//获得文件名
String header = part.getHeader("Content-Dispositon");
int index = part.indexOf("filename="");
String filename = header.subString(index+10,header.length()-1);
//获取输入流
InputStream is = part.getInputStream();
//设置真实保存路径
String path = this.getServletContext().getRealPath("/uploadfiles");
//创建输出流
OutputStream os = new FileOutputStream(path+"/"+filename);
//输入输出流对接
int len;
byte[] bys = new byte[1024];
while((len=is.read(bys))!=-1){
    os.write(bys,0,len);
}
//关闭流
os.close();
is.close();

动态代理:被增强的类实现了接口
JDK中的动态代理:
  • proxy对象 Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler ih)
  • jdk中proxy产生的代理对象与被增强的对象是兄弟关系(同级)
  • 使用动态代理:Proxy.newProxyInstance()

    • 第一个参数:ClassLoader  类的加载器.
      getClass().getClassLoader() 得到类加载器
    • 第二个参数:Class[]      被增强的对象实现的所有接口
      getClass().getInterface()  获得第二个参数
    • 第三个参数InvocationHandler  处理类
      定义个一InvocationHandler的实现类,实现里边的Incoke方法或者用内部类的方法实现InvocationHandler的invoke方法作为第三个参数在这个invoke方法中增强方法,每次调用走的都是invoke方法

  • 示例:
    [Java] 纯文本查看 复制代码
    public void demo1(){
        Waiter waiter = new Waitress();
        /*使用动态代理:Proxy.newProxyInstance();
        ClassLoader:类加载器.
        Class[]:被增强的对象实现的所有接口
        InvocationHandler:处理类.
        */ 
         //第一个参数:
        ClassLoader classLoader = waiter.getClass().getClassLoader();
         //第二个参数:
        Class[] interfaces = waiter.getClass().getInterfaces();
         //第三次参数:
        Waiter waiter2 = (Waiter)Proxy.newProxyInstance(classLoader, interfaces, new MyInvocationHandler(waiter));
        waiter2.server();
        //说明现在调用代理对象的任何方法的时候,InvocationHandler中的invoke都会执行.
        String s = waiter2.sayHello("张凤");
        System.out.println(s);
    }
    class MyInvocationHandler implements InvocationHandler{
        private Waiter waiter;
        public MyInvocationHandler(Waiter waiter){
            this.waiter = waiter;
        }
    }
    /*  
    方法的参数:
    proxy:产生的代理对象.
    method:当前正在调用的目标类的方法.
    params:正在执行的方法中的参数.
    */
    public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
        System.out.println("InvocationHandler invoke 执行了...");
        System.out.println("微笑=========");
        waiter.sayHello("张凤");
        System.out.println(method.getName());
        if("server".equals(method.getName())){
            System.out.println("微笑==========");
            Object obj = method.invoke(waiter, params);
            System.out.println("白白==========");
            return obj;
        }else{
            return method.invoke(waiter, params);
        }   
    }

类的加载器:
类的加载器:将class文件加载到JVM中执行这个文件
  • Java中将类加载器分成三类:
    引导类加载器:JAVA_HOME/jre/lib/rt.jar扩展类加载器:JAVA_HOME/jre/lib/ext/*.jar应用类加载器:加载类路径下的所有的class
  • 类加载器的全盘委托机制:        
    由应用类加载器得到class委托给扩展类加载器,扩展类加载器又委托给引导类加载器.引导类加载器如果有这个class就会加载如果没有就将类的class向下给扩展类加载器.扩展类加载器如果有这个class就加载如果没有找到就向下给应用类加载器,将这个class加载.

开发模式:
一个模块只用一个Servlet的方法:先编写一个通用的Servlet方法继承HTTPServlet
  • 一个模块一个Servlet,每个模块的Servlet必须继承BaseServlet
  • 每次请求必须传递一个参数method=xxx,xxx就是待执行的方法,在某个具体模块中的Servlet中只需要写xxx方法的具体业务逻辑即可
  • xxx方法必须是public修饰的,返回值为String,参数为HttpSrevletRequest和HttpServletResponse.
  • xxx方法返回一个String类型的字符串 方法的方悔之代表要转发的路径,如果返回null,代表不需要转发



0 个回复

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