本帖最后由 小石姐姐 于 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的使用注解开发:方便 文件上传:有些API不是特别全 异步请求
文件上传的三要素:
文件上传如果没有设置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,代表不需要转发
|