我将我的知识转移到春天,我真的不知道这是如何工作的。我试图做一个非常基本的例子来使它工作,但我无法使它工作: - ((
的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?
我花了两天时间,但我的所有解决方案都失败了。我不知道该怎么做。
提前致谢。
答案 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();
}
}