2017-02-13 15 views
1

две проблемы.Thymeleaf checkbox не прошедшая стоимость

  1. У меня есть классы пользователей и примечаний. У пользователя может быть много заметок. Как показать Thymeleaf каждый идентификатор заметок, принадлежащих пользователю? th: text = "$ {u.notes.id}" не работает
  2. У меня есть таблица (см. рисунок) с флажками для каждого пользователя с булевым isUserChecked значением, ниже кнопка для удаления зарегистрированного пользователя. Thymeleaf правильно показывает состояние 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> 

ОБНОВЛЕНИЕ 1

, как упоминалось @Metroids первую проблему можно устранить с помощью:

<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> 

мне нужно UserWrapper класс со свойством List<User> listOUsers. Но как это сделать? я создал что-то вроде этого:

@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 

UPDATE 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 большой, но мой список из userWrap не имеет значения, когда я называю POST метод в контроллере. Я пытался копировать

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

в POST метод, но там была ситуация: имена пользователей: Хорошо, проверили ?: не слушается щелчок мыши CheckBox (все значения являются ложными).

ответ

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>.
  • Вам нужен объект команды, который имеет список пользователей как свойство ... Я не думаю, что вы можете использовать Java-список в качестве объекта команды. Это нужно указать как th: объект в теге <form>.
  • HTML, для фактического флажком должен выглядеть примерно так:

HTML

<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> 

Контроллер

@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"; 
    } 
} 

Java

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

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

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

Спасибо. Работа первой части. О втором: я был добавлен до '

' tag '' и положить строку ' 'in'
'тег, и у меня есть:' org.springframework.expression.spel.SpelEvaluationException : EL1007E: свойство или поле 'listOfUsers' не могут быть найдены на null' также я добавляю тестовую строку '' и я не понимаю, почему тестовая строка работая вместо выше? – twistezo

+0

Хорошо, поэтому, если у вас есть 'th: object =" $ {user} "', тогда 'th: field =" * {listOfUsers [__ $ {i.index} __]. UserChecked} "' означает '$ {user .listOfUsers [0] .userChecked} '. Поскольку я предполагаю, что на самом деле у вас нет объекта с именем '$ {user}', здесь происходит ошибка. (Также обратите внимание, что я отредактировал мой ответ. Это должно быть 'th: field' вместо' th: value'.) Чтобы отправить форму, вам нужен новый объект в модели с именем $ {user}, который имеет Список listOfUsers как собственность. – Metroids

+0

Привет @Metroids я отредактировал мое сообщение (проверьте обновление 1). Можете ли вы помочь мне в этом? – twistezo