[SPRING] Spring MVC가 ArrayList를 컨트롤러로 전달
SPRINGSpring 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.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.미니언 덕분에 대답을 찾았습니다.
미니언 덕분에 대답을 찾았습니다.
싸개:
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.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.이는보기에서 리디렉션을 사용하고 있기 때문입니다. 플래시 속성 살펴보기 :
이는보기에서 리디렉션을 사용하고 있기 때문입니다. 플래시 속성 살펴보기 :
당신은 업데이트 된 목록을 얻을 수 있어야합니다 :)
from https://stackoverflow.com/questions/28609414/spring-mvc-passing-arraylist-back-to-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] SPRING MVC에서의 URL 패턴 제한 (0) | 2019.04.06 |
---|---|
[SPRING] Spring Security와의 CSRF 통합시 Session timeout으로 인해 Spring MVC에서 Access Denied가 발생합니다. (0) | 2019.04.06 |
[SPRING] spring-security-oauth2 2.0.7 새로 고침 토큰 UserDetailsService 구성 - UserDetailsService가 필요합니다. (0) | 2019.04.06 |
[SPRING] 스프링 빈을 JSF 변환기에 삽입하는 법 [duplicate] (0) | 2019.04.06 |
[SPRING] HSQLDB에서 스키마를 생성하는 시작 스크립트 (0) | 2019.04.06 |