Spring新手,在jsp页面中调用spring bean方法(2.5,xml),进行测试

时间:2012-09-12 12:12:15

标签: spring jsp spring-mvc nullpointerexception

我将我的知识转移到春天,我真的不知道这是如何工作的。我试图做一个非常基本的例子来使它工作,但我无法使它工作: - ((

的applicationContext.xml

<bean id="serviceTest" class="es.mov.jose.agenda.ServiceTest">
</bean>

    <bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovility">
    <property name="serviceTest" ref="serviceTest" />
</bean>

    <bean name="/jose/req1.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    <property name="viewName" value="jose/req1" />
</bean>

ServiceMovility.java

package es.mov.jose.agenda;

public interface ServiceMovility {
        public String callTest();
}

ServiceMovilityImpl.java

package es.mov.jose.agenda;

import es.mov.jose.agenda.ServiceMovility;

public class ServiceMovilityImpl implements ServiceMovility {

    private ServiceTest serviceTest;    
    public String callTest() {
        return serviceTest.getValue();
    }

}  

ServiceTest.java

package es.mov.jose.agenda;

public interface ServiceTest {
        public String getValue();
}    

ServiceTestImpl.java

package es.mov.jose.agenda;

import es.mov.jose.agenda.ServiceTest;

public class ServiceTestImpl implements ServiceTest {

    public String getValue() {
        return "OK";
    }

}

最后是我的req1.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="es.mov.jose.agenda.ServiceMovility"%>
<%@ page import="es.mov.jose.agenda.ServiceMovilityImpl"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib prefix="sp-forms" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">    
</head>
<body>
<jsp:useBean id="serviceMovility" scope="request"     class="es.mov.jose.agenda.ServiceMovilityImpl" />
<div class="main" >
    <%
    String result = serviceMovility.callTest();
    out.println(result);
    %>
</div>
</body>
</html>

它完美地调用了serviceMovility但是在callTest方法中调用serviceTest失败了,它说java.lang.NullPointerException ¿我应该在jsp文件中以这种方式包含bean serviceMovility吗? ¿为什么spring不会在serviceMovility上注入serviceTest?

我花了两天时间,但我的所有解决方案都失败了。我不知道该怎么做。

提前致谢。

2 个答案:

答案 0 :(得分:0)

在定义bean时使用实现而不是接口:

<bean id="serviceTest" class="es.mov.jose.agenda.ServiceTestImpl" />

<bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovilityImpl">
  <property name="serviceTest" ref="serviceTest" />
</bean>

<bean name="/jose/req1.do"
    class="es.mov.jose.agenda.Req1Controller">
  <property name="viewName" value="jose/req1" />
  <property name="serviceMovility" ref="serviceMovility" />
</bean>

plus,在你的* Impl类中定义了注入依赖项的setter,即在ServiceMovilityImpl

public void setServiceTest(ServiceTest serviceTest) {
  this.serviceTest = serviceTest;
}

修改

你做错了......不要将bean注入JSP(通过jsp:useBean),而是直接注入Controller。定义自己的控制器:

package es.mov.jose.agenda;

final class Req1Controller extends ParameterizableViewController {

  private ServiceMovility serviceMovility;

  @Override
  protected ModelAndView handleRequestInternal(HttpServletRequest request,
      HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView(getViewName());
    mav.addObject("callTest", serviceMovility.callTest());
    return mav;
  }

  public void setServiceMovility(ServiceMovility serviceMovility) {
    this.serviceMovility = serviceMovility;
  }
}

像我上面那样编辑你的ApplicationContext.xml(使用Req1Controller代替ParameterizableViewController),在JSP中你将拥有${callTest}变量:

<body>
  <div class="main" >
    <c:out value="${callTest}" />
  </div>
</body>

答案 1 :(得分:0)

少数事情:

你不能创建界面实例:

<bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovility">
it shout be
<bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovilityImpl">

ServiceMovilityImpl必须为字段定义set方法。要做到这一点:

<property name="serviceTest" ref="serviceTest" />

这样做:

package es.mov.jose.agenda;

import es.mov.jose.agenda.ServiceMovility;

public class ServiceMovilityImpl implements ServiceMovility {

    private ServiceTest serviceTest;    

    public void setServiceTest(ServiceTest serviceTest){
        this.serviceTest = serviceTest;
    }

    public String callTest() {
        return serviceTest.getValue();
    }

}