«1. Обзор
В этом руководстве мы собираемся показать, как получить доступ к объектам Spring MVC в представлениях Thymeleaf, которые содержат код JavaScript. В наших примерах мы будем использовать Spring Boot и механизм шаблонов Thymeleaf, но эта идея работает и для других механизмов шаблонов.
Мы собираемся описать два случая: когда код JavaScript встроен или встроен в веб-страницу, сгенерированную движком, и когда он является внешним по отношению к странице — например, в отдельном файле JavaScript.
2. Настройка
Предположим, мы уже настроили веб-приложение Spring Boot, использующее механизм шаблонов Thymeleaf. В противном случае эти руководства могут оказаться полезными для начала:
-
Начальная загрузка простого приложения — о том, как создать приложение Spring Boot с нуля Spring MVC + Thymeleaf 3.0: новые функции — о том, как использовать синтаксис Thymeleaf ~~ ~ Кроме того, давайте предположим, что наше приложение имеет контроллер, соответствующий конечной точке /index, который отображает представление из шаблона с именем index.html. Этот шаблон может включать встроенный или внешний код JavaScript, например script.js.
Наша цель — получить доступ к параметрам Spring MVC как из встроенного, так и из внешнего кода JavaScript (JS).
3. Доступ к параметрам
Прежде всего, нам нужно создать переменные модели, которые мы хотим использовать, из кода JS.
В Spring MVC это можно сделать различными способами. Давайте воспользуемся подходом ModelAndView:
Мы можем найти другие возможности в нашем руководстве по Model, ModelMap и ModelView в Spring MVC.
@RequestMapping("/index")
public ModelAndView thymeleafView(Map<String, Object> model) {
model.put("number", 1234);
model.put("message", "Hello from Spring MVC");
return new ModelAndView("thymeleaf/index");
}
4. Встроенный JS-код
Встроенный JS-код — это не что иное, как часть файла index.html, расположенного внутри элемента \u003cscript\u003e. Мы можем передать туда переменные Spring MVC довольно просто:
Механизм шаблонов Thymeleaf заменяет каждое выражение значением, доступным в области текущего выполнения. Это означает, что механизм шаблонов преобразует упомянутый выше код в следующий HTML-код:
<script>
var number = [[${number}]];
var message = "[[${message}]]";
</script>
5. Внешний JS-код
<script>
var number = 1234;
var message = "Hello from Spring MVC!";
</script>
Предположим, что наш внешний JS-код включен в файл index.html с использованием того же \u003c script\u003e, в котором мы указываем атрибут src:
Теперь, если мы хотим использовать параметры Spring MVC из script.js, мы должны:
<script src="/js/script.js"></script>
Обратите внимание, что внешний код JS должен вызываться после инициализация переменных встроенного кода JS.
- define JS variables in embedded JS code as we did in the previous section
- access these variables from the script.js file
Этого можно добиться двумя способами: указав порядок выполнения кода JS или используя асинхронное выполнение кода JS.
5.1. Укажите порядок выполнения
Мы можем сделать это, объявив внешний код JS после встроенного в index.html:
5.2. Асинхронное выполнение кода
<script>
var number = [[${number}]];
var message = "[[${message}]]";
</script>
<script src="/js/script.js"></script>
В этом случае порядок, в котором мы объявляем внешний и встроенный код JS в index.html, не имеет значения, но мы должны поместить код из script.js в типичный загружаемый на странице код. wrapper:
Несмотря на простоту этого кода, наиболее распространенной практикой является использование вместо него jQuery. Мы включаем эту библиотеку в качестве первого элемента \u003cscript\u003e в файл index.html:
window.onload = function() {
// JS code
};
Теперь мы можем поместить код JS в следующую оболочку jQuery:
<!DOCTYPE html>
<html>
<head>
<script src="/js/jquery.js"></script>
...
</head>
...
</html>
С помощью этой оболочки мы можем гарантировать, что код JS выполняется только тогда, когда все содержимое страницы и, следовательно, весь другой встроенный код JS полностью загружены.
$(function () {
// JS code
});
6. Немного пояснений
В Spring MVC механизм шаблонов Thymeleaf анализирует только файл шаблона (index.html в нашем случае) и преобразует его в файл HTML. Этот файл, в свою очередь, может содержать ссылки на другие ресурсы, выходящие за рамки механизма шаблонов. Браузер пользователя анализирует эти ресурсы и отображает HTML-представление.
Таким образом, эти ресурсы не анализируются механизмом шаблонов, и мы можем внедрять переменные, определенные в контроллере, только во встроенный код JS, который затем становится доступным для внешнего кода JS.
7. Заключение
В этом руководстве мы узнали, как получить доступ к параметрам Spring MVC внутри кода JavaScript.
«Как всегда, полные примеры кода находятся в нашем репозитории GitHub.
«