Submit a List from a form generated with Javascrip

2019-08-07 05:45发布

问题:

This question already has an answer here:

  • Passing a list generated with Javascript to a Spring controller 3 answers

I'm building an app with Spring Boot, the MVC pattern, and Thymeleaf as template engine. I have a form that generates a list with Javascript, and a controller with a @ModelAttribute expecting a list, to be saved into the database.

At the Javascript side I collect the items with this array:

groupList = [];
groupList.push(inputValue);

function getGroupList(){
return groupList;
}

In the html I'm trying to assign the array value to a hidden input field:

<input type="hidden" class="invisible" id="groupList" th:field="*{groupList}"/>

With this inline function:

<script th:inline="javascript" type="text/javascript">
      $(function() {
            var groupListCollected = getGroupList();
            $("#groupList").val(groupListCollected);
       });
</script>

My problem at this point, is that I don't find the way to collect the array, and pass it to the Controller as a list.

This is the value that the console shows, for the input field:

<input type="hidden" class="invisible" id="groupList" name="groupList"
       value="[object HTMLInputElement]">

Any advice to face this issue, would be much appreciated. Thanks in advance.

回答1:

You can proceed like this : Create a Model, for exemple:

public class User {
    private String username;
    public User() {
    }
    public User(String username) {
        this.username = username;
    } 
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }   
}

Create a FormModel:

public class FormUsers {

        private List<User> listUsers;

        public FormUsers(List<User> listUsers) {
            this.listUsers = listUsers;
        }

        public FormUsers() {
        }

        public List<User> getListUsers() {
            return listUsers;
        }

        public void setListUsers(List<User> listUsers) {
            this.listUsers = listUsers;
        }

        @Override
        public String toString() {
            return "FormUsers{" + "listUsers=" + listUsers + '}';
        }   
    }

in your controller (Get and Post) :

@RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello(ModelMap model) {
        FormUsers formUsers = new FormUsers();
        List<User> list = new ArrayList<>();
        list.add(new User("Wassim"));
        formUsers.setListUsers(list);
        logger.debug("--> " + formUsers.toString());
        model.addAttribute("formUsers", formUsers);
        return "hello";
    }

   @RequestMapping(value = "/hello", method = RequestMethod.POST)
    public String helloPost(@ModelAttribute FormUsers formUsers, ModelMap model) {
        logger.debug("Get List of new users -->  " + formUsers.toString());
        return "hello";
    }

In my view (hello.html) : for listing all users :

  <button id="addAction">ADD</button>
            <form action="#" th:action="@{/hello}" th:object="${formUsers}" method="post">
                <ul id="myUl">
                    <input type="text" th:field="*{listUsers[0].username}" />
                </ul>
                <input type="submit" value="Submit" />
            </form>

Now if I want to add another user with javascript when I clic in the button 'ADD, I will append() a new 'li' element containing the new user :

<script type="text/javascript">
                $(document).ready(function () {
                    console.log("ready!");
                    $("#addAction").click(function () {
                        console.log("FUNCTION");
                        $("#myUl").append('<li><input id="listUsers1.username" name="listUsers[1].username" value="Rafik" type="text"/></li>');
                    });
                });
            </script>

When I Submit, I will get a list with 2 User : 'Wassim' & 'Rafik'. You can manage this exemple (also the index of the list must managed properly) to append your list with the needed DATA.