0

你好 可能这是一个愚蠢的问题,但我是 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>

应用程序上下文.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,但根据接线,我已经注入了它。请解释问题..

4

2 回答 2

0

您可能会更好地在带注释的方法中创建 UserDTO,@ModelAttribute而不是在 Spring applicationContext.xml 中指定它

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

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

于 2013-05-22T10:16:49.850 回答
0

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

因此,在您的情况下,由于 UserDTO 尚未在模型中,因此 Spring 创建了一个新对象“userDTO”,该对象显然具有带有空值的登录变量。UserDTO userDTO = new UserDTO();这与本例中的userDTO.loginis null类似。

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

于 2013-05-22T11:18:28.127 回答