在Spring中提交多个对象的动态表单?

时间:2014-12-20 18:48:20

标签: forms spring-mvc spring-form

我有一个对象CreateProjectFormModel如下(我使用的是Spring 4)。

public class CreateProjectFormModel {
    private Project project;
    private List<DUser> users;

    public CreateProjectFormModel() {
        this.project = new Project();
        this.users = new ArrayList<DUser>();
    }

    public Project getProject() {
        return project;
    }

    public void setProject(Project project) {
        this.project = project;
    }

    public List<DUser> getUsers() {
        return users;
    }

    public void setUsers(List<DUser> users) {
        this.users = users;
    }
}

我无法弄清楚如何创建Controller和相应的表单,以便可以一次提交多个DUser - 如果对象不包含集合,可以这样做吗?

阅读this,但我不知道如何提前将用户添加到项目中,因此无法修复用户数量。

我通读thymeleaf tutorial,但有兴趣知道是否可以不使用百里香。

感谢。

2 个答案:

答案 0 :(得分:1)

您在问题List<Foo> as form backing object using spring 3 mvc, correct syntax?中发布的链接应为您提供解决方案,评论中讨论的内容

  

我认为此解决方案需要具有固定数量的输入   字段,这是正确的吗?如果您有动态输入数,该怎么办?   字段?

不涉及用户数量,这不需要修复,而是涉及对象的属性不同的事实,我不相信你的情况。因此,如果您的 DUser 具有 userName 属性,例如您的项目有一个属性名称。您的控制器方法可以简单,

@RequestMapping(value = "/test", method=RequestMethod.POST)
public String processSubmit(CreateProjectFormModel createProjectFormModel) {
       ...
}

和你的表格

<form:form action="/form/test" method="post">
    <div class="single">
        <input type="text" name="project.name"/>
        <input type="text" name="users[0].userName"/>
        <a href="#" onclick="addNewUserInputSection();return false">add another user</a>
        <input type="submit" value="Save">
    </div>
</form:form>

你必须付出一些努力才能创建一个javascript函数 addNewUserInputSection ,它将为 users 属性添加一组新的输入字段,例如增加索引,例如

<form:form action="/form/test" method="post">
    <div class="single">
        <input type="text" name="project.name"/>
        <input type="text" name="users[0].userName"/>
        <input type="text" name="users[1].userName"/>
        <a href="#" onclick="addNewUserInputSection();return false">add another user</a>
        <input type="submit" value="Save">
    </div>
</form:form>

示例是基本的,但应该足以让您解决问题

答案 1 :(得分:0)

虽然上面的答案有效,但这里有一个替代方案,不需要你创建一个包装类/表单类。

模型和控制器

public class Foo {
    private String name;
    private List<Foo> fooList;
    public Foo() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String getFooList() {
        return fooList;
    }

    public void setFooList(String fooList) {
        this.fooList = fooList;
    }

}

@Controller("/")
public class FooController{

    //returns the ModelAttribute fooListWrapper with the view fooForm
    @RequestMapping(value = "/FOO", method = RequestMethod.GET)
    public String getFooForm(Model model) {
        List<Foo> fooList = service.getFooList();

        model.addAttribute("fooList", fooList);

        return "list_foo"; //name of the view
    }

    @RequestMapping(value = "/FOO", method = RequestMethod.POST)
    public String postFooList(@ModelAttribute("foo")Foo foo, Model model) {
        List<Foo> list = foo.getFooList(); // **This is your desired object. 
        //If you debug this code, you can easily find this is the list of  
        //all the foo objects that you wanted, provided you pass them properly. 
        //Check the jsp file to see one of the ways of passing such a list of objects**
        //Rest of the code
    }

}

JSP视图

<form:form id="form" action="<paste-target-url-here>" method="POST" modelAttribute="fooList">


    <c:forEach items="${fooList}" varStatus="i">
           <form:input path="fooList[${i.index}].name" type="text"/>
           <!-- Here you are setting the data in the appropriate index which will be caught in the controller -->
    </c:forEach>


    <button>submit</button>
</form:form>