5

I'm trying to connect my FooServlet which extends HttpServlet with the ApplicationContext which is in the same Project. The Application Context is already used by a Wicket Servlet

It works with

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

Now I try to aviod to use explicitly Spring Classes in my Code (WebApplicationContextUtils) as it's not the IoC way.

The Wicket Servlet is connected with the Application context in the 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>

I found the class Spring HttpServletBean but I don't know if it serves for my Case

5
  • I'm unclear as to what you're trying to achieve - you want to connect your servlet with the app context, but without putting Spring code in the servlet? Commented Dec 8, 2009 at 13:30
  • exactly, I guess there is a way to connect FooServlet with ApplicationContext in the web.xml. I know how it works for Wicket and Spring MVC but not for a Basic HttpServlet Commented Dec 8, 2009 at 14:01
  • 1
    But Spring MVC and Wicket both contain Spring code. How do you expect to access the Spring context without Spring code in your servlet? Commented Dec 8, 2009 at 14:41
  • I thought there is a class like org.apache.wicket.spring.SpringWebApplicationFactory for normal HttpServlets without Wicket. Commented Dec 8, 2009 at 15:13
  • Martin Dürrmeiers answer confirmed at springsource forum.springsource.org/showthread.php?t=75289 Commented Apr 28, 2010 at 11:35

2 Answers 2

15

I found a way to inject Beans in my HttpServlet (Note: I don't need a Presentation View, otherwise there are more advanced Spring Classes)

Add a ContextLoaderListener to web.xml so that Spring's root WebApplicationContext is loaded

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

Configure Servlet using Springs HttpRequestHandlerServlet Class

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

Let your Servlet implement the org.springframework.web.HttpRequestHandler Interface

Define your Servlet as a Bean in ApplicationContext (beanID must be same as "servlet-name"). Now it's possible to inject all necassary Beans in the Spring DependencyInjection way without dependency lookup.

Sign up to request clarification or add additional context in comments.

4 Comments

Martin, do you know of any way to inject an HttpServlet (whose source cannot change) into a Spring Web App DAO class? ... I have an HttpServlet that I need to initialize data and I need to call it when my app is deployed. It's been quite a problem for me. Any thoughts?
Thanks Paŭlo, the formatting was somehow broken, it's the same as servlet-name
You also need a <servlet-mapping>
@MartinDürrmeier- This is for single servlet...what if i have multiple servlets in my application?
2

I think you should use Spring utilities like RequestContextUtils.getWebApplicationContext(request, application); to hookup the Spring Context within your Servlet. Agreed this is no DI/IoC, but the servlet is no bean as well !

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.