Search code examples
springjspspring-mvcjstl

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


I want to do something like this, where Foo is a class with one String field name, and getter/setter:

<form:form id="frmFoo" modelAttribute="foos">
   <c:forEach items="${foos}" var="foo">
     <form:input path="${foo.name}" type="text"/>

And then submit the complete list of Foos with updated names?

My controller looks like this:

@RequestMapping(value = "/FOO", method = RequestMethod.POST)
public String getSendEmail(List<Foo> foos, Model model) {
    // ...
}

Solution

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