欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-23 21:04:20
...

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);
	}
}