【问题标题】:How to connect HttpServlet with Spring Application Context in web.xml?如何在 web.xml 中将 HttpServlet 与 Spring Application Context 连接起来?
【发布时间】:2009-12-08 13:24:30
【问题描述】:

我正在尝试将扩展 HttpServlet 的 FooServlet 与位于同一项目中的 ApplicationContext 连接起来。 应用程序上下文已被 Wicket Servlet 使用

它适用于

servletContext = this.getServletContext();
wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
(IMyBean)wac().getBean("myServiceBean")

现在我尝试避免在我的代码 (WebApplicationContextUtils) 中显式使用 Spring 类,因为这不是 IoC 方式。

Wicket Servlet 与 web.xml 中的应用程序上下文相关联

<servlet>
  <servlet-name>ExampleApplication</servlet-name>
  <servlet-class>org.apache.wicket.protocol.http.WicketServlet</servlet-class>
    <init-param>
      <param-name>applicationFactoryClassName</param-name>
      <param-value>org.apache.wicket.spring.SpringWebApplicationFactory</param-value>
    </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

我找到了 Spring HttpServletBean 类,但我不知道它是否适用于我的案例

【问题讨论】:

  • 我不清楚您想要实现什么 - 您想将您的 servlet 与应用程序上下文连接起来,但又不将 Spring 代码放入 servlet 中?
  • 没错,我想有一种方法可以将 FooServlet 与 web.xml 中的 ApplicationContext 连接起来。我知道它对 Wicket 和 Spring MVC 是如何工作的,但对 Basic HttpServlet 却不是
  • 但是 Spring MVC 和 Wicket 都包含 Spring 代码。如果您的 servlet 中没有 Spring 代码,您希望如何访问 Spring 上下文?
  • 我认为对于没有 Wicket 的普通 HttpServlets 有一个像 org.apache.wicket.spring.SpringWebApplicationFactory 这样的类。
  • Martin Dürrmeiers 已在 springsource forum.springsource.org/showthread.php?t=75289 确认答案

标签: spring


【解决方案1】:

我找到了一种在我的 HttpServlet 中注入 Beans 的方法(注意:我不需要 Presentation View,否则还有更高级的 Spring Classes)

将 ContextLoaderListener 添加到 web.xml 以便加载 Spring 的根 WebApplicationContext

   <listener>
      <listener-class>
        org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

使用 Springs HttpRequestHandlerServlet 类配置 Servlet

<servlet>
 <servlet-name>FooServlet</servlet-name>
 <display-name>Foo Servlet</display-name>
 <servlet-class>
      org.springframework.web.context.support.HttpRequestHandlerServlet
    </servlet-class>
</servlet>

让你的 Servlet 实现org.springframework.web.HttpRequestHandler 接口

将您的 Servlet 定义为 ApplicationContext 中的 Bean(beanID 必须与“servlet-name”相同)。 现在可以通过 Spring DependencyInjection 方式注入所有需要的 Bean,无需依赖查找。

【讨论】:

  • Martin,您知道将 HttpServlet(其源无法更改)注入 Spring Web App DAO 类的任何方法吗? ...我有一个 HttpServlet,我需要初始化数据,并且需要在部署我的应用程序时调用它。这对我来说是一个相当大的问题。有什么想法吗?
  • 谢谢 Paŭlo,格式被破坏了,它和 servlet-name 一样
  • 你还需要一个
  • @MartinDürrmeier- 这是针对单个 servlet...如果我的应用程序中有多个 servlet 怎么办?
【解决方案2】:

我认为您应该使用 Spring 实用程序,例如 RequestContextUtils.getWebApplicationContext(request, application); 在您的 Servlet 中连接 Spring 上下文。 同意这不是 DI/IoC,但 servlet 也不是 bean!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-17
    • 2018-10-11
    • 2020-12-28
    • 1970-01-01
    • 2011-10-17
    • 2015-06-18
    • 2015-02-26
    • 2019-11-25
    相关资源
    最近更新 更多