Получить данные из метода ModelAttribute в представлении

В моем текущем весеннем проекте у меня есть такой общий контроллер:

public class basicController<E> {
  @Autowired
  private basicService<E> serv;

  protected Class<?> clazz;

  public basicController(Class<?> clazz) {
    this.clazz = clazz;
  }

  ...

}

с помощью метода, подобного этому:

  @ModelAttribute("lista")
  public List<E> populateList() {
    return serv.lista();
  }

Интересно, возможно ли использовать значение для lista в такой структуре (на странице html):

<select class="form-control" th:name="...">
    <option th:each="opt : ${lista}" th:value="${opt.getId()}"><span th:text="${opt}"/>
    </option>
</select>

эта страница отображается в контроллерах такими методами:

универсальный контроллер

  @RequestMapping(value = "cadastra")
  @PreAuthorize("hasPermission(#user, 'cadastra_'+#this.this.name)")
  @Menu(label = "cadastra")
  public String cadastra(Model model) throws Exception {
    model.addAttribute("command", serv.newObject());
    return "private/cadastra";
  }

домашний контроллер (среди прочего, содержит сопоставления для публичных просмотров)

  @RequestMapping(value = "/settings")
  public String settings(Model model) throws Exception {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    model.addAttribute("usuario", auth.getName());
    model.addAttribute("menu", MenuList.index());
    model.addAttribute("settings", MenuList.settings());
    return "private/settings";
  }

  @RequestMapping(value = "/profile")
  public String profile(Model model) throws Exception {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    model.addAttribute("usuario", auth.getName());
    model.addAttribute("menu", MenuList.index());
    model.addAttribute("command", usuario(auth.getName()));
    return "private/profile";
  }

У кого-нибудь есть идеи по этому поводу?

2 ответа

Решение

Хорошо, я просто тестирую и проверяю, что для использования значения из метода ModelAttribute не требуется дополнительная настройка. Итак, я просто добавляю такие методы в мой контроллер:

  @ModelAttribute("lista")
  public List<E> populateListPagina() {
    return serv.lista();
  }

  @ModelAttribute("classe")
  public String getName() {
    return clazz.getSimpleName();
  }

и когда я получаю доступ к любому отображенному представлению, я могу использовать значение, возвращаемое этим методом, так, как мне нравится:

  <tbody class="content">
    <tr th:each="item : ${lista}">
      <th></th>
      <th th:each="coluna : ${campos}" th:text="${item[coluna]}"></th>
      <th>
        <div class="btn-group" role="group" aria-label="menu_item">
          <button th:each="btn : ${menu_item}" type="button" class="btn btn-default link" th:attr="data-href=@{/__${classe}__/__${btn}__/__${item.getId()}__}" th:text="${btn}"></button>
        </div>
      </th>
    </tr>
  </tbody>

@ModelAttribute запускается раньше, чем ваши методы контроллера, и исчезает, когда ваш метод запускается, я полагаю. Таким образом, у вас больше не будет объекта в представлении, он действует больше как @RequestParam.

Однако вы можете попробовать добавить @SessionAttributes("lista"), если вы используете более новую версию Spring (я считаю, 4+). Вы должны быть осторожны, чтобы убедиться, что вы закрываете атрибуты сеанса. Чтобы закрыть, сделай то, что сделал этот парень - ссылка.

Другие вопросы по тегам