Spring,modelmap,从jsp获取属性

时间:2012-05-26 22:26:34

标签: spring spring-mvc

我使用spring框架和其他一些框架(我是初学者)开发了一个MVC应用程序。我有一个控制器来管理jsp处理,例如当我想将新人添加到我的'人员列表'时,我调用实例化一个人对象,然后将其传递给与add方法对应的jsp视图。我通过这样的方法做到这一点:

@RequestMapping(value = "/persons/add", method = RequestMethod.GET)
public String getAdd(Model model) {
    logger.debug("Received request to show add page");

    // Create new UserDomain and add to model
    // This is the formBackingOBject
    model.addAttribute("personAttribute", new UserDomain());

    // This will resolve to /WEB-INF/jsp/addpage.jsp
    return "addpage-tiles";
}

我的问题是,现在,我想传递给模型添加两个不同的对象,例如,我想传递'new UserDomain()'以及另一个来自我数据库中其他表的对象,例如'new UserSecurity()'。 我想我应该使用'modelMap'而不是'model.addAttribute ...',但我不能这样做,所以如果有人可以帮助我。 我通过以下代码从jsp获取我的模型:

<form:form modelAttribute="personAttribute" method="POST" action="${saveUrl}">
<table>
    <tr>
        <td><form:label path="firstName">First Name:</form:label></td>
        <td><form:input path="firstName"/></td>
    </tr>
    <tr>
        <td><form:label path="lastName">Last Name</form:label></td>
        <td><form:input path="lastName"/></td>
    </tr>   
     <tr>
        <td><form:label path="userName">User name</form:label></td>
        <td><form:input path="userName"/></td>
    </tr>   
    <tr>
        <td><form:label path="email">E-mail</form:label></td>
        <td><form:input path="email"/></td>
    </tr>           
</table>
<input type="submit" value="Save" />

非常感谢你帮助我。

2 个答案:

答案 0 :(得分:3)

简单地将多个对象传递给视图不是问题 - 只需多次使用model.addAttribute,然后就可以访问这两个对象。

但是,如果要在<form:form>中编辑多个模型,则需要创建一个包含两个对象的类:

public class UserDomainSecurity {

    private UserDomain userDomain;
    private UserSecurity userSecurity;

    // getters and setters for both

}

然后将此实例传递给视图:

 model.addAttribute("userDomainSecurity", new UserDomainSecurity());

并以以下形式使用:

<form:form commandName="userDomainSecurity" method="POST" action="${saveUrl}">
...
  <form:input path="userDomain.firstName"/>
  ....
  <form:input path="userSecurity.someSecurityProperty"/>

有时候必须创建所有这些额外的类,这有点烦人,但它有点合乎逻辑。包装类在表单中创建了一些名称空间,从而分离了您要编辑的各个对象。

答案 1 :(得分:0)

我想补充一点,因为它确实是我几分钟前遇到的问题。

在这种情况下,我假设您UserSecurityUserDomain彼此相对。

假设你有,

public class UserDomain {

     public UserSecurity userSecurity
     public String firstName;
     public String lastName;

     // getters and setters...
}

你的UserSecurity类似于

public class UserSecurity {

     public String someSecurityProperty;

     // getters and setters...
}

由于可以公开访问userSecurity属性,因此您可以执行您在Controller中所做的操作,

@RequestMapping(value = "/persons/add", method = RequestMethod.GET)
public String getAdd(Model model) {
logger.debug("Received request to show add page");

// Create new UserDomain and add to model
// This is the formBackingOBject
model.addAttribute("userDomainSecurity", new UserDomain());

// This will resolve to /WEB-INF/jsp/addpage.jsp
return "addpage-tiles";
}

然后只需在你的addpage.jsp中访问它,就好像它是一个像下面的对象属性

<form:form commandName="userDomainSecurity" method="POST" action="${saveUrl}">
...
<form:input path="firstName />
<form:input path="lastname />
  ....
  <form:input path="userSecurity.someSecurityProperty"/>

正如您所注意到的,我通过UserDomain类中声明的属性访问someSecurityProperty。