athrunwang

          紀元
          數(shù)據(jù)加載中……
          Spring容器啟動后自動執(zhí)行Servlet進行預處理

          通常做法是定義一個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啟動完成后執(zhí)行初始化操作
           * 類型表述:預讀某些實體的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容器啟動后執(zhí)行自定義的Servlet,并且在自定義Servlet中可以使用Spring Annotation的自動注入功能。 <script></script>

          posted on 2013-09-13 13:26 AthrunWang 閱讀(715) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 民县| 峡江县| 吕梁市| 沧州市| 嘉祥县| 景东| 通州区| 比如县| 改则县| 兴宁市| 泸水县| 万盛区| 孟州市| 扶沟县| 嘉荫县| 额济纳旗| 共和县| 蒙自县| 辽阳市| 商洛市| 翁牛特旗| 湟源县| 扬中市| 丘北县| 香河县| 阿鲁科尔沁旗| 普陀区| 梅州市| 郴州市| 伊吾县| 娄烦县| 临朐县| 昌邑市| 吉安市| 淅川县| 苍南县| 新巴尔虎左旗| 漳浦县| 辽宁省| 扎兰屯市| 双辽市|