복붙노트

[SPRING] Spring MVC가 ArrayList를 컨트롤러로 전달

SPRING

Spring MVC가 ArrayList를 컨트롤러로 전달

나는 봄에 새로운 사람이다. 사용자 목록을 표시합니다. 모든 행에는 사용자를 제거하기위한 확인란이 있습니다.

제어 장치:

@Controller
public class AdminController {

    @Autowired
    private UserDao userDao;

    @RequestMapping(value = "/admin", method = RequestMethod.GET)
    public ModelAndView adminPage() {
        ModelAndView model = new ModelAndView();
        model.addObject("users", userDao.findAll());
        model.setViewName("admin");
        return model;

    }

    @RequestMapping(value = "admin/remove", method = RequestMethod.POST)
    public ModelAndView removeUser(@ModelAttribute(value = "users") ArrayList<User> users) {
        ModelAndView model = new ModelAndView();
        //UPDATE USERS HERE 
        model.setViewName("redirect:/admin");
        return model;

    }

JSP :

<form:form action="/admin/remove" method="POST"  modelAttribute="users">
            <table class="table table-striped">
                <thead>
                    <tr>
                        <th>Firstname</th>
                        <th>Lastname</th>
                        <th>Email/login</th>
                        <th>Profession</th>
                        <th>Select<th>
                    </tr>
                </thead>
                <tbody>
                    <c:forEach var="user" items="${users}">
                        <tr>
                            <td>${user.firstName}</td>
                            <td>${user.lastName}</td>
                            <td>${user.login}</td>
                            <td>${user.profession}</td>
                            <td><input type="checkbox" value="${user.delete}"/></td>
                        </tr>
                    </c:forEach>
                </tbody>
            </table>            
            <input type="submit" value="Delete user(s)" class="btn-danger" />
            <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
            </form:form>

목록이 올바르게 렌더링됩니다. '사용자 삭제'버튼을 누르면 @modelAttribute 사용자는 비어 있습니다. 나는 또한 새로운 클래스에서 목록을 래핑하려고했지만 동일한 결과를 얻는다.

어떤 아이디어?

해결법

  1. ==============================

    1.jsp에서 모델 속성으로 양식 데이터 바인딩이 발생하지 않으므로 ModelAttribute는 비어 있습니다. Spring 샘플에서 바인딩 콜렉션에 대해 "http://developer.ucsd.edu/develop/user-interface/building-a-form/form-binding-with-collections.html"을 살펴 보자. 이것은 당신이 이해하는 데 도움이 될 것입니다.

    jsp에서 모델 속성으로 양식 데이터 바인딩이 발생하지 않으므로 ModelAttribute는 비어 있습니다. Spring 샘플에서 바인딩 콜렉션에 대해 "http://developer.ucsd.edu/develop/user-interface/building-a-form/form-binding-with-collections.html"을 살펴 보자. 이것은 당신이 이해하는 데 도움이 될 것입니다.

    대부분의 Spring 애플리케이션은 일반적으로 form : input을 "path"매개 변수와 함께 사용하여 데이터 바인딩을 수행합니다.

  2. ==============================

    2.미니언 덕분에 대답을 찾았습니다.

    미니언 덕분에 대답을 찾았습니다.

    싸개:

    public class UserListWrapper {
    
    private ArrayList<User> users;
    
    public ArrayList<User> getUsers() {
        return users;
    }
    
    public void setUsers(ArrayList<User> users) {
        this.users = users;
    }
    

    제어 장치:

    @Controller
    public class AdminController {
    
    @Autowired
    private UserDao userDao;
    
    @RequestMapping(value = "/admin", method = RequestMethod.GET)
    public ModelAndView adminPage() {
        ModelAndView model = new ModelAndView();
        UserListWrapper wrapper = new UserListWrapper();
        wrapper.setUsers(new ArrayList<User>(userDao.findAll()));
        model.addObject("userListWrapper",wrapper);
    
        model.setViewName("admin");
        return model;
    
    }
    
    @RequestMapping(value = "admin/remove", method = RequestMethod.POST)
    public ModelAndView removeUser(@ModelAttribute(value = "userListWrapper") UserListWrapper userListWrapper) {
        ModelAndView model = new ModelAndView();
        userDao.removeFlaggedUsers(userListWrapper.getUsers());
        model.setViewName("redirect:/admin");
        return model;
    
    }
    

    }

    전망:

    <form:form action="/admin/remove" method="POST"  modelAttribute="userListWrapper">
            <table class="table table-striped">
                <thead>
                    <tr>
                        <th>First name</th>
                        <th>Last name</th>
                        <th>Email/login</th>
                        <th>Profession</th>
                        <th>Select<th>
                    </tr>
                </thead>
                <tbody>
                    <c:forEach varStatus="us" var="user" items="${userListWrapper.users}" >
                        <tr>
                            <td><form:input type="hidden" path="users[${us.index}].firstName"/>${user.firstName}</td>
                            <td><form:input type="hidden" path="users[${us.index}].lastName"/> ${user.lastName}</td>
                            <td><form:input type="hidden" path="users[${us.index}].login"/>${user.login}</td>
                            <td><form:input type="hidden" path="users[${us.index}].profession"/>${user.profession}</td>
                            <td><form:checkbox path="users[${us.index}].delete" value="${user.delete}"/></td>
             <form:input type="hidden" path="users[${us.index}].id"/>
                        </tr>
                    </c:forEach>
                </tbody>
            </table>            
            <input type="submit" value="Delete user(s)" class="btn-danger" />
            <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
            </form:form>
    

    고맙습니다!

    편집 : 당신이 표시되지 않은 필드를 추가하는 것을 잊지 마라.

    예 :

    ID를 추가하지 않으면 리턴 된 User 오브젝트의 ID가 NULL이 G로 h 제되지 않습니다.

  3. ==============================

    3.spring-mvc select 태그 주위에 기능을 빌드해야합니다. 약간의 변경이 순서대로 이루어지며 목록을 POJO 클래스로 푸시합니다.

    spring-mvc select 태그 주위에 기능을 빌드해야합니다. 약간의 변경이 순서대로 이루어지며 목록을 POJO 클래스로 푸시합니다.

    public class FormBean {
    
        private List<String> users;
    
        public FormBean() {
    
        }
    
        public List<String> getUsers() {
            return users;
        }
    
        public void setUsers(List<String> users) {
            this.users = users;
        }
    }
    

    다음으로 매핑 변경 :

    @RequestMapping(value = "admin/remove", method = RequestMethod.POST)
        public ModelAndView removeUser(@ModelAttribute(value = "formBean") FormBean formBean) {
    

    마지막으로 c : forEach를 spring select 태그로 바꾸십시오.

    <form:form action="/admin/remove" method="POST"  modelAttribute="formBean">
      ...
     <form:select path="users" items="${users}" multiple="true" />
      ...
    </form>
    
  4. ==============================

    4.이는보기에서 리디렉션을 사용하고 있기 때문입니다. 플래시 속성 살펴보기 :

    이는보기에서 리디렉션을 사용하고 있기 때문입니다. 플래시 속성 살펴보기 :

    당신은 업데이트 된 목록을 얻을 수 있어야합니다 :)

  5. from https://stackoverflow.com/questions/28609414/spring-mvc-passing-arraylist-back-to-controller by cc-by-sa and MIT license