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

来源:互联网 发布:内网不能访问外网域名 编辑:程序博客网 时间:2024/05/06 07:04

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


找到的解决办法如下:
1、自定义一个用于代理启动Servlet的类DelegatingServletProxy:
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package com.xxxx;  
  2.   
  3.   
  4. import java.io.IOException;    
  5.     
  6. import javax.servlet.Servlet;    
  7. import javax.servlet.ServletContext;    
  8. import javax.servlet.ServletException;    
  9. import javax.servlet.http.HttpServlet;    
  10. import javax.servlet.http.HttpServletRequest;    
  11. import javax.servlet.http.HttpServletResponse;    
  12.     
  13. import org.springframework.web.context.WebApplicationContext;    
  14. import org.springframework.web.context.support.WebApplicationContextUtils;    
  15.     
  16. public class DelegatingServletProxy extends HttpServlet {    
  17.     private static final long serialVersionUID = 1L;    
  18.     private String targetServletBean;    
  19.     private Servlet proxy;    
  20.         
  21.     @Override    
  22.     public void init() throws ServletException {    
  23.         this.targetServletBean = this.getInitParameter("targetServletBean");    
  24.         this.getServletBean();    
  25.         this.proxy.init(this.getServletConfig());    
  26.     }    
  27.     
  28.     @Override    
  29.     protected void service(HttpServletRequest request, HttpServletResponse response)    
  30.             throws ServletException, IOException {    
  31.         proxy.service(request,response);     
  32.     }    
  33.     
  34.     private void getServletBean(){    
  35.         ServletContext servletContext = this.getServletContext();    
  36.         WebApplicationContext wac = null;     
  37.         wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);    
  38.         this.proxy = (Servlet) wac.getBean(targetServletBean);    
  39.     }    
  40. }    


2、不同于一般的 Servlet 在 web.xml 中的配置,需要配置的是 Servlet 代理类,而非 Servlet:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <servlet>    
  2.     <servlet-name>proxyServletBean</servlet-name>    
  3.     <servlet-class>com.xxxx.DelegatingServletProxy</servlet-class>    
  4.     <init-param>    
  5.         <param-name>targetServletBean</param-name>    
  6.         <param-value>myBean</param-value>    
  7.     </init-param>    
  8.     <load-on-startup>2</load-on-startup>  
  9. </servlet>        
  10. <servlet-mapping>    
  11.     <servlet-name>proxyServletBean</servlet-name>    
  12.     <url-pattern>/file</url-pattern>    
  13. </servlet-mapping>    

3、用spring bean的方式定义名字是myBean的servlet。如同一般的 Servlet 我们的这个 MyServlet 需要继承 GenericServlet 或者 HttpServlet:
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. @Component("myBean")  
  2. public class MyServlet extends HttpServlet {  
  3.     private static final long serialVersionUID = 1L;  
  4.       
  5.     @Resource  
  6.     private UserService userService;  
  7.       
  8.       
  9.     /** 
  10.      * @see HttpServlet#HttpServlet() 
  11.      */  
  12.     public InitialServlet() {  
  13.         super();  
  14.     }  
  15.     /** 
  16.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
  17.      */  
  18.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  19.           
  20.     }  
  21.     /** 
  22.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  23.      */  
  24.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  25.         // TODO Auto-generated method stub  
  26.     }  
  27.     @Override  
  28.     public void init(ServletConfig config) throws ServletException {  
  29.         //初始化eserMap  
  30.         List<User> users = userService.getUsers();  
  31.         for(int i = 0; i < users.size(); i++) {  
  32.             User user = users.get(i);  
  33.             Integer userId = user.getUserId();  
  34.             String userName = user.getUserName();  
  35.             SysCode.userMap.put(userId, userName);  
  36.         }  
  37.     }  
  38. }  


4、如果是多个 Servlet 的话,可以共用同一个代理 Servlet。Servlet 代码和代理 Servlet 代码无须改变,只需要注意一下在 web.xml 里的配置即可:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <servlet>    
  2.     <servlet-name>proxyServletBean2</servlet-name>    
  3.     <servlet-class>com.xxxx.DelegatingServletProxy</servlet-class>    
  4.     <init-param>    
  5.         <param-name>targetServletBean</param-name>    
  6.         <param-value>myBean2</param-value>    
  7.     </init-param>    
  8. </servlet>        
  9. <servlet-mapping>    
  10.     <servlet-name>proxyServletBean2</servlet-name>    
  11.     <url-pattern>/file2</url-pattern>    
  12. </servlet-mapping>        
  13.     
  14. <servlet>    
  15.     <servlet-name>proxyServletBean3</servlet-name>    
  16.     <servlet-class>com.xxxx.DelegatingServletProxy</servlet-class>    
  17.     <init-param>    
  18.         <param-name>targetServletBean</param-name>    
  19.         <param-value>myBean3</param-value>    
  20.     </init-param>    
  21. </servlet>        
  22. <servlet-mapping>    
  23.     <servlet-name>proxyServletBean3</servlet-name>    
  24.     <url-pattern>/WebService</url-pattern>    
  25. </servlet-mapping>        
0 0
原创粉丝点击