我有一个对象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,但有兴趣知道是否可以不使用百里香。
感谢。
答案 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>