在servlet里面调用spring的备案出现空指针的问题

来源:互联网 发布:电脑如何切换网络 编辑:程序博客网 时间:2024/06/05 05:52

为什么会报空指针?

servlet 是由web容器管理,而不是由spring管理,因为servlet是单例的,那么当servlet刚刚创建的时候,spring可以为servlet注入的,但是在你访问的时候,servlet信息被重置了,而刚刚被注入进去的对象又变为空值了。


知道了原理,解决也很简单:我们用一个代理servlet解决,利用代理的servlet去调用业务servlet。

代理servlet:

  1. import javax.servlet.ServletException;  
  2. import javax.servlet.http.HttpServlet;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5. import org.apache.commons.logging.Log;  
  6. import org.apache.commons.logging.LogFactory;  
  7. import org.springframework.web.context.WebApplicationContext;  
  8. import org.springframework.web.context.support.WebApplicationContextUtils;  
  9. /** 
  10.  * HttpServlet 代理 
  11.  * @author lsh
  12.  */  
  13. public class HttpServletProxy extends HttpServlet {  
  14.     /** 
  15.      * random serialVersionUID 
  16.      */  
  17.     private static final long serialVersionUID = -7208519469035631940L;  
  18.     Log logger = LogFactory.getLog(HttpServletProxy.class);  
  19.     private String targetServlet;  
  20.     private HttpServlet proxy;  
  21.     public void init() throws ServletException {  
  22.         this.targetServlet = getInitParameter("targetServlet");  
  23.         getServletBean();  
  24.         proxy.init(getServletConfig());  
  25.         System.out.println(targetServlet + " was inited by HttpServletProxy  successfully......");  
  26.     }  
  27.     private void getServletBean() {  
  28.         WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());  
  29.         this.proxy = (HttpServlet) wac.getBean(targetServlet);  
  30.     }  
  31.     @Override  
  32.     public void service(HttpServletRequest request, HttpServletResponse response)  
  33.             throws ServletException, IOException, RuntimeException {  
  34.         proxy.service(request, response);  
  35.     }  
  36. }
业务serlvet:

  1. import java.io.IOException;  
  2. import javax.servlet.ServletException;  
  3. import javax.servlet.ServletOutputStream;  
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. import com.origin.mobile.factory.IDemoFactory;  
  9. /** 
  10.  * @author lsh
  11.  */  
  12. public class UserCheckServlet extends HttpServlet {  
  13.     /** 
  14.      * random serialVersionUID 
  15.      */  
  16.     private static final long serialVersionUID = 3075635113536622929L;  
  17.     private IDemoFactory idemoFactory;//UserService 是spring托管的bean,通过set方法注入  
  18.     public void setIdemoFactory (IDemoFactory idemoFactory) {  
  19.         this.idemoFactory = idemoFactory;  
  20.     }  
  21.     public UserCheckServlet() {  
  22.         super();  
  23.     }  
  24.     public void init() throws ServletException {  
  25.         super.init();  
  26.     }  
  27.     @Override  
  28.     public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)  
  29.             throws ServletException, IOException, RuntimeException {  
  30.         String str = idemoFactory.testMobile();  
  31.         System.out.println("=======================str:"+str);  
  32.     }     
  33. }
web.xml配置 
  1. <servlet>  
  2.         <servlet-name>UserCheckProxy</servlet-name>  
  3.         <servlet-class>com.origin.mobile.servlet.HttpServletProxy</servlet-class>  
  4.         <init-param>  
  5.             <param-name>targetServlet</param-name>  
  6.             <param-value>userCheckServlet</param-value><!--业务servlet配置为spring的bean时的名字-->  
  7.         </init-param>  
  8.     </servlet>  
  9.     <servlet-mapping>  
  10.         <servlet-name>UserCheckProxy</servlet-name>  
  11.         <url-pattern>/UserCheck.do</url-pattern>  
  12.     </servlet-mapping>

spring配置文件:

  1. <bean id="userCheckServlet" class="com.origin.mobile.servlet.UserCheckServlet">  
  2.         <property name="idemoFactory" ref="demoFactory"></property>  
  3.     </bean>






原创粉丝点击