使用Servlet配置Spring Ioc

我是Spring的新手,想把spring ioc连接到我的小(测试)web-app。

我有这样的Servlet ProductServlet

 public class ProductServlet extends HttpServlet{ private static final long serialVersionUID = 1L; private RequestHelper requestHelper; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request); } private void processRequest(HttpServletRequest request){ requestHelper.process(request); } public RequestHelper getRequestHelper() { return requestHelper; } public void setRequestHelper(RequestHelper requestHelper) { this.requestHelper = requestHelper; } } 

和我的web.xml:

   ProductServlet com.epam.productshop.controller.ProductShop   ProductServlet /ProductServlet    org.springframework.web.context.ContextLoaderListener    contextConfigLocation  /WEB-INF/spring-config.xml   

而且我有这样的弹簧配置xml:

          

我有这样的问题:

我想在servlet init()期间将spring set requestHelper对象放入我的servlet中。 但不是这个,它给了我nullpointer。

我正在尝试从HttpRequestHandler实现我的servlet,编写SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext()); 进入init()方法和我在互联网上看到的其他东西,但所有这些都没有解决我的问题。

请帮帮我

在你的问题中你有

    

您不能使用Spring容器实例化servlet,它们由servlet容器实例化。 您只是声明了另一个ProductServlet实例。

因此,当调用Servlet init()方法时,您应该调用

 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext());` 

要注入requestHelper,请在servlet中声明@Autowired注释的字段或属性:

 private RequestHelper requestHelper; @Autowired public void setRequestHelper(RequestHelper requestHelper){ this.requestHelper = requestHelper; } 

来自processInjectionBasedOnServletContext javadoc:

根据存储在ServletContext中的当前根Web应用程序上下文,为给定目标对象处理@Autowired注入。

这是一个解决方案,可能对您有所帮助:

 public class ProductServlet extends HttpServlet { private static final long serialVersionUID = 1L; private RequestHelper requestHelper = null; private requestHelperInit(HttpServletRequest request) { if(requestHelper == null) { ApplicationContext ap = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); requestHelper = ap.getBean(RequestHelper.class); } } } 

然后在doGet()doPost()方法中调用requestHelperInit(request) doPost()方法作为第一个语句。

如果您仍在寻找解决方案,那么我希望这会帮助您。

你有几个选择。 如果你真的想要注入一个servlet,问题是servlet容器已经负责创建servlet了。 由于注入是创建时间,并且创建这个servlet有点困难,因此必须使用不太优雅的解决方案。 但是, 这个问题解释了如何注入servlet。

另一方面,您可能会考虑中止此方法。 如果您真的在创建Web应用程序,那么直接编写servlet api代码并不常见。 为什么不选择位于servlet api之上的众多Web应用程序框架之一,并提供更高级别的function,即铃声和口哨声。 其中一个function是,这些框架可以方便地与Spring集成,因此您可以轻松注入代码。 例如,Struts 2有一个spring插件,允许你使用spring来注入框架创建的所有对象,包括框架基础结构组件。