Spring 专题
专题目录
您的位置:java > Spring专题 > Spring依赖注入servlet会话监听器
Spring依赖注入servlet会话监听器
作者:--    发布时间:2019-11-20
spring提供了一个 “contextloaderlistener” 监听器,以使 spring 依赖注入到会话监听器。 在本教程中,通过添加一个 spring 依赖注入一个bean 到会话监听器修改 httpsessionlistener 例子。

1. spring beans

创建一个简单的计数服务来打印创建的会话总数。

file : counterservice.java

package com.h3.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.h3.common.counterservice" />
	
</beans>

2. webapplicationcontextutils

使用“webapplicationcontextutils”来获得 spring 上下文,以后可以得到任何声明spring的bean 在一个正常的 spring 方式。

file : sessioncounterlistener.java

package com.h3.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上下文加载程序。
  2. 配置“contextconfiglocation”,并定义spring的bean配置文件。

file : 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.h3.common.sessioncounterlistener
        </listener-class>
  </listener>

  <servlet>
	<servlet-name>spring di servlet listener</servlet-name>
	<servlet-class>com.h3.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.h3.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", "h3.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/7.2-springdemo/"

输出结果

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”是一个通用的方法集成spring依赖注入到几乎所有的web应用程序。

下载代码 –  http://pan.baidu.com/s/1bpmhqy

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册