2014-12-20 3 views
1

다음과 같이 객체 CreateProjectFormModel이 있습니다 (스프링 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 tutorial을 통해 읽었지만 thymeleaf를 사용하지 않고 할 수 있는지 알고 싶습니다.

감사합니다.

답변

1

의견

나는이 솔루션은 입력 필드의 고정 량이 필요하다는 생각에서 논의 당신이 당신을 위해 솔루션을 제공한다 질문 List<Foo> as form backing object using spring 3 mvc, correct syntax?에 게시 된 링크는, 맞입니까? 동적 입력 숫자가 필드 인 경우 어떻게해야합니까?

은 수정하지 않아도되는 개체의 수와 관련이 없으며 개체의 속성이 다르다는 점에 유의해야합니다. 귀하의 생각은 다릅니다. 따라서 DUser의 속성이 이고 사용자 이름이 인 경우. 프로젝트의 속성은 입니다. 귀하의 컨트롤러 방법은 단순히 당신이 어떤 노력을 제공해야합니다

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

이 자바 스크립트 함수를 제공하기위한 입력 필드의 새로운 세트를 추가합니다 addNewUserInputSection를 만드는 것입니다

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

예는 기본이지만, 위의 대답은 여기에 작동하는 래퍼 클래스/폼 클래스를 생성 할 필요가 없습니다 대체 비록 당신이 당신의 문제를

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>