阅读 22

JAVA_WEB_自定义ServletContext监听器

ServletContext监听器

实现

1.实现ServletContext 监听器。在容器启动的时候,用来初始化数据。

2.实现代码:

package com.jeeplus.common.utils;

import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jeeplus.modules.sys.entity.DictType;
import com.jeeplus.modules.sys.entity.DictValue;
import com.jeeplus.modules.sys.mapper.DictTypeMapper;
import com.jeeplus.modules.sys.utils.DictUtils;

public class ServletContextInitListener implements ServletContextListener {

	@Autowired
	private DictTypeMapper dictTypeMapper;
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("----------------------------servletContenxt init -------------------------------------");
		//每次容器启动的时候,随机生成资源版本号
		double version = Math.random();
		ServletContext sc = sce.getServletContext();
		sc.setAttribute("resourceVersion", version);
		// 通过设置这句话,可以 使用注解来获取 Spring容器中的bean
		WebApplicationContextUtils.getWebApplicationContext(sc).getAutowireCapableBeanFactory().autowireBean(this);
		//接下来初始化 字典缓存
		Map<String, List<DictValue>> dictMap = (Map<String, List<DictValue>>)CacheUtils.get(DictUtils.CACHE_DICT_MAP);
		if (dictMap==null){
			dictMap = Maps.newHashMap();
			for (DictType dictType : dictTypeMapper.findList(new DictType())){
				List<DictValue> dictList = dictMap.get(dictType.getType());
				dictType = dictTypeMapper.get(dictType.getId());
				if (dictList != null){
					dictList.addAll(dictType.getDictValueList());
				}else{
					dictMap.put(dictType.getType(), Lists.newArrayList(dictType.getDictValueList()));
				}
			}
			CacheUtils.put(DictUtils.CACHE_DICT_MAP, dictMap);
		}
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("----------------------------servletContenxt destory -------------------------------------");
	}

}

复制代码

注意: 通过设置这句话,可以 使用注解来获取 Spring容器中的bean WebApplicationContextUtils.getWebApplicationContext(sc).getAutowireCapableBeanFactory().autowireBean(this);

2.web.xml配置监听。

<listener>
  	<listener-class>com.jeeplus.common.utils.ServletContextInitListener</listener-class>
</listener>
复制代码
  • 注意:此监听配置,一定要放到Spring容器的监听之后,否则获取不到Bean,报空指针异常。

Q1:SSM + shiro 框架下 ,自定义ServletContext监听器下,获取 ServiceBean ,报shiro错误 ?