ServletContextListener的用法和實例
ServletContextListener:
馬克- to-win:馬克 java社區(qū):防盜版實名手機(jī)尾號: 73203。
ServletContextListener能監(jiān)聽到你的應(yīng)用程序的啟動和銷毀。
例 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中加入一段話:
<listener>
<listener-class>com.MyServletContextListener</listener-class>
</listener>
隨便運行一個servlet或jsp,啟動tomcat的過程中,你可以發(fā)現(xiàn)在console中其中有這么一段話:
馬克-to-win Initialized 被執(zhí)行2
隨便改動一個java文件,一保存,應(yīng)用程序被重新加載,過去的應(yīng)用被卸載,于是contextDestroyed被執(zhí)行。console當(dāng)中也會出現(xiàn)下面的話:
Destroyed 被執(zhí)行
例 2.2.1.2
下面是Listener的一個實際應(yīng)用,和單態(tài)數(shù)據(jù)源應(yīng)用相比,Listener數(shù)據(jù)源是啟動你的web應(yī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");
/*參見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();
}
}
}
運行servlet,console當(dāng)中輸出的結(jié)果是:
1
q
2
qq
2.5
qqq
3
qqq
ok