2

我有一个对象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;
    }
}

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

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

我通读了thymeleaf 教程,但很想知道是否可以不使用 thymeleaf。

谢谢。

4

2 回答 2

2

您在问题List<Foo> 中发布的链接作为表单支持对象使用 spring 3 mvc,语法正确吗?应该为您提供解决方案,评论中讨论了什么

我假设这个解决方案需要有固定数量的输入字段,对吗?如果您有动态数量的输入字段怎么办?

不关心用户的数量,这不必固定,而是关心对象的属性不同的事实,我不认为这是你的情况。所以,如果你的DUser有一个属性userName,例如你的Project有一个属性name。您的控制器方法可能只是,

@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>

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

于 2014-12-21T08:28:25.607 回答
1

尽管上面的答案有效,但这是一个不需要您创建包装类/表单类的替代方法。

模型和控制器

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>
于 2017-02-27T05:28:07.280 回答