2012-09-12 54 views
0

我将我的知识转移到spring,而我真的不知道这是如何工作的。我试图做一个非常简单的例子,使其工作,但我不能使它发挥作用: - ((Spring新手,在jsp页面中调用spring bean方法(2.5,xml),测试

的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完美,但不能调用serviceTest callTest方法中,它说显示java.lang.NullPointerException ¿我应该在jsp文件中以这种方式包含bean serviceMovility吗? ¿为什么spring不会在serviceMovility中注入serviceTest初始化?

我花了2天的时间,但是我没能解决所有的问题。我不知道该怎么办。

在此先感谢。

+0

对不起,我把同样的错误。 setter方法和实现是原始代码。我第一次错了。我甚至验证了setter方法被调用。但是当jsp调用bean时,它给了我空指针异常。非常感谢你 – JosiDiez

+0

你可以发布这个'NullPointerException'的完整堆栈跟踪吗? – Xaerxess

回答

0

使用的实现,而不是接口,同时限定豆:

<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> 

加,在您的*默认地将Impl类定义制定者所注入的依赖关系,即在ServiceMovilityImpl

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

编辑

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

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> 
+0

是的,我使用的实现,对不起,我复制两行错误翻译为示例。非常感谢你 – JosiDiez

+0

它现在工作吗? – Xaerxess

+0

是的! , 非常感谢你。我非常感激。 – JosiDiez

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

} 
+0

是的,我使用的实现,我得到了setter方法,对不起,我复制两行错误翻译为示例。非常感谢你 – JosiDiez

+0

很高兴帮助,它现在应该工作。 –

+0

对不起,我保持同样的错误。 setter方法和实现是原始代码。我第一次错了。我甚至验证了setter方法被调用。但是当jsp调用bean时,它给了我空指针异常。非常感谢你 – JosiDiez