为什么会报空指针?
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>