1.1 上次课内容回顾: Listener : * 监听器就是一个JavaBean用来监听其他Bean变化. * 事件源:被监听的对象. * 监听器:监听的对象. * 事件源与监听器的绑定: * 事件:事件源改变.通过事件对象获得事件源对象. * Servlet的监听器: * 事件源:三个域对象.ServletContext,HttpSession,ServletRequest * 三类: * 一类:监听三个域对象的创建和销毁的监听器. * 二类:监听三个域对象的属性变更监听器. * 三类:监听HttpSession中的JavaBean的状态的改变的监听器. Filter : * 过滤器就是对从客服端发送到服务器的请求进行过滤的. * FilterConfig:过滤器配置. * 获得初始化参数 * 获得ServletContext * 获得过滤器的名称

  • FilterChain:过滤器链.
  • 生命周期:服务器启动的时候进行创建,服务器关闭的时候销毁.
  • 过滤器的配置:
    • <url-pattern>的配置
    • <servlet-name>的配置
    • <dispatcher>的配置:
      • REQUEST
      • FORWARD
      • INCLUDE
      • ERROR
  • 自动登录:
  • 网站乱码的解决: 1.2 案例一:使用自定义注解完成@Test注解功能类似的效果:1.2.1 需求 使用Junit是单元测试的工具.在一个类中使用 @Test 对程序中的方法进行测试. 自定义一个注解@MyTest 也将这个注解加在类的方法上. 使这个方法得到执行. 1.2.2 分析:1.2.2.1 技术分析: Ø 【注解】 程序中有 注释 和注解
  • 注释:给开发人员.
  • 注解:给计算机看的. 注解使用:学习框架支持注解开发. Ø 【JDK提供的注解】 @Override :描述方法的重写. @SuppressWarnings :压制警告. @Deprecated :标记过时. Ø 自定义注解: 定义一个类:class 定义一个借口:interface 定义一个枚举:enum 定义一个注解:@interface 【自定义注解案例】 @interface MyAnno1{

} 带有属性的注解: @interface MyAnno2{ int a() default 1; String b(); // 注解属性的类型:基本数据类型,字符串类型String,Class,注解类型,枚举类型,以及以上类型的一维数组. // Date d(); Class clazz(); MyAnno3 m3(); // 注解 Color c(); // 枚举 String[] arrs();

} @MyAnno4("aaa") // 如果属性名称为value 那么使用的时候 value可以省略(只出现这一个value的属性情况下). public class AnnotationDemo3 { } @interface MyAnno4{ String value(); int a() default 1; } 1.2.2.2 步骤分析: 定义一个测试类 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.2.3 代码实现: 通过元注解定义注解存在的阶段.

  • 元注解也是一个注解:修饰注解的 注解. 自定义一个注解: 核心运行类: 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.2.4 总结: 使用注解完成JDBC工具类的编写:(了解) 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;
      }
    

}