まず例として、アクセスがある度にカウンターを増やしていくという簡単なservletを作ります。下のソースコードで使われているServletContextはアプリケーション単位でオブジェクトを格納できる入れ物のようなものです。
package com.kenjih; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/SampleServlet") public class SampleServlet extends HttpServlet { private static final long serialVersionUID = -7110778233634851631L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); int allVisit = 0; try { allVisit = (Integer)this.getServletContext().getAttribute("visit"); } catch (Exception e) { allVisit = 0; } this.getServletContext().setAttribute("visit", ++allVisit); out.println("All Visit:" + allVisit); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
次にリスナークラスを作ってみます。アプリケーションの起動および停止時にログを出力するようなリスナーを書いてみます。
package com.kenjih; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class MyServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { System.out.println("servlet context is initialized."); } public void contextDestroyed(ServletContextEvent sce) { System.out.println("servlet context is destroyed."); } }
これだけだと退屈なので、ServletContextの中のオブジェクトが追加、削除、変更されたときにもログを出すようにしてみます。
package com.kenjih; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.annotation.WebListener; @WebListener public class MyServletContextAttributeListener implements ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent scab) { System.out.println("A new attribute is added to the context:"); System.out.println("Name=" + scab.getName()); System.out.println("Value=" + scab.getValue()); System.out.println(); } public void attributeReplaced(ServletContextAttributeEvent scab) { System.out.println("An attribute is replaced in the context:"); System.out.println("Name=" + scab.getName()); System.out.println("Value=" + scab.getValue() + "->" + scab.getServletContext().getAttribute(scab.getName())); System.out.println(); } public void attributeRemoved(ServletContextAttributeEvent scab) { System.out.println("An attribute is repmoved in the context:"); System.out.println("Name=" + scab.getName()); System.out.println("Value=" + scab.getValue()); System.out.println(); } }
他にもセッションに関するリスナー、HTTPリクエストに関するリスナーなどがあります。
Javaおもしろいな。。
0 件のコメント:
コメントを投稿