使用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来注入框架创建的所有对象,包括框架基础结构组件。