Springには、 ”

ContextLoaderListener

“リスナーが付属しており、セッションリスナーへのSpring依存性注入を有効にします。このチュートリアルでは、セッションリスナーにBeanにSpring依存性インジェクションを追加することによって、このリンク://servlet/a-simple-httpsessionlistener-example-active-sessions-counter/[HttpSessionListenerの例]を改訂します。

1. Spring Beans

作成されたセッションの合計数を出力する簡単なカウンタサービスを作成します。

ファイル:Counter Service.java

package com.mkyong.common;

public class CounterService{

    public void printCounter(int count){
        System.out.println("Total session created : " + count);
    }

}


File:counter.xml

– Bean構成ファイル。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="counterService" class="com.mkyong.common.CounterService"/>

</beans>

2. WebApplicationContextUtils

Springのコンテキストを取得するために “` `WebApplicationContextUtils`”を使用し、その後、通常のSpringの方法で宣言されたSpringのBeanを取得できます。

ファイル:セッションカウンタListener.java

package com.mkyong.common;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class SessionCounterListener implements HttpSessionListener {

     private static int totalActiveSessions;

     public static int getTotalActiveSession(){
           return totalActiveSessions;
     }

    @Override
    public void sessionCreated(HttpSessionEvent arg0) {
           totalActiveSessions++;
           System.out.println("sessionCreated - add one session into counter");
           printCounter(arg0);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent arg0) {
           totalActiveSessions--;
           System.out.println("sessionDestroyed - deduct one session from counter");
           printCounter(arg0);
    }

    private void printCounter(HttpSessionEvent sessionEvent){

          HttpSession session = sessionEvent.getSession();

          ApplicationContext ctx =
                WebApplicationContextUtils.
                      getWebApplicationContext(session.getServletContext());

          CounterService counterService =
                      (CounterService) ctx.getBean("counterService");

          counterService.printCounter(totalActiveSessions);
    }
}

3.統合

唯一の問題は、WebアプリケーションがSpring Beanの設定ファイルをどこにロードするかを知っていることです。秘密は “web.xml”ファイルの中にあります。

  1. 最初のリスナーとして「ContextLoaderListener`」を登録して、

WebアプリケーションはSpringコンテキストローダを認識します。

  1. “contextConfigLocation”を設定し、あなたのSpringのbeanを定義してください

構成ファイル。

ファイル:web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app__2__3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/Spring/counter.xml</param-value>
  </context-param>

  <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
  </listener>

  <listener>
    <listener-class>
            com.mkyong.common.SessionCounterListener
        </listener-class>
  </listener>

  <servlet>
    <servlet-name>Spring DI Servlet Listener</servlet-name>
    <servlet-class>com.mkyong.common.App</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Spring DI Servlet Listener</servlet-name>
    <url-pattern>/Demo</url-pattern>
  </servlet-mapping>

</web-app>


File:App.java

package com.mkyong.common;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class App extends HttpServlet{

  public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException{

        HttpSession session = request.getSession();//sessionCreated() is executed
        session.setAttribute("url", "mkyong.com");
        session.invalidate(); //sessionDestroyed() is executed

        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("<h1>Spring Dependency Injection into Servlet Listenner</h1>");
        out.println("</body>");
        out.println("</html>");

   }
}

Tomcatを起動し、URL「


http://localhost:8080/SpringWebExample/Demo


」にアクセスします。


出力

sessionCreated - add one session into counter
Total session created : 1
sessionDestroyed - deduct one session from counter
Total session created : 0

コンソール出力を参照し、Spring DIを介してカウンタサービスBeanを取得し、セッションの合計数を出力します。

結論

Springでは、 “ContextLoaderListener”は、ほとんどすべてのWebアプリケーション** にSpring依存性注入を統合する一般的な方法です。

ダウンロード

ダウンロードする – リンク://wp-content/uploads/2010/03/SpringWeb-DI-Session-listener-Example.zip[SpringWeb-DI-Session-listener-Example.zip]