ServletContextEvent
将Web应用程序部署在服务器上时,将触发ServletContextEvent事件。
如果要在部署Web应用程序时执行某些操作,例如创建数据库连接,创建项目的所有表等,则需要实现ServletContextListener接口并提供其方法的实现。
1 ServletContextEvent的构造方法
ServletContextEvent类中仅定义了一个构造函数。Web容器在ServletContext实例之后创建ServletContextEvent实例。
- ServletContextEvent(ServletContext e)
2 ServletContextEvent的方法
ServletContextEvent类中仅定义了一种方法:
- public ServletContext getServletContext():返回ServletContext的实例。
3 ServletContextListener的方法
ServletContextListener接口中声明了两种方法,该方法必须由开发中自行实现,以执行某些操作,例如创建数据库连接等。
- public void contextInitialized(ServletContextEvent e):在服务器上部署应用程序时调用。
- public void contextDestroyed(ServletContextEvent e):从服务器卸载部署应用程序时调用。
4 ServletContextListener创建连接案例
在下面示例中,我们从t_user表中查询数据。为了实现目标,我们在监听器类中先创建了Connection对象,并在Servlet中使用了连接对象来查询数据库。
4.1 建立表和数据
在MySQL的默认数据库test中,使用下面SQL语句,建立t_user表:
CREATE TABLE `t_user` (
`id` int(11) DEFAULT NULL,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
插入一些测试数据,如下:
4.2 编写页面
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>一点教程网-ServletContextListener的使用</title>
<meta http-equiv="content-type" content="text/html" charset="UTF-8">
</head>
<body>
<a href="servlet1">查询记录</a>
</body>
</html>
4.3 编写InitConnListener
编写InitConnListener监听器类,在项目启动时创建连接:
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class InitConnListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con= DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test","root","root");
//把Connection对象存入ServletContext域对象中
ServletContext ctx=event.getServletContext();
ctx.setAttribute("mycon", con);
}catch(Exception e){
e.printStackTrace();
}
}
public void contextDestroyed(ServletContextEvent arg0) {
}
}
这里注意,项目的lib目录下需要拷贝mysql的驱动程序,如下:
4.4 编写FetchDataServlet
FetchDataServlet:
import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class FetchDataServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
res.setContentType("text/html;charset=utf-8");
PrintWriter out = res.getWriter();
try{
//从ServletContext取出Connection对象
ServletContext ctx=getServletContext();
Connection con=(Connection)ctx.getAttribute("mycon");
//从t_user表中查询数据
PreparedStatement ps=con.prepareStatement("select * from t_user");
ResultSet rs=ps.executeQuery();
while(rs.next()){
out.print("<br>"+rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));
}
con.close();
}catch(Exception e){e.printStackTrace();}
out.close();
}
}
4.5 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>FetchDataServlet</servlet-name>
<servlet-class>FetchDataServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FetchDataServlet</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<!--配置监听器-->
<listener>
<listener-class>InitConnListener</listener-class>
</listener>
</web-app>
4.6 运行测试
5 ServletContextListener创建表案例
在下面示例中,使用监听器创建项目表。这样,我们就不需要在数据库中手动创建所有表。
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/**
* 一点教程网 - http://www.yiidian.com
*/
public class InitConnListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent arg0) {
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
"root","root");
String query="create table t_user(id int(11) DEFAULT NULL,username varchar(50) DEFAULT NULL,password varchar(50) DEFAULT NULL)";
PreparedStatement ps=con.prepareStatement(query);
ps.executeUpdate();
System.out.println(query);
}catch(Exception e){e.printStackTrace();}
}
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("项目已经卸载");
}
}
热门文章
优秀文章