athrunwang

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

          通常做法是定義一個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í)行初始化操作
           * 類型表述:預(yù)讀某些實體的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 閱讀(717) 評論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 堆龙德庆县| 壤塘县| 丰城市| 灵丘县| 盐山县| 平顶山市| 赤壁市| 新化县| 道孚县| 吐鲁番市| 镇江市| 广昌县| 虹口区| 阿拉善右旗| 原阳县| 旌德县| 安溪县| 常州市| 碌曲县| 文昌市| 舞阳县| 曲周县| 六盘水市| 新安县| 都兰县| 十堰市| 中宁县| 牙克石市| 垫江县| 长治县| 逊克县| 湘乡市| 香格里拉县| 上栗县| 溆浦县| 万载县| 武穴市| 金湖县| 化德县| 灵寿县| 深州市|