В типичном приложении Spring MVC классы @Controller отвечают за подготовку карты модели с данными и выбор вида для отображения. Эта model map обеспечивает полную абстракцию технологии представления и, в случае Thymeleaf, она преобразуется в объект Thymeleaf VariablesMap который делает все определенные переменные доступными для выражений, выполняемых в шаблонах.
Весенние модельные атрибуты
Spring MVC вызывает фрагменты данных, к которым можно получить доступ во время выполнения model attributes . Эквивалентным термином в языке Thymeleaf являются context variables . Существует несколько способов добавления атрибутов модели в представление в Spring MVC. Ниже вы найдете несколько распространенных случаев: Добавить атрибут в Model с помощью метода `addAttribute`:
|
1
2
3
4
5
|
@RequestMapping(value = "message", method = RequestMethod.GET)public String messages(Model model) { model.addAttribute("messages", messageRepository.findAll()); return "message/list"; } |
Вернуть `ModelAndView` с включенными атрибутами модели:
|
1
2
3
4
5
6
|
@RequestMapping(value = "message", method = RequestMethod.GET)public ModelAndView messages() { ModelAndView mav = new ModelAndView("message/list"); mav.addObject("messages", messageRepository.findAll()); return mav; } |
Предоставьте общие атрибуты с помощью методов, аннотированных с помощью `@ ModelAttribute`:
|
1
2
3
4
|
@ModelAttribute("messages")public List<Message> messages() { return messageRepository.findAll(); } |
Как вы, возможно, заметили, во всех вышеупомянутых случаях атрибут `messages` добавляется в модель и будет доступен в представлениях Thymeleaf.
В Thymeleaf к этим атрибутам модели можно получить доступ со следующим синтаксисом: `$ {attributeName}`, который является выражением Spring EL.
Вы можете получить доступ к атрибутам модели в представлениях с помощью Thymeleaf следующим образом:
|
1
2
3
4
5
|
<tr th:each="message : ${messages}"> <td th:text="${message.id}">1</td> <td><a href="#" th:text="${message.title}">Title ...</a></td> <td th:text="${message.text}">Text ...</td> </tr> |
Параметры запроса
Параметры запроса могут быть легко доступны в представлениях Thymeleaf. Параметры запроса передаются от клиента к серверу, например:
|
1
|
https://example.com/query?q=Thymeleaf+Is+Great! |
Предположим, у нас есть `@ Controller`, который отправляет перенаправление с параметром запроса:
|
1
2
3
4
5
6
7
|
@Controller public class SomeController { @RequestMapping("/") public String redirect() { return "redirect:/query?q=Thymeleaf Is Great!"; } } |
Для доступа к параметру `q` вы можете использовать префикс` param.`:
|
1
|
<p th:text="${param.q[0]}" th:unless="${param.q == null}">Test</p> |
В вышеприведенном примере важно отметить две вещи:
- `$ {param.q! = null}` проверяет, установлен ли параметр `q`
- Параметры всегда являются строковыми массивами, так как они могут быть многозначными (например, `https://example.com/query?q=Thymeleaf%20Is%20Great!&q=Really%3F)
Другой способ получить доступ к параметрам запроса — использовать специальный объект `# httpServletRequest`, который дает вам прямой доступ к объекту` javax.servlet.http.HttpServletRequest`:
|
1
|
<p th:text="${#httpServletRequest.getParameter('q')}" th:unless="${#httpServletRequest.getParameter('q') == null}">Test</p> |
Атрибуты сеанса
В приведенном ниже примере мы добавляем mySessionAttribute к сессии:
|
1
2
3
4
5
|
@RequestMapping({"/"})String index(HttpSession session) { session.setAttribute("mySessionAttribute", "someValue"); return "index"; } |
Подобно параметрам запроса, к атрибутам сеанса можно получить доступ с помощью префикса `session.`:
|
1
|
<div th:text="${session.mySessionAttribute}">[...]</div> |
Или используя `# httpSession`, это дает вам прямой доступ к объекту` javax.servlet.http.HttpSession`.
Атрибуты ServletContext, Spring bean
Полная версия этой статьи, которую я написал для thymeleaf.org , с большой помощью Даниэля Фернандеса, может быть найдена здесь: http://www.thymeleaf.org/springmvcaccessdata.html
| Ссылка: | Spring MVC и Thymeleaf: как получить доступ к данным из шаблонов от нашего партнера по JCG Рафаля Боровца в блоге Codeleak.pl . |