Web 應用伺服器會產生各類事件:容器啟動、Session 過期、請求到達等。善用事件處理機制可大幅增強程式對伺服器的控制力。本文示範建立 Servlet 監聽器,記錄 Web 容器啟動/關閉事件至 Excel 日誌檔,供管理員查閱,並支援登入後下載日誌。
在 JBuilder 中選擇 File → New → Web → Listener Servlet,啟動精靈。指定類別名稱 SrvStartListener,套件名 bookstore.servlet。
Web 容器啟動/關閉事件由 ServletContextListener 定義,勾選該介面並完成建立。
打開產生的 SrvStartListener.java,加入以下核心程式碼(粗體部分):
package bookstore.servlet;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
public class SrvStartListener extends HttpServlet implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
GregorianCalendar cal = new GregorianCalendar();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
File file = new File("D:/serverLog/log_" + year + "_" + month + ".xls");
FileWriter fw = null;
try {
fw = new FileWriter(file, true); // 追加模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String starttime = sdf.format(new Date());
fw.write("於 " + starttime + " 啟動 Web 容器 ");
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (fw != null) fw.close();
} catch (IOException ex1) {
ex1.printStackTrace();
}
}
}
// contextDestroyed 方法類似,略
}
contextInitialized 在容器初始化時被呼叫,寫入啟動日誌;contextDestroyed 在容器關閉前被呼叫,記錄關閉資訊(完整程式碼請參考隨書光碟)。
打開 web.xml,可見監聽器的部署資訊:
<web-app>
<listener>
<listener-class>bookstore.servlet.SrvStartListener</listener-class>
</listener>
</web-app>
部署描述未指定監聽器類型,容器透過類別實現的事件介面自動識別。