Search on the blog

2013年1月13日日曜日

Server-side Java(4) Listner

Tomcatのリスナー機能を使ってみました。
まず例として、アクセスがある度にカウンターを増やしていくという簡単な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 件のコメント:

コメントを投稿