使用Servlet配置Spring Ioc

时间:2012-11-19 20:38:51

标签: java spring servlets

我是Spring的新手,想将spring ioc连接到我的小型(测试)网络应用程序中。

我有这样的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:

  <servlet>
    <servlet-name>ProductServlet</servlet-name>
    <servlet-class>com.epam.productshop.controller.ProductShop</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ProductServlet</servlet-name>
    <url-pattern>/ProductServlet</url-pattern>
  </servlet-mapping>

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

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring-config.xml
        </param-value>
    </context-param>

我也有这样的弹簧配置xml:

<bean id="factory" class="com.epam.productshop.readerfactory.ReaderFactory">
    <property name="file" value="/xml/products.xml" />
</bean>

<bean id="requestHelper" class="com.epam.productshop.requesthelper.RequestHelper" scope="singleton">
    <property name="factory" ref="factory" />
</bean>

<bean name="ProductServlet" class="com.epam.productshop.controller.ProductServlet" scope="singleton">
    <property name="requestHelper" ref="requestHelper"/>        
</bean>

我有这样的问题:

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

我正在尝试从HttpRequestHandler实现我的servlet,将SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext());写入init()方法以及我在互联网上看到的其他内容,但所有这些都无法解决我的问题。 / p>

请帮帮我

3 个答案:

答案 0 :(得分:6)

在你提出的问题中

<bean name="ProductServlet" class="com.epam.productshop.controller.ProductServlet" scope="singleton">
    <property name="requestHelper" ref="requestHelper"/>        
</bean>

您不能使用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:

  

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

答案 1 :(得分:2)

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

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);
       }
    }
}

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

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

答案 2 :(得分:1)

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

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