JavaWeb05

一、Listener监听器

1、简介

Listener是Servlet规范中的一员

在Servlet中,所有的监听器接口都是以Listener结尾

监听器实际上是Servlet规范留给JavaWeb程序员的一些特殊时机

当在某些时机需要执行一段Java代码时,可以用对应的监听器

2、常用的监听器接口

(1)jakarta.servlet 包下:

ServletContextListener、ServletContextAttributeListener

ServletRequestListener、ServletRequestAttributeListener

(2)jakarta.servlet.http 包下:

HttpSessionListener

HttpSessionAttributeListener、HttpSessionBindingListener

HttpSessionIdListener、HttpSessionActivationListener

3、实现一个监听器的步骤

(1)以ServletContextListener为例

编写一个类实现ServletContextListener接口

这个监听器监听的是ServletContext对象的创建和销毁

监听器中的方法不需要程序员调用,在特定事件发生时由服务器调用

java 复制代码
@WebListener
public class MyServletContextListener implements ServletContextListener {
    
    @override
    public void contextInitialized(ServletContextEvent sce) {
        // 这个方法在ServletContext对象被创建时调用    
    }
    
    @override
    public void contextDestroyed(ServletContextEvent sce) {
        // 这个方法在ServletContext对象被销毁时调用    
    }
}

(2)在web.xml文件中配置这个监听器

也可以使用 @WebListener 注解

XML 复制代码
<listener>
    <listener-class>自己实现的监听器类的全类名</listener-class>
</listener>

4、其他监听器

(1)XxxxAttributeListener

监听的是某个域中的attribute被增加、修改、删除

只要域中的数据发生变化,就执行相应的方法

(2)XxxxBindingListener

例如,一个JavaBean实体类实现了HttpSessionBindingListener接口

那么当这个实体类的对象被放入session的attribute中触发bind事件,移除触发unbind事件

这个实体类不需要使用 @WebListener注解

(3)HttpSessionIdListener

监听Session对象的Id,当Id改变时调用类中的唯一的方法

(4)HttpSessionActivationListener

监听Session对象的钝化和活化

钝化:session对象从内存中存储到硬盘文件

活化:session对象从硬盘文件中恢复到内存

二、MVC架构模式

1、简介以及示意图

2、JDBC工具类的封装

java 复制代码
public class DBUtil {
    
    private static ResourceBundle bundle = ResourceBundle.getBundle("resources/jdbc");
    private static String driver = bundle.getString("driver");
    private static String url = bundle.getString("url");
    private static String user = bundle.getString("user");
    private static String password = bundle.getString("password");
    
    // 工具类的所有方法都是静态的
    // 将构造方法私有化,防止创建对象
    private DBUtil() {}
    
    static {
        try {
            Class.forName(driver);                    
        } catch (ClassNotFoundException e) {
            e.printStackTrace();        
        }
    }
    
    private static ThreadLocal<Connection> local = new ThreadLocal<>();
    
    // 没有使用数据库连接池,直接创建连接对象
    public static Connection getConnection() throws SQLException {
        Connection conn = local.get();
        if (conn == null) {
            conn = DriverManager.getConnection(url, user, password);        
            local.set(conn);
        }
        return conn;
    }
    
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (conn != null) {
            try {
                conn.close(); 
                local.remove();           
            } catch (SQLException e) {
                throw new RuntimeException(e);        
            }
        }
        if (stmt != null) {
            try {
                stmt.close();            
            } catch (SQLException e) {
                throw new RuntimeException(e);        
            }
        }
        if (rs != null) {
            try {
                rs.close();            
            } catch (SQLException e) {
                throw new RuntimeException(e);        
            }
        }    
    }
    
}

3、MVC架构模式与三层架构的关系

三层架构:表现层、业务逻辑层、持久化层

表现层对应V和C

M包括了业务逻辑层和持久化层

相关推荐
没有bug.的程序员17 分钟前
MySQL 安全与权限管理:从基础到生产级安全实践
java·mysql·安全·adb·权限
_extraordinary_27 分钟前
Java JVM --- JVM内存区域划分,类加载,GC垃圾回收
java·开发语言·jvm
摸鱼的老谭1 小时前
Java学习之旅第一季-25:一维数组
java·开发语言·数组
山猪打不过家猪1 小时前
(一)算法
java·开发语言·算法
Momentary_SixthSense1 小时前
如何对较长的Stream链进行Debug
android·java·开发语言
JAVA学习通1 小时前
微服务项目->在线oj系统(Java-Spring)--竞赛管理
java·sql·spring
鄃鳕1 小时前
C++坑系列,C++ std::atomic 拷贝构造函数问题分析与解决方案
java·javascript·c++
木易小熙2 小时前
Guava Cache
java·spring·guava
JIngJaneIL2 小时前
图书馆自习室|基于SSM的图书馆自习室座位预约小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·图书馆自习室
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 J2EE技术在在线购物分享应用中的应用为例,包含答辩的问题和答案
java·java-ee