ServletContextListener的用法和實(shí)例

ServletContextListener:
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
ServletContextListener能監(jiān)聽(tīng)到你的應(yīng)用程序的啟動(dòng)和銷(xiāo)毀。



例 2.2.1.1

package com;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements
ServletContextListener {
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("Destroyed 被執(zhí)行");
    }
    public void contextInitialized(ServletContextEvent arg0) {
        ServletContext sc=arg0.getServletContext();
        System.out.println("馬克-to-win Initialized 被執(zhí)行"+sc.getMajorVersion());
    }
}



web.xml中加入一段話(huà):

  <listener>
    <listener-class>com.MyServletContextListener</listener-class>
  </listener>


隨便運(yùn)行一個(gè)servlet或jsp,啟動(dòng)tomcat的過(guò)程中,你可以發(fā)現(xiàn)在console中其中有這么一段話(huà):

馬克-to-win Initialized 被執(zhí)行2

隨便改動(dòng)一個(gè)java文件,一保存,應(yīng)用程序被重新加載,過(guò)去的應(yīng)用被卸載,于是contextDestroyed被執(zhí)行。console當(dāng)中也會(huì)出現(xiàn)下面的話(huà):

Destroyed 被執(zhí)行





例 2.2.1.2

下面是Listener的一個(gè)實(shí)際應(yīng)用,和單態(tài)數(shù)據(jù)源應(yīng)用相比,Listener數(shù)據(jù)源是啟動(dòng)你的web應(yīng)用時(shí)啟動(dòng)的,不是第一個(gè)用戶(hù)訪(fǎng)問(wèn)時(shí)啟動(dòng)的,對(duì)于用戶(hù)來(lái)講,體驗(yàn)會(huì)好一點(diǎn)。但有沒(méi)有人訪(fǎng)問(wèn),都會(huì)啟動(dòng)數(shù)據(jù)源。


package com;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
public class MyServletContextListener implements ServletContextListener {
    public void contextDestroyed(ServletContextEvent arg0) {
        ServletContext context = arg0.getServletContext();
        MysqlConnectionPoolDataSource ds=(MysqlConnectionPoolDataSource)context.getAttribute("mysqlds");
/*參見(jiàn)java第三章的內(nèi)存泄露*/       
        ds=null;
        context.removeAttribute("mysqlds");
        System.out.println("Destroyed 被執(zhí)行");
    }
    public void contextInitialized(ServletContextEvent arg0) {
        ServletContext context = arg0.getServletContext();
        DBConForListener con = new DBConForListener();
        MysqlConnectionPoolDataSource ds = con.getDs();
        context.setAttribute("mysqlds", ds);
        System.out.println("contextInitialized3");
    }
}






package com;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
public class DBConForListener {
    private MysqlConnectionPoolDataSource ds;
    public DBConForListener() {
        ds = new MysqlConnectionPoolDataSource();
        ds.setURL("jdbc:mysql://localhost:3306/test");
        ds.setUser("root");
        ds.setPassword("1234");
    }
    public MysqlConnectionPoolDataSource getDs() {
        return ds;
    }
}





package com;
import java.io.IOException;
import java.sql.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;

public class ServletHello1 extends HttpServlet {
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        ServletContext sc = this.getServletContext();
        MysqlConnectionPoolDataSource ds = (MysqlConnectionPoolDataSource) sc
                .getAttribute("mysqlds");
        Connection con;
        try {
            con = ds.getConnection();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select * from login");
            while (rs.next()) {
                System.out.println(rs.getString("id"));
                System.out.println(rs.getString("name"));
            }
            rs.close();
            stmt.close();
            con.close();
            System.out.println("ok");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


運(yùn)行servlet,console當(dāng)中輸出的結(jié)果是:

1
q
2
qq
2.5
qqq
3
qqq
ok