2021-04-21 08:33  阅读(129)
文章分类:Servlet 简单教程 文章标签:Servlet
©  原文作者:一点教程 原文地址:http://www.yiidian.com/servlet/

将Web应用程序部署在服务器上时,将触发ServletContextEvent事件。

如果要在部署Web应用程序时执行某些操作,例如创建数据库连接,创建项目的所有表等,则需要实现ServletContextListener接口并提供其方法的实现。

1 ServletContextEvent的构造方法

ServletContextEvent类中仅定义了一个构造函数。Web容器在ServletContext实例之后创建ServletContextEvent实例。

  1. ServletContextEvent(ServletContext e)

2 ServletContextEvent的方法

ServletContextEvent类中仅定义了一种方法:

  1. public ServletContext getServletContext():返回ServletContext的实例。

3 ServletContextListener的方法

ServletContextListener接口中声明了两种方法,该方法必须由开发中自行实现,以执行某些操作,例如创建数据库连接等。

  1. public void contextInitialized(ServletContextEvent e):在服务器上部署应用程序时调用。
  2. 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

插入一些测试数据,如下:

2021042108315_1.png

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的驱动程序,如下:

2021042108313_2.png

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 运行测试

202104210838_3.png202104210833_4.png

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("项目已经卸载");
    
        }
    }
    
点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> ServletContextEvent
上一篇
Servlet的监听器介绍
下一篇
HttpSessionEvent