当前位置:首页 > 开发 > 编程语言 > Servlet > 正文

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

发表于: 2015-03-21   作者:JokerLinisty   来源:转载   浏览:
摘要: 1、流程简述       1)上下文初始化时得到通知(Web应用部署时)。         a)从ServletContext中得到上下文初始化参数(配置在web.xml中)。         b)使用初始化参数

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

 

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一、关系型数据库SQLIte 每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、
Android创建和使用数据库详细指南 原文:http://developer.aiwgame.com/android-db-database-instan
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据
摘要:每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的S
1 . 使用方式 :ln [option] source_file dist_file -f 建立时,将同档案名删除. -i 删除前进行询问
今天在敲学生查询余额窗体的时候由于要对card_Info表和student同时查询,将查询内容返回到窗体,所
数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据
2,下载Android SDK 非常不幸的是,Android.com 被我们强大的GFW 给墙了,但是我们又不得不去官网下
使用数据库 现在你已经可以利用创建的辅助类来使用数据库了,在DatabaseActivity.java文件中,创建
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号