List<Foo> as form backing object using Spring 3 MVC, correct syntax? List<Foo> as form backing object using Spring 3 MVC, correct syntax? spring spring

List<Foo> as form backing object using Spring 3 MVC, correct syntax?


Maybe this answersyour question:

CONTROLLER :

@Controller("/")public class FooController{    //returns the ModelAttribute fooListWrapper with the view fooForm    @RequestMapping(value = "/FOO", method = RequestMethod.GET)    public String getFooForm(Model model) {        FooListWrapper fooListWrapper = new FooListWrapper();        fooListWrapper.add(new Foo());        fooListWrapper.add(new Foo());        //add as many FOO you need        model.addAttribute("fooListWrapper", fooListWrapper);        return "fooForm";    }    @RequestMapping(value = "/FOO", method = RequestMethod.POST)    public String postFooList(@ModelAttribute("fooListWrapper")FooListWrapper fooListWrapper, Model model) {        //...........    }}

FOO LIST WRAPPER :

public class FooListWrapper {    private List<Foo> fooList;    public FooListWrapper() {         this.fooList = new ArrayList<Foo>();    }    public List<Foo> getFooList() {        return fooList;    }    public void setFooList(List<Foo> fooList) {        this.fooList = fooList;    }    public void add(Foo foo) {        this.fooList.add(foo);    }}

FOO CLASS :

public class Foo {    private String name;    public Foo() {    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

JSP VIEW (name = fooForm):

<c:url var="fooUrl" value="/FOO"/><form:form id="frmFoo" action="${fooUrl}" method="POST" modelAttribute="fooListWrapper">    <c:forEach items="${fooListWrapper.fooList}" varStatus="i">           <form:input path="fooList[${i.index}].name" type="text"/>    </c:forEach>    <button>submit</button></form:form>


Although the above answer works, here's an alternate that does not require you to create a wrapper class/ form class.

Model And Controller

public class Foo {    private String name;    private List<Foo> fooList; //**must create this list, also getter and setter**    public Foo() {    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public List 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 getFooList(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 View

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