Динамическая форма с отправкой нескольких объектов в Spring?

У меня есть объект 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 - можно ли это сделать, если объект не состоит из коллекции?

Прочтите это, но я не не знаю, как пользователи будут добавлены в проект заранее, поэтому не могу исправить размер пользователей.

Я прочитал руководство по тимелеафу, но мне было бы интересно узнать, можно ли обойтись без использования лист тимьяна.

Спасибо.


person ykesh    schedule 20.12.2014    source источник


Ответы (2)


Ссылка, которую вы разместили в вопросе List‹Foo › в качестве объекта поддержки формы с использованием spring 3 mvc, правильный синтаксис? должен предоставить вам решение, что обсуждается в комментариях

Я предполагаю, что это решение требует наличия фиксированного количества полей ввода, это правильно? Что делать, если у вас есть динамическое количество полей ввода?

не касается количества пользователей, которое не нужно исправлять, а касается того факта, что свойства объекта различаются, что, я думаю, не в вашем случае. Итак, если ваш 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>

примеры являются базовыми, но их должно быть достаточно, чтобы решить вашу проблему

person Master Slave    schedule 21.12.2014

Хотя приведенный выше ответ работает, вот альтернатива, которая не требует создания класса-оболочки/класса формы.

Модель и контроллер

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>
person sbsatter    schedule 27.02.2017