2017-02-13 1 views
1

두 가지 문제가 있습니다.Thymeleaf 확인란이 값을 전달하지 않음

  1. 사용자 및 메모 클래스가 있습니다. 사용자는 많은 메모를 가질 수 있습니다. Thymeleaf가 사용자에게 속한 모든 이드의 이드를 표시하는 방법은 무엇입니까? th : ​​text = "$ {u.notes.id}"가 작동하지 않습니다.
  2. 부울 isUserChecked 값을 가진 모든 사용자에 대해 확인란이있는 테이블 (그림 참조)이 있습니다. 아래에 체크 된 사용자를 삭제하는 버튼이 있습니다. Thymeleaf correct는 isUserChecked 값의 상태를 표시합니다. 확인란을 선택하면 삭제 버튼이 작동하지 않지만 코드에서 isUserChecked 값을 설정하면 작동합니다. 문제는이 확인란의 Thymeleaf 구문에 있습니다.

스크린 :

enter image description here

HTML

<div class="container"> 
<div class="row"> 
     <div class="col-sm-6"> 
       <table class="table table-hover"> 
       <thead> 
        <tr> 
        <th>Id</th> 
        <th>Username</th> 
        <th>First name</th> 
        <th>Last name</th> 
        <th>Password (Hash)</th> 
        <th>Role</th> 
        <th>Notes</th> 
        <th>Select</th> 
        </tr> 
       </thead> 
       <tbody> 
        <tr th:each="u : ${listOfUsers}"> 
        <td th:text="${u.id}"></td> 
        <td th:text="${u.username}"></td> 
        <td th:text="${u.firstName}"></td> 
        <td th:text="${u.lastName}"></td> 
        <td th:text="${#strings.substring(u.password,0,5) +'...'}"></td> 
        <td th:text="${u.role}"></td> 
        <td th:text="${u.notes}"></td>  
        <td><input type="checkbox" name="mycheckbox" 
        th:value="*{u.isUserChecked()}" th:checked="${u.isUserChecked()}" /></td> 
        </tr> 
       </tbody> 
       </table> 

      <form th:action="@{/users}" method="post"> 
       <button class="buttonLogin" type="submit">Submit</button> 
      </form> 
     </div> 
    </div> 

@Metroids 의해 해결할 수있는 제 문제 바와 같이 UPDATE 1

:

,

<td><span th:each="note, i: ${u.notes}" th:text="${(i.index > 0 ? ', ' : '') + note.id}" /></td>

두 번째 문제. 내 HTML이를 사용하는 경우 :

<tr th:each="u, i : ${userWrapper}"> 
<!-- other rows removed for readability --> 
<td><input type="checkbox" th:field="*{listOfUsers[__${i.index}__].userChecked}" /></td> 

내가 재산 List<User> listOUsers와 UserWrapper 클래스가 필요합니다. 그러나 이것을하는 방법? 여기

@Component 
public class UserWrapper { 

@Autowired 
UserService userService; 

List<User> listOfUsers = userService.findAll(); 

public List<User> getListOfUsers() { 
    return listOfUsers; 
} 

public void setListOfUsers(List<User> listOfUsers) { 
    this.listOfUsers = listOfUsers; 
} 
} 

이 페이지에 대한 내 컨트롤러 : 나는 이런 식으로 뭔가 만들어 내가 가진이 후

@Controller 
public class UserController { 

@Autowired 
UserService userService; 

@Autowired 
UserWrapper userWrapper; 

@RequestMapping("/users") 
public String home(Model model){ 
    List<User> listOfUsers = userService.findAll(); 
    model.addAttribute("listOfUsers", listOfUsers); 
    return "users"; 
} 

@RequestMapping(value = "users", method = RequestMethod.POST) 
public String deleteUser(User user, Model model){ 
    userService.deleteCheckedUser(user); 

    return "redirect:/users"; 
} 
} 

을 오류 :

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userWrapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userWrapper' defined in file [C:\Users\luk89\Desktop\Java\STS Projects\StickyNotes\target\classes\com\twistezo\models\UserWrapper.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.twistezo.models.UserWrapper]: Constructor threw exception; nested exception is java.lang.NullPointerException 

업데이트 2

사용자 컨트롤러 :

@Controller 
public class UserController { 

@Autowired 
UserService userService; 

@Autowired 
UserWrapper userWrapper; 

@RequestMapping("/users") 
public String home(Model model){ 
    List<User> listOfUsers = userService.findAll(); 
    userWrapper.setListOfUsers(listOfUsers); 

    for(User u : userWrapper.getListOfUsers()){ 
     System.out.println("username: " +u.getUsername()+ ", checked?: " +u.isUserChecked()); 
    } 

    model.addAttribute("listOfUsers", listOfUsers); 
    model.addAttribute("userWrapper", userWrapper); 

    return "users"; 
} 

@RequestMapping(value = "/users", method = RequestMethod.POST) 
public String deleteUser(@ModelAttribute UserWrapper userWrapper, Model model){ 

    for(User u : userWrapper.getListOfUsers()){ 
     System.out.println("username: " +u.getUsername()+ ", checked?: " +u.isUserChecked()); 
    } 

    userService.deleteCheckedUser(userWrapper); 

    return "redirect:/users"; 
    } 
} 
내 서비스 클래스에서

삭제 방법 :

@Override 
public void deleteCheckedUser(UserWrapper userWrapper) { 

    for(User u : userWrapper.getListOfUsers()){ 
     if(u.isUserChecked() == true){ 
      this.userDAO.delete(u.getId()); 
     } 
    } 
} 

결과 :

username: user1, checked?: false 
username: user2, checked?: false 
username: user3, checked?: false 
username: user4, checked?: false 
username: user5, checked?: false 
username: asd, checked?: false 
username: qwe, checked?: false 
username: xcv, checked?: false 
username: ghj, checked?: false 
username: dfh, checked?: false 
username: n, checked?: false 
username: ed, checked?: false 

username: null, checked?: true 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: false 
username: null, checked?: true 

Thymeleaf 부분은 지금 큰 wokrs,하지만 난 POST를 호출 할 때 userWrap에서 내 목록은 값이없는 방법. 나는 방법을 게시하려면

List<User> listOfUsers = userService.findAll(); userWrapper.setListOfUsers(listOfUsers);

사본

을 시도하고 있지만 상황이였습니다 : 사용자 이름 : OK, (모든 값이 거짓)? 마우스 클릭이 체크 박스에 수신하지 않습니다 확인.

답변

1

목록에는 다른 메모를 추가 할 때 필요한 모든 메모가 있습니다.예를 들어, 대신

<td th:text="${u.notes}"></td> 

다음과 같은 것이 필요합니다. 체크 박스를 들어

-

<td><span th:each="note, i: ${u.notes}" th:text="${(i.index > 0 ? ', ' : '') + note.id}" /></td> 

. 변경해야 할 사항이 많습니다.

  • 모든 체크 박스는 <form></form> 태그 내에 있어야합니다.
  • 사용자 목록이있는 명령 개체가 속성으로 필요합니다 ... 자바 개체 목록을 명령 개체로 사용할 수 있다고 생각하지 않습니다. 이를 <form> 태그의 th : 객체로 지정해야합니다.

HTML

@Controller 
public class UserController { 

    @Autowired UserService userService; 

    @RequestMapping("/users") 
    public String home(Model model){ 
     List<User> listOfUsers = userService.findAll(); 
     UserWrapper userWrapper = new UserWrapper(); 
     userWrapper.setListOfUsers(listOfUsers); 
     model.addAttribute("listOfUsers", listOfUsers); 
     model.addAttribute("userWrapper", userWrapper); 
     return "users"; 
    } 

    @RequestMapping(value = "users", method = RequestMethod.POST) 
    public String deleteUser(@ModelAttribute UserWrapper userWrapper, Model model){ 
     userService.deleteCheckedUser(userWrapper.getListOfUsers()); 
     return "redirect:/users"; 
    } 
} 

자바

public class UserWrapper { 
    List<User> listOfUsers = new ArrayList<>(); 

    public List<User> getListOfUsers() { 
     return listOfUsers; 
    } 

    public void setListOfUsers(List<User> listOfUsers) { 
     this.listOfUsers = listOfUsers; 
    } 
} 
+0

감사합니다

<form th:action="@{/users}" th:object="${userWrapper}" method="post"> <!-- other html removed for readability --> <tr th:each="u, i : ${listOfUsers}"> <!-- other rows removed for readability --> <td><input type="checkbox" th:field="*{users[__${i.index}__].userChecked}" /></td> </tr> </form> 

컨트롤러 : 실제 체크 박스

  • HTML은 다음과 같이 될 것이다. 첫 번째 작업. 두 번째에 대해서 : 나는''태그''앞에 추가되었고''태그가 있는데, 다음과 같은 것들이 있습니다 :'org.springframework.expression.spel.SpelEvaluationException : EL1007E : 테스트 라인''을 추가하고 왜 테스트 라인을 쓰는지 이해가되지 않는다. 위 대신에 일하는거야? – twistezo

    +0

    괜찮 았기 때문에'th : object = "$ {user}"'가 있으면'th : field = "* {listOfUsers [__ $ {i.index} __]. userChecked}"'$ {user} . listOfUsers [0] .userChecked}'. 내가'$ {user} '라는 객체를 가지고 있지 않다는 것을 추측하고 있기 때문에 오류가 발생한 곳입니다. (또한, 나는 내 대답을 편집했음을 알아 차림에'th : value' 대신'th : field' 여야합니다.) 양식을 제출하려면 $ {user}라는 모델에 새 Object가 필요합니다. 속성으로 listOfUsers를 나열하십시오. – Metroids

    +0

    안녕하세요 @ Metroids 나는 내 게시물을 편집했습니다 (업데이트 1 확인). 이 물건으로 나를 도울 수 있니? – twistezo

    관련 문제
    태그 안에 "/>