Spring容器启动后自动执行Servlet进行预处理

本文是转载自:http://www.cnblogs.com/chenguanwei/archive/2010/04/03/1703837.html

 

通常做法是定义一个Servlet,并在web.xml中配置Servlet的启动顺序<load-on-startup>的值在DispatcherServlet之后。但这样做的缺点是在Servlet中无法使用Spring的依赖注入功能,只能使用WebApplicationContext的getBean()方法获取bean。

找到的解决办法如下:

1、自定义一个用于代理启动Servlet的类DelegatingServletProxy:

package com.test.common.util;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class DelegatingServletProxy extends GenericServlet {

	private String targetBean;
	private Servlet proxy;
	
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		proxy.service(arg0, arg1);
	}

	@Override
	public void init() throws ServletException {
		this.targetBean = getServletName();
		getServletBean();
		proxy.init(getServletConfig());
	}
	
	private void getServletBean() {
		WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
		this.proxy = (Servlet)wac.getBean(targetBean);
	}

}

 2、编写启动Servlet:

package com.test.common.util;

import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

import cn.edu.swu.oa.agency.model.Department;
import cn.edu.swu.oa.agency.model.Group;
import cn.edu.swu.oa.agency.service.DepService;
import cn.edu.swu.oa.agency.service.GroService;
import cn.edu.swu.oa.common.model.SysCode;
import cn.edu.swu.oa.safe.model.User;
import cn.edu.swu.oa.safe.service.UserService;

/**
 * 
 *
 * 类型解释:Spring启动完成后执行初始化操作
 * 类型表述:预读某些实体的Key-Value,放入map,方便以后使用
 * @author 
 * @version 
 *
 */
@Component("initialServlet")
public class InitialServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Resource
	private UserService userService;
	
	@Resource
	private DepService depService;
       
	@Resource
	private GroService groService;
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public InitialServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		//初始化eserMap
		List<User> users = userService.getUsers();
		for(int i = 0; i < users.size(); i++) {
			User user = users.get(i);
			Integer userId = user.getUserId();
			String userName = user.getUserName();
			SysCode.userMap.put(userId, userName);
		}
		//初始化depMap
		List<Department> deps = depService.getAllDeps();
		for(int i = 0; i < deps.size(); i++) {
			Department dep = deps.get(i);
			Integer depId = dep.getDepId();
			String depName = dep.getDepName();
			SysCode.depMap.put(depId, depName);
		}
		//初始化groMap
		List<Group> gros = groService.getAllGroups();
		for(int i = 0; i < gros.size(); i++) {
			Group gro = gros.get(i);
			Integer groId = gro.getGroId();
			String groName = gro.getGroName();
			SysCode.groMap.put(groId, groName);
		}
	}

}

 3、在web.xml文件中配置InitialServlet :

<servlet>
    <description></description>
    <display-name>InitialServlet</display-name>
    <servlet-name>initialServlet</servlet-name>
    <servlet-class>
            com.test.common.util.DelegatingServletProxy 
    </servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>initialServlet</servlet-name>
    <url-pattern>/InitialServlet</url-pattern>
</servlet-mapping>
 完成这些操作后,就可以在Spring容器启动后执行自定义的Servlet,并且在自定义Servlet中可以使用Spring Annotation的自动注入功能。 <script></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet过滤器和拦截器是Java Web开发中常用的组件,用于在请求处理流程中进行预处理或后处理操作。它们之间的主要区别如下: 1. 运行位置不同: - 过滤器:在Servlet容器中的Servlet调用前后执行,即位于Servlet之前拦截请求或之后拦截响应。 - 拦截器:在DispatcherServlet处理请求前后执行,即位于Controller之前拦截请求或之后拦截响应。 2. 功能不同: - 过滤器:通过在请求处理前后进行过滤,可以修改请求参数、检查用户权限、记录日志等。 - 拦截器:更加专注于请求的处理流程,可以对请求进行控制、修改ModelAndView对象、异常处理等。 3. 使用方式不同: - 过滤器:在web.xml文件中配置过滤器名称及执行顺序,过滤器可以过滤所有的Servlet请求或静态资源请求。 - 拦截器:通过在Spring配置文件中使用<interceptors>标签来配置拦截器,拦截器只能拦截Spring MVC中的请求。 4. 生命周期不同: - 过滤器:在Servlet容器启动时创建,随Servlet容器的启停而启停。 - 拦截器:由Spring容器管理,随Spring容器的启停而启停。 综上所述,过滤器既可以拦截Servlet请求也可以拦截静态资源请求,功能更灵活多样;而拦截器专注于对请求处理的控制和修改,灵活性相对较强。在实际应用中,选择使用过滤器还是拦截器,可以根据具体的需求和场景进行合理选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值