Статьи

Spring MVC и Thymeleaf: как получить доступ к данным из шаблонов

В типичном приложении 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