爲什麼會報空指針?
servlet 是由web容器管理,而不是由spring管理,因爲servlet是單例的,那麼當servlet剛剛創建的時候,spring可以爲servlet注入的,但是在你訪問的時候,servlet信息被重置了,而剛剛被注入進去的對象又變爲空值了。
知道了原理,解決也很簡單:我們用一個代理servlet解決,利用代理的servlet去調用業務servlet。
代理servlet:
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- /**
- * HttpServlet 代理
- * @author lsh
- */
- public class HttpServletProxy extends HttpServlet {
- /**
- * random serialVersionUID
- */
- private static final long serialVersionUID = -7208519469035631940L;
- Log logger = LogFactory.getLog(HttpServletProxy.class);
- private String targetServlet;
- private HttpServlet proxy;
- public void init() throws ServletException {
- this.targetServlet = getInitParameter("targetServlet");
- getServletBean();
- proxy.init(getServletConfig());
- System.out.println(targetServlet + " was inited by HttpServletProxy successfully......");
- }
- private void getServletBean() {
- WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
- this.proxy = (HttpServlet) wac.getBean(targetServlet);
- }
- @Override
- public void service(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException, RuntimeException {
- proxy.service(request, response);
- }
- }
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.origin.mobile.factory.IDemoFactory;
- /**
- * @author lsh
- */
- public class UserCheckServlet extends HttpServlet {
- /**
- * random serialVersionUID
- */
- private static final long serialVersionUID = 3075635113536622929L;
- private IDemoFactory idemoFactory;//UserService 是spring託管的bean,通過set方法注入
- public void setIdemoFactory (IDemoFactory idemoFactory) {
- this.idemoFactory = idemoFactory;
- }
- public UserCheckServlet() {
- super();
- }
- public void init() throws ServletException {
- super.init();
- }
- @Override
- public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
- throws ServletException, IOException, RuntimeException {
- String str = idemoFactory.testMobile();
- System.out.println("=======================str:"+str);
- }
- }
- <servlet>
- <servlet-name>UserCheckProxy</servlet-name>
- <servlet-class>com.origin.mobile.servlet.HttpServletProxy</servlet-class>
- <init-param>
- <param-name>targetServlet</param-name>
- <param-value>userCheckServlet</param-value><!--業務servlet配置爲spring的bean時的名字-->
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>UserCheckProxy</servlet-name>
- <url-pattern>/UserCheck.do</url-pattern>
- </servlet-mapping>
spring配置文件:
- <bean id="userCheckServlet" class="com.origin.mobile.servlet.UserCheckServlet">
- <property name="idemoFactory" ref="demoFactory"></property>
- </bean>