`
wsj356428476
  • 浏览: 109921 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

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

找到的解决办法如下:

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


package cn.edu.swu.oa.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 cn.edu.swu.oa.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;

/**
 * 
 * 工程:WebOA
 * 类型解释:Spring启动完成后执行初始化操作
 * 类型表述:预读某些实体的Key-Value,放入map,方便以后使用
 * @author ChenGuanwei
 * @version 创建时间:2010-3-25 下午10:55:44
 *
 */
@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);
		}
	}

}

在web.xml文件中配置InitialServlet :
<servlet>
    <description></description>
    <display-name>InitialServlet</display-name>
    <servlet-name>initialServlet</servlet-name>
    <servlet-class>cn.edu.swu.oa.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的自动注入功能。
分享到:
评论

相关推荐

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    Filter是在请求到达目标资源之前可以执行预处理操作的对象,并且在响应返回客户端之前可以执行后处理操作的对象。Filter的配置和加载顺序直接影响到请求的处理流程。 **示例代码:** ```xml &lt;filter-name&gt;...

    spring boot 开发 servlet filters listeners

    2. **Filter**:用于对客户端请求或服务器响应进行预处理或后处理。Filter 可以用来实现如权限控制、日志记录、编码转换等功能。 3. **Listener**:监听特定类型的事件并做出响应。常见的 Listener 包括监听 Servlet...

    基于Spring和Mybatis和servlet的人员信息管理系统.zip

    - Filter(过滤器):Servlet规范还定义了Filter接口,允许在请求到达目标Servlet之前进行预处理,或在响应发送给客户端之后进行后处理,实现如登录验证、GZIP压缩等功能。 4. 人员信息管理系统: - 在这样的系统...

    servlet官方源码

    7. **Servlet链**:Filter可以被用来在Servlet执行前进行预处理,或者在执行后进行后处理。多个Filter可以形成一个链,按顺序执行。 8. **异步处理**:从Servlet 3.0版本开始,Servlet API支持异步处理,允许...

    Servlet-api setvlet文档

    6. **过滤器Filter**:Servlet-api还提供了过滤器机制,允许在请求到达Servlet之前或之后进行预处理和后处理。通过实现`javax.servlet.Filter`接口,可以创建过滤器来拦截、修改或增强请求和响应。 7. **监听器...

    Springboot启动扩展点详细总结.docx

    这两个接口主要用于在 Spring Boot 应用启动后执行特定的初始化任务。ApplicationRunner 提供了 run 方法,接收 ApplicationArguments 参数,而 CommandLineRunner 接口的 run 方法不接收参数。这两个接口可以用于...

    servlet-ppt java web相关servlet课件

    - 过滤器在Servlet处理请求之前或之后执行,可用于预处理数据、验证权限等。 - 通过实现`Filter`接口,定义`doFilter()`方法,并在`web.xml`中配置过滤规则。 8. **监听器(Listener)**: - 监听器可以监听Web...

    Servlet 教程

    Filter可以在请求到达Servlet之前对其进行预处理,或者在响应发送给客户端之后进行后处理。Listener则可以监听Web应用中的特定事件,如session创建、销毁等,以执行相应的操作。 8. **MVC框架与Servlet** 虽然...

    servlet规范

    9. **Filter链**:Servlet规范还定义了Filter接口,允许开发者创建过滤器,它们可以在请求到达Servlet之前或之后执行预处理或后处理任务,如登录验证、内容编码转换等。 10. **WebSocket支持**:Servlet 3.1增加了...

    Servlet API(中文版)

    - Filter是Servlet API的一部分,可以在请求到达Servlet之前对其进行预处理,或者在响应返回客户端之后进行后处理。 - 在`web.xml`中配置过滤器,使用`&lt;filter&gt;`和`&lt;filter-mapping&gt;`元素定义过滤器及其拦截的URL...

    servlet资料文件

    5. **Filter链**:Servlet还可以配合Filter,实现预处理和后处理功能,如登录检查、数据过滤等。Filter可以串联形成一个过滤链,按照定义的顺序执行。 6. **JSP与Servlet关系**:JSP(JavaServer Pages)是另一种...

    Servlet开发流程

    为提高Servlet的性能,可以考虑使用多线程处理请求、实现Servlet的单例模式(通过`load-on-startup`元素设置Servlet加载时机)以及使用过滤器(Filter)来拦截和预处理请求。 8. **Servlet 3.0及以上版本的新特性*...

    servlet基础素材

    9. **过滤器**:Servlet过滤器允许在请求到达Servlet之前进行预处理,或在响应离开Servlet之后进行后处理。它们通过`Filter`接口实现,并在`web.xml`中配置。 10. **MVC模式**:虽然Servlet本身并不强制使用MVC...

    Servlet框架基本源码

    在Servlet框架中,Filter(过滤器)可以拦截请求和响应,进行预处理或后处理,比如字符编码转换、权限控制等。通过在web.xml中配置Filter,并使用`@WebFilter`注解,可以实现对多个Servlet的统一处理。 7. **MVC...

    J2EE中文API(Servlet)

    在服务器启动时,Servlet容器会加载Servlet并调用其`init()`方法进行初始化;接收到请求时,调用`service()`方法处理请求;当服务器关闭或Servlet不再使用时,调用`destroy()`方法释放资源。 2. **Servlet配置**:...

    JavaServlet帮助文档

    Servlet API还提供了Filter接口,允许在请求到达Servlet之前对其进行预处理,或者在响应返回给客户端之后进行后处理。Filter可以实现URL级别的拦截、登录检查等功能。 七、ServletContext上下文 ServletContext对象...

    Servlet初学必备,精华笔记

    - **Filter**:拦截Servlet的请求和响应,进行预处理或后处理,比如登录验证、GZIP压缩等。 - **Listener**:监听Web应用中的特定事件,如Session创建、销毁、Context初始化等,可以用来做相应的处理。 通过学习...

    servlet官方文档

    - Filter接口允许在Servlet处理请求之前或之后执行预处理和后处理操作。 - `web.xml`或Java编程方式(`@WebFilter`)可配置Filter,通过`doFilter()`方法拦截请求和响应。 7. **监听器Listener**: - 监听器监听...

    语言程序设计资料:第三章_Servlet_编程.ppt

    2. 过滤器(Filter):Servlet Filter允许在请求到达Servlet之前或之后执行预处理和后处理操作,如登录检查、内容编码转换等。 3. 容器管理的事务:Servlet可以在容器支持下进行事务处理,确保数据的一致性。 4. ...

    韩顺平细说Servlet源代码

    另外,还将讨论过滤器(Filter)和监听器(Listener)的概念,它们是Servlet容器中增强功能的重要工具,可以实现请求的预处理、后处理,以及对Servlet上下文事件的监听。 在讲解源代码的过程中,韩顺平会分享一些...

Global site tag (gtag.js) - Google Analytics