2012-03-08 11 views
19

chcę zrobić coś takiego, gdzie foo jest klasa z jednym String nazwa pola i getter/setter:Lista <Foo> jako obiekt do tworzenia formularzy przy użyciu sprężyny 3 mvc, poprawna składnia?

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

a następnie przesłać pełną listę Foo zaktualizowane nazwy? Mój kontroler porządek wygląda następująco:

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

pokrewne? http://stackoverflow.com/questions/8791181/series-of-repeated-forms-in-spring-portlet-mvc – adarshr

+1

Jakie jest twoje pytanie? –

Odpowiedz

31

Może to answersyour pytanie:

Kontroler:

@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 LISTA 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 KLASA:

public class Foo { 
    private String name; 

    public Foo() { 
    } 

    public String getName() { 
     return name; 
    } 

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

WIDOK JSP (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> 
+8

Zakładam, że to rozwiązanie wymaga stałej ilości pól wejściowych, czy to prawda? Co jeśli masz dynamiczną liczbę pól wejściowych? Na przykład mam wymóg, aby moi użytkownicy dynamicznie generowali nowe pola wejściowe. Czy wiesz, jak sobie z tym poradzić? – littleK

+0

Faton, jesteś ratownikiem. Wielkie dzięki. – w3bshark

+0

Faton, czy możesz nieco wyjaśnić, dlaczego musisz napisać klasę otoki? – newbie

0

Mimo powyższych robót odpowiedź, oto alternatywny, który nie wymaga, aby utworzyć klasy otoki/formularz klasa.

modelu i kontrolera

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 Zobacz

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

Hej. Co to jest '' wygląda jak renderowany? Muszę ponownie utworzyć go za pomocą javascript :) – Nenotlep

+0

Aha, a przy okazji, zobacz 'public String getFooList() {' i 'public void setFooList (String fooList) {' typy danych, wyglądają bardzo źle, prawda? – Nenotlep

+0

@Nenotlep, nie rozumiem, co miałeś na myśli przy pierwszym komentarzu. Czy możesz być bardziej jasny? I dziękuję za wskazanie, że odpowiedź została zmieniona. Btw. jeśli pytasz, jak to wygląda podczas przeglądania w przeglądarce, jest to po prostu java (popraw mnie, jeśli się mylę): . – sbs

Powiązane problemy