首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-09-03 
Spring容器启动后自动执行Servlet进行预处理本文是转载自:http://www.cnblogs.com/chenguanwei/archive/20

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;@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {proxy.service(arg0, arg1);}@Overridepublic 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;@Resourceprivate UserService userService;@Resourceprivate DepService depService;       @Resourceprivate 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}@Overridepublic void init(ServletConfig config) throws ServletException {//初始化eserMapList<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);}//初始化depMapList<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);}//初始化groMapList<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>

热点排行