注解
注解:
jdk5之后提供了一个特性,和类 接口同级
格式:
@interface 注解名{}
作用:
编译期检查
替代配置文件
定义注解(元注解:注解上的注解)
分析代码(用到反射)
////////////////////////
java中3个注解(理解)
@Override:声明该方法是从父类上继承过来的,执行编译期的检查
@SuppressWarnings:抑制警告 值有好多,只需要知道一个 all 抑制所有的警告
@Deprecated:声明 该方法不赞成使用
////////////////////////
注解的本质是一个接口,通过jdk自带的javap命令反编译class字节码文件得出【javap xxx.class】。
枚举的本质是一个被阉割的类,通过jdk自带的javap命令反编译class字节码文件得出【javap xxx.class】。该枚举定义的常量是本身对象,且构造私有化,用public static final 修饰对外提供访问。
////////////////////////
自定义注解(理解)
注解属性:
注解本质就是一个接口,接口中可以有常量和抽象方法
抽象方法在注解中就称之为注解属性
注解属性类型:
基本类型
String
Class
Annotation
Enum:枚举
以上类型对应的一维数组
注意:
一旦注解有属性了,使用注解的时候必须赋值,(除非这个注解属性有默认值)
赋值的格式:
@注解名(属性名=属性值)
若注解类型为数组,且只有一个值的时候,可以有两种写法
方式1:
属性名 = { 值 }
方式2:
属性名=属性值
若属性名为value的时候,且只需要为这个value属性赋值的时候,value可以省略
元注解:(理解)
定义在注解上的注解
@Retention 规定注解保留到什么阶段 值为RetentionPolicy的三个枚举值
SOURCE:只在代码中保留,在字节码文件中就删除了
CLASS:在代码和字节码文件中保留
RUNTIME:所有阶段都保留
例如://注解在运行时保留
@Retention(RetentionPolicy.RUNTIME)
@Target 规定注解作用在什么上面 值为ElementType的枚举值
TYPE:作用在类 接口 等上面
METHOD:作用方法上面
FIELD:作用字段上面
例如://注解只能作用在方法上
@Target(ElementType.METHOD)
Servlet3.0文件上传
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属性的值)
接受文件上传组件 Part part=request.getPart(name属性的值);
getName():获取的name的属性值
获取文件名:
String s = part.getHeader("Content-Disposition"):获取头信息 然后截取
String filename=s.substring(s.indexOf("filename=")+10,s.length()-1);
//获取文件流
part.getInputStream();
//删除临时文件
part.delete()
//////////
上传注意的问题:
名字重复 随机名称
在数据库中提供两个字段,
一个字段用来存放文件的真实名称 1.jpg
另一个字段用来存放文件存放路径 g:/sdfasdf.jpg
随机名称:
uuid
时间戳
文件安全
重要的文件存放在 web-inf 或者 meta-inf 或者 服务器创建一个路径
不是很重要的文件 项目下
文件存放目录
方式1:日期
方式2:用户
方式3:文件个数
方式4:随机目录
mkdirs