JavaWeb开发知识总结(annotation,Servlet3.0,文件上传,动态代理)
1. annotation概述
annotation:注解,代表程序的一些特殊的功能,注解是由虚拟机进行处理的。
JDK中提供的常用的注解:
# @Override :描述子类重写父类的方法:
* JDK1.5版本中,该注解只能应用在类的继承上.
* JDK1.6版本中,该注解可以应用在类的实现上(实现接口).
# @SuppressWarnings :压制警告,参数是all是压制所有的警告.
# @Deprecated :描述方法过时,标记方法过时.
自定义注解:使用@interface
关键声明
格式:public @interface 注解名称{ 内容 }
注解的属性定义:
# 注解定义时需加上`()`,如:
@interface Anno {
int a();
boolean b() default false;
}
# 定义属性时:可以使用default关键字声明属性的默认值
# 注解的属性的数据类型:
1. 基本数据类型:primitive type
2. String类型:String
3. Class类型:Class
4. 注解类型:annotation
5. 枚举类型:enumeration
6. 以上类型的一维数组:
# 特殊的属性名称:value
* 如果使用注解的时候,只出现了value属性,value属性可以省略,但当出现多个属性时,value属性名不能省略
注解的存在阶段:
# Java类的状态:源代码阶段-->Class阶段-->运行阶段
源代码阶段 Class阶段 运行阶段
.java源文件 --编译--> .class --加载--> JVM中运行
# 自定义的注解只存在与源代码阶段,编译后就不存在了,可以通过JDK提供的元注解来增大自定义注解的存在阶段:
1. 源代码阶段:@Retention(value = RetentionPolicy.SOURCE)
2. Class阶段:@Retention(value = RetentionPolicy.CLASS)
3. 运行阶段:@Retention(value = RetentionPolicy.RUNTIME)
案例:自定义注解完成简单的注解单元测试的功能
package com.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* 自定义注解 MyTest.java
*/
@Retention(value=RetentionPolicy.RUNTIME) // 设置自定义注解运行阶段
public @interface MyTest {
}
/**
* 运行的核心类 CoreRunner.java
* 和单元测试的原理相同,均需要一个程序运行的主方法
* 获取要进行单元测试的类的Class对象,通过反射获取该类的所有的方法
* 遍历所有的方法,如果方法上有注解,则通过反射执行该方法即可
*/
public class CoreRunner {
public static void main(String[] args) throws Exception {
/**
* 获得测试类的Class.
* 获得Class中的所有的方法.
* 遍历每个方法,查看每个方法上是否有MyTest注解.
* 有MyTest注解,这个方法就执行.
*/
// 1.获得测试类的Class:
Class clazz = AnnotationDemo1.class;
// 2.获得Class中的所有的方法:规定了测试的方法必须是public
Method[] methods = clazz.getMethods();
// 3.遍历每个方法:
for(Method method:methods){
// 获取当前的方法是否含有MyTest注解
boolean flag = method.isAnnotationPresent(MyTest.class);
if(flag){
// 说明方法上有MyTest注解,执行方法
method.invoke(clazz.newInstance(), null);
}
}
}
}
2. Servlet 3.0
Servlet3.0和Servlet2.5的区别:
# Servlet3.0和Servlet2.5相比提供了三个特性:
1. 注解开发:可以取代web.xml的配置文件
* @WebServlet:Servlet的注解
* @WebListener:监听器的注解
* @WebFilter:过滤的注解
2. 文件上传:没有提供获取上传的文件名等相关的API
3. 异步请求:本质是开启新的线程进行处理请求
注解开发的原理:
// Servlet2.5中web.xml配置文件配置Servlet
<servlet>
<servlet-name>servlet名称</servlet-name>
<servlet-class>servlet的完全限定名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet名称</servlet-name>
<url-pattern>servlet的访问路径</url-pattern>
</servlet-mapping>
// Servlet3.0中使用注解
@WebServlet(urlPatterns="Ser