使用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); } }
上一篇: PHP设计模式漫谈之结构模式
下一篇: spring-boot实例