`

使用ServletContextListener创建和关闭一个数据库连接

阅读更多

1、流程简述

 

    1)上下文初始化时得到通知(Web应用部署时)。

        a)从ServletContext中得到上下文初始化参数(配置在web.xml中)。

        b)使用初始化参数创建一个新的数据库连接。

        c)把数据库连接作为属性保持到ServletContext上下文中,使得整个Web应用的各个部分都能访问。

 

     2)上下文撤消时得到通知(Web应用取消部署或结束时)

        a)关闭数据库连接

 

2、需要用到web.xml文件及四个类

 

    1)web.xml:部署描述符,配置Web应用上下文初始化参数(数据库连接信息)以及监听器。

    2)MyServletContextListener类:监听器类,用于监听上下文初始化及销毁事件。

    3)DBConnConfig:数据库配置对象,用于封装数据库连接所需的数据。

    4)DBMangerUtil:数据库连接工具类,用于获取和关闭数据库连接。

    5)DBConnServletTest:测试类,在Servlet中测试能否获取保存在ServletContext中的数据库连接对象。

   

3、实例代码

   

    1)web.xml配置如下:

<!-- 数据库连接初始化参数 -->
  <context-param>
      <param-name>driver</param-name>
      <param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
  <context-param>
      <param-name>url</param-name>
      <param-value>jdbc:mysql://localhost:3306/student</param-value>
  </context-param>
  <context-param>
      <param-name>username</param-name>
      <param-value>admin</param-value>
  </context-param>
  <context-param>
      <param-name>password</param-name>
      <param-value>mysqladmin</param-value>
  </context-param>
  
  <!-- ServletContext监听器 -->
  <listener>
      <listener-class>com.linwei.listener.MyServletContextListener</listener-class>  
  </listener>

 

    2)MyServletContextListener类:监听器类

package com.linwei.listener;

import java.sql.Connection;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.linwei.model.DBConnConfig;
import com.linwei.util.DBMangerUtil;

/**
 * @author Linwei
 * 监听器保证每新生成一个servletContext都会有一个可用的数据库连接,
 * 并且所有的连接会在context销毁的时候随之关闭。
 */
public class MyServletContextListener implements ServletContextListener {
	Connection conn=null;
	
	//上下文初始化
	public void contextInitialized(ServletContextEvent event) {
		try {
			//使用数据库配置对象初始化数据库连接工具类
			DBConnConfig dbConfig = getDBConnConfig(event);
			if(dbConfig!= null){
				DBMangerUtil.initDBMangerUtil(dbConfig);
			}
			
			// 创建数据库连接
			conn = DBMangerUtil.getConncection();
			
			//将连接保存到ServletContext上下文中
			event.getServletContext().setAttribute("dbconn", conn);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	//上下文销毁
	public void contextDestroyed(ServletContextEvent event) {
		try {
			// 关闭数据库连接
			DBMangerUtil.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	//读取Web.xml中数据库初始化参数,然后实例化并返回数据库配置对象
	private DBConnConfig getDBConnConfig(ServletContextEvent event){
		
		//使用获取Web应用上下文初始化参数
		ServletContext ctx = event.getServletContext();
		String driver = ctx.getInitParameter("driver");
		String url = ctx.getInitParameter("url");
		String username = ctx.getInitParameter("username");
		String password = ctx.getInitParameter("password");
		
		DBConnConfig dbConfig=null;
		dbConfig = new DBConnConfig(driver, url, username, password);
		return dbConfig;
	}
}

 

    3)DBConnConfig类:数据库配置对象

package com.linwei.model;

public class DBConnConfig {
	public String driver;
	public String url;
	public String username;
	public String password;
	
	public DBConnConfig(String driver, String url, String username,
			String password) {
		super();
		this.driver = driver;
		this.url = url;
		this.username = username;
		this.password = password;
	}
	//getter()和setter()
}

    

    4)DBMangerUtil类:数据库连接工具类

package com.linwei.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.linwei.model.DBConnConfig;

public class DBMangerUtil {
	public static String driver = "";
	public static String url = "";
	public static String username = "";
	public static String password = "";

	public static Connection conn = null;

	// 初始化DBMangerUtil的实例变量
	public static void initDBMangerUtil(DBConnConfig dbConfig) {
		DBMangerUtil.driver = dbConfig.getDriver();
		DBMangerUtil.url = dbConfig.getUrl();
		DBMangerUtil.username = dbConfig.getUsername();
		DBMangerUtil.password = dbConfig.getPassword();
	}

	// 获取连接
	public static Connection getConncection() throws SQLException {
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		conn = DriverManager.getConnection(url, username, password);
		return conn;
	}

	// 关闭连接
	public static void close() throws SQLException {
		if (conn != null) {
			conn.close();
		}
	}
}

    

    5)DBConnServletTest类:测试类

package com.linwei.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DBConnServletTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		
		//获取ServletContext上下文中保存连接对象
		Connection dBconn=(Connection) getServletContext().getAttribute("dbconn");
		PrintWriter out=response.getWriter();
		out.println(dBconn.toString());
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}

 

分享到:
评论

相关推荐

    jndi 数据库连接池 & 监听

    数据库连接池,又称为数据源,是管理和复用数据库连接的一种机制,可以有效地提高应用处理数据库请求的效率,避免频繁地创建和关闭数据库连接。 本资源包含对JNDI数据库连接池的详细讲解,以及监听器的代码实例和...

    ServletContextListener使用详解

    这意味着,我们可以在这个方法中执行一些清理操作,例如关闭数据库连接,释放资源等。 下面通过两个具体的例子来介绍 ServletContextListener 的用法。 例一:在服务启动时,将数据库中的数据加载进内存,并将其...

    ServletContextListener的应用

    在Java Web开发中,`ServletContextListener`是一个非常重要的接口,它是Servlet API的一部分,定义了两个方法:`contextInitialized`和`contextDestroyed`。这个接口的主要作用是监听Servlet上下文(`...

    jsp 连接数据库

    例如,使用连接池(如C3P0或HikariCP)可以更高效地管理和复用数据库连接,提高应用性能。此外,了解SQL优化、安全性最佳实践等也是十分重要的。 总结来说,JSP连接数据库是Web应用开发的基础技能,通过JDBC API和...

    tomcat embedded + sqlite

    这可能包括在`ServletContextListener`中创建数据库连接池,或者在应用程序启动时执行初始化脚本。 **源码分析** 标签中的“源码”意味着可能有关于实际代码实现的详细信息。在博文链接中,你可能会找到如何配置和...

    JAVA Servlet监听器listener学习资料

    - `ServletContextListener`: 监听ServletContext的创建与销毁,通常用于初始化和清理资源,如数据库连接池的初始化和关闭。 - `HttpSessionListener`: 监听HttpSession的创建和销毁,可以用于统计在线用户数量、...

    利用servlet监听器,系统启动时创建自定义容器简单例子

    要创建一个监听器,你需要编写一个类,实现`ServletContextListener`接口,并重写它的两个方法:`contextInitialized(ServletContextEvent sce)`和`contextDestroyed(ServletContextEvent sce)`。前者在Web应用启动...

    JavaWeb 视频教程 传智播客 第20天 共28天

    在第20天的课程中,你将学习到如何加载和注册JDBC驱动,创建数据库连接,执行查询、更新和删除操作,以及关闭数据库连接。此外,还会讲解如何使用PreparedStatement避免SQL注入攻击,提高代码的可读性和安全性。 接...

    监听器源代码.zip

    3. **数据库连接池监听器**: 在数据库管理中,像C3P0或HikariCP这样的连接池库提供了连接创建和销毁的监听机制,帮助开发者监控和管理数据库连接资源。 4. **网络监听器**: 网络监听器通常用于监听网络连接和数据...

    java 监听使用

    `ServletContextListener`是Java Servlet API中定义的一个接口,用于监听Web应用上下文(`ServletContext`)的创建和销毁事件。通过实现这个接口,开发者可以定义在应用启动和关闭时需要执行的操作。 ##### 2.1 ...

    一个简单的监听器案例项目

    1. ServletContextListener: 这个监听器在Web应用启动时被调用,用于初始化一些全局资源,比如数据库连接池。当Web应用关闭时,它也会被调用来进行清理工作。 2. HttpSessionListener: 这个接口允许开发者监听HTTP...

    Java Web程序设计教程源码3-9章

    Java Web程序设计是开发互联网应用程序...每一个章节的源码都是一个独立的学习单元,可以帮助你逐步建立起完整的Java Web开发技能树。在实际练习中,遇到问题时,可以参考源码中的实现,加深理解,提升解决问题的能力。

    servlet监听器

    - 在Web应用启动时进行全局资源初始化,如加载配置文件、数据库连接池等。 总的来说,Servlet监听器是Java Web开发中不可或缺的一部分,它们扩展了Web应用的功能,使开发者能更灵活地管理和响应Web应用中的各种事件...

    Jsp+servlet写的宿舍管理系统

    【宿舍管理系统】是一个基于Web的项目,主要使用Java技术栈中的JSP(JavaServer Pages)和Servlet进行开发,遵循经典的MVC(Model-View-Controller)设计模式。在这个系统中,用户可以进行登录、注册、浏览主界面...

    简单的HIBERNATE应用

    - 配置Hibernate:创建hibernate.cfg.xml文件,配置数据库连接信息,以及实体类和表的映射文件。 - 实体类:定义Java类,用注解或XML文件描述其与数据库表的关系。 - 映射文件:在.hbm.xml文件中,详细定义实体类...

    Servlet、Filter、Listener深入理解.docx

    5. `destroy()`: 当Servlet不再需要时,容器调用此方法释放资源,如关闭数据库连接。 **ServletConfig接口** `ServletConfig`接口提供了Servlet的配置信息,包括: 1. `getServletName()`: 返回Servlet的唯一名称...

    servlet监听器技术源码

    1. **ServletContextListener**:当Web应用启动时,Servlet容器会调用`contextInitialized`方法,这通常用于初始化全局资源,如数据库连接池、设置全局属性等。而在Web应用关闭时,`contextDestroyed`方法会被调用,...

    10.Listener.doc

    - **资源初始化**:如数据库连接池的初始化和关闭。 - **日志记录**:跟踪应用程序的生命周期事件。 - **缓存管理**:监控和管理应用程序的缓存数据。 - **性能统计**:收集应用程序的运行时信息,如请求次数、响应...

    mybatis test 项目

    6. **监听器Listener**:可以添加ServletContextListener来监听整个Web应用的生命周期,例如在应用启动时初始化MyBatis的SqlSessionFactory,关闭时关闭连接池等。还可以使用HttpSessionListener来监听用户的会话...

Global site tag (gtag.js) - Google Analytics