如何在Spring框架中的model属性中使用bean

时间:2013-05-21 17:49:23

标签: java spring java-ee spring-mvc inversion-of-control

你好,这可能是一个愚蠢的问题但我是Spring框架工作的新手。请帮忙

的web.xml

<display-name>demo name</display-name>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>

的applicationContext.xml

<bean id="loginInfo" class="com.saurabh.dto.LoginInfo"></bean>
<bean id="contactInfo" class="com.saurabh.dto.ContactInformation"></bean>

<bean id="userDTO" class="com.saurabh.dto.UserDTO" scope="request"  abstract="false">
    <property name="login" ref="loginInfo"></property>
    <property name="contact" ref="contactInfo"></property>
</bean>

控制器

 @Controller
 public class LogonController {

@RequestMapping(value = "/requestLogon.htm",method={RequestMethod.POST,RequestMethod.GET})
public String registerUser(@ModelAttribute("userDTO") UserDTO user, BindingResult result, HttpServletRequest request, HttpServletResponse response,
        HttpSession session)throws Exception{

现在问题是在控制器UserDTO用户中,我将登录属性作为null但是根据布线我已经注入了它。请解释一下这个问题..

2 个答案:

答案 0 :(得分:0)

您最好在注释为@ModelAttribute的方法中创建UserDTO,而不是在Spring applicationContext.xml中指定它

@ModelAttribute("userDTO")
public UserDTO createModel() {
    UserDTO userDto = new UserDTO();
    userDto.setLogin(new LoginInfo());
    userDto.setContact(new ContactInformation());
    return userDto;
}

这将为每个请求创建并返回一个新的UserDTO对象 - Spring将表单数据绑定到。

答案 1 :(得分:0)

方法参数上的

@ModelAttribute表示应该从模型中检索参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。

因此,在您的情况下,由于UserDTO尚未在模型中,因此Spring创建了一个新对象'us​​erDTO',它显然具有null值的登录变量。这类似于UserDTO userDTO = new UserDTO(); userDTO.login在这种情况下为空。

Will Keeling的回答是正确的。当使用createdModel方法创建userDTO模型时(如他所提到的),Spring将执行数据绑定,并且将从具有匹配名称的所有请求参数填充用户对象字段。即如果您尝试使用URL /requestLogon.htm?login.username=ABC(假设您在LoginInfo中有用户名字段),则用户名将被正确绑定。