定义一个类:class
定义一个借口:interface
定义一个枚举:enum
定义一个注解:@interface
【自定义注解案例】
[Java] 纯文本查看 复制代码
@interface MyAnno1{
}
带有属性的注解:
[Java] 纯文本查看 复制代码
@interface MyAnno2{
int a() default 1;
String b();
// 注解属性的类型:基本数据类型,字符串类型String,Class,注解类型,枚举类型,以及以上类型的一维数组.
// Date d();
Class clazz();
MyAnno3 m3(); // 注解
Color c(); // 枚举
String[] arrs();
}
[Java] 纯文本查看 复制代码
@MyAnno4("aaa") // 如果属性名称为value 那么使用的时候 value可以省略(只出现这一个value的属性情况下).
public class AnnotationDemo3 {
}
[Java] 纯文本查看 复制代码
@interface MyAnno4{
String value();
int a() default 1;
}
1.2.2 步骤分析:
定义一个测试类
[Java] 纯文本查看 复制代码
public class AnnotationDemo3 {
@MyTest
public void demo1(){
System.out.println("demo1执行了...");
}
@MyTest
public void demo2(){
System.out.println("demo2执行了...");
}
public void demo3(){
System.out.println("demo3执行了...");
}
}
定义核心运行类:
在核心运行类中有一个主函数:
获得测试类中的所有的方法.
获得每个方法,查看方法上是否有@MyTest注解.
如果有这个注解,让这个方法执行.
1.3 代码实现:
通过元注解定义注解存在的阶段.
* 元注解也是一个注解:修饰注解的 注解.
自定义一个注解:
核心运行类:
[Java] 纯文本查看 复制代码
public class CoreRunner {
public static void main(String[] args) {
// 反射:获得类的字节码对象.Class
Class clazz = AnnotationDemo3.class;
// 获得测试类中的所有的方法:
Method[] methods = clazz.getMethods();
// 遍历数组:
for (Method method : methods) {
// System.out.println(method.getName());
// 判断方法上是否有@MyTest注解:
boolean flag = method.isAnnotationPresent(MyTest.class);
// System.out.println(method.getName()+" "+flag);
if(flag){
// 让这个方法执行:
try {
method.invoke(clazz.newInstance(), null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
1.4 总结:
使用注解完成JDBC工具类的编写:(了解)
[Java] 纯文本查看 复制代码
public class JDBCUtils {
private static String driverClass;
private static String url;
private static String username;
private static String password;
@JDBCInfo
public static Connection getConnection() throws Exception{
// 反射:
Class clazz = JDBCUtils.class;
Method method = clazz.getMethod("getConnection", null);
// 获得方法上的注解:
JDBCInfo jdbcInfo = method.getAnnotation(JDBCInfo.class);
driverClass = jdbcInfo.driverClass();
url = jdbcInfo.url();
username = jdbcInfo.username();
password = jdbcInfo.password();
Class.forName(driverClass);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
}
2 案例二:使用Servlet3.0技术完成文件的上传:
2.1 需求:
2.2 分析:
2.2.1 技术分析:
【Servlet3.0】
Servlet3.0 与 Servlet2.5:
* Servlet3.0需要运行在tomcat7以上的服务器中.
* Servlet3.0以后web.xml就不是必须的.
1.Servlet3.0支持注解开发.
2.提供异步请求.
3.支持文件上传.
【Servlet3.0支持注解开发】
使用@WebServlet替换web.xml中配置的Servlet:
[Java] 纯文本查看 复制代码
@WebServlet(urlPatterns="/ServletDemo1",loadOnStartup=2,initParams=@WebInitParam(name="username",value="root"))
使用@WebListener替换web.xml中监听器的配置:
[Java] 纯文本查看 复制代码
@WebListener
使用@WebFilter替换web.xml中的过滤器的配置:
[Java] 纯文本查看 复制代码
@WebFilter(urlPatterns="/*")
【Servlet3.0支持异步请求-了解】
使用的是多线程的方式处理的,将传统的方式一次请求的非常耗时的操作,分成多个线程去处理.
需要在Servlet上添加一个属性:
[Java] 纯文本查看 复制代码
@WebServlet(urlPatterns="/ServletDemo2",asyncSupported=true)
[Java] 纯文本查看 复制代码
@WebServlet(urlPatterns="/ServletDemo2",asyncSupported=true)
public class ServletDemo2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
AsyncContext context = req.startAsync(req, resp);
context.start(new MyRunner(context));
for(int i=1;i<=20;i++){
System.out.println(i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
[Java] 纯文本查看 复制代码
class MyRunner implements Runnable{
private AsyncContext context;
public MyRunner(AsyncContext context) {
this.context = context;
}
@Override
public void run() {
for(char i='a';i<='z';i++){
try {
context.getResponse().getWriter().println(i);
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
【Servlet3.0的文件上传】