
В Spring MVC возврат HTML страницы реализуется через контроллеры, которые обрабатывают HTTP-запросы и передают управление шаблонизатору. Наиболее часто используется Thymeleaf, поскольку он интегрируется со Spring Boot без дополнительной конфигурации. Достаточно разместить шаблон в директории src/main/resources/templates, а метод контроллера вернуть имя файла без расширения.
Пример: метод контроллера с аннотацией @GetMapping(«/home») может вернуть строку «home», после чего Spring автоматически подставит файл home.html из каталога шаблонов. Если требуется статическая страница без привязки к шаблонизатору, её следует разместить в src/main/resources/static, и она будет доступна напрямую по URL.
Для более сложных случаев возможно использование Model или ModelAndView для передачи данных в шаблон. Важно учитывать, что по умолчанию Spring Boot ищет ресурсы именно в папках templates и static, поэтому изменение структуры проекта потребует дополнительной конфигурации в application.properties.
Настройка контроллера для возврата HTML

В Spring MVC возврат HTML реализуется через контроллер, который возвращает имя шаблона. Для этого необходимо использовать аннотации @Controller и @GetMapping.
- Создайте класс в пакете
controllerи пометьте его аннотацией@Controller. - Определите метод, возвращающий
String, где значение совпадает с именем HTML-шаблона без расширения. - Для связывания URL с методом примените
@GetMapping("/путь").
Пример:
@Controller
public class PageController {
@GetMapping("/home")
public String home() {
return "home"; // home.html в resources/templates
}
}
- Файлы шаблонов помещаются в
src/main/resources/templates. - Для работы с HTML по умолчанию используется Thymeleaf, подключённый как зависимость.
- Расширение файла указывать не нужно – движок сам подставит
.html.
Если требуется вернуть статическую страницу без шаблонизатора, её можно разместить в src/main/resources/static, тогда контроллер не нужен – доступ осуществляется напрямую по URL.
Использование аннотации @Controller и @GetMapping

@Controller сообщает Spring, что класс обрабатывает HTTP-запросы и должен участвовать в механизме диспетчеризации. В отличие от @RestController, он возвращает представление, а не данные в формате JSON.
@GetMapping связывает метод с конкретным URL и указывает, что обработка выполняется по HTTP-методу GET. Например, метод, помеченный @GetMapping(«/home»), вызовется при обращении к адресу /home.
Метод в контроллере возвращает строку, совпадающую с именем шаблона HTML-файла, расположенного в каталоге src/main/resources/templates. Если подключён Thymeleaf, достаточно вернуть имя файла без расширения. Например, return "index"; отобразит файл index.html.
Рекомендуется группировать методы в контроллере по смысловой близости URL, чтобы упростить маршрутизацию и поддержку кода. Несколько контроллеров для разных областей приложения помогают избежать перегруженности одного класса.
Для обработки динамических сегментов пути можно использовать параметры в аннотации: @GetMapping("/user/{id}"). В методе значение извлекается через @PathVariable. Это позволяет связывать URL напрямую с аргументами метода.
Размещение HTML файлов в папке resources/templates

Spring Boot ищет шаблоны по умолчанию в каталоге src/main/resources/templates. Файлы в этой папке обрабатываются движком шаблонов, чаще всего Thymeleaf.
Для работы с Thymeleaf необходимо добавить зависимость spring-boot-starter-thymeleaf. После этого любой контроллер может возвращать имя HTML файла без расширения, и движок автоматически найдёт соответствующий ресурс в templates.
Пример: если в папке templates расположен файл index.html, то метод контроллера return "index"; обеспечит его рендеринг.
Важно: при использовании @ResponseBody шаблон не будет обработан как HTML. Для возврата страницы метод контроллера должен возвращать String без аннотации @ResponseBody.
Рекомендуется структурировать директорию templates под разные разделы приложения, например templates/admin или templates/user, чтобы упростить поддержку проекта.
Подключение шаблонизатора Thymeleaf

Для работы с Thymeleaf необходимо добавить зависимость в pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
По умолчанию Spring Boot ищет шаблоны в директории src/main/resources/templates. Расширение файлов – .html.
Пример контроллера с возвратом HTML-шаблона:
@Controller
public class PageController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("user", "Иван");
return "hello";
}
}
В файле hello.html можно вывести данные через синтаксис Thymeleaf:
<p th:text="${user}"></p>
Для корректного рендеринга укажите в корне HTML-файла пространство имён: xmlns:th="http://www.thymeleaf.org".
Возврат статической HTML страницы без шаблонизатора
Spring Boot по умолчанию ищет статические ресурсы в директориях src/main/resources/static, public, resources и META-INF/resources. Любой файл с расширением .html, помещённый в одну из этих папок, будет доступен напрямую без использования контроллеров и шаблонизаторов.
Пример структуры проекта:
src/main/java/com/example/demo– исходный кодsrc/main/resources/static/index.html– статическая страница
После запуска приложения файл index.html станет доступен по адресу:
http://localhost:8080/index.htmlhttp://localhost:8080/(если имя файлаindex.html)
Рекомендации:
- Используйте каталог
static, если страницы не требуют серверной логики. - Для вложенных HTML файлов создавайте подпапки:
static/docs/manual.htmlбудет доступен по/docs/manual.html. - Размещайте только неизменяемый контент. Для динамики подключайте JS или переходите к контроллерам.
- Если требуется ограничить доступ к статическим страницам, настройте
WebSecurityConfigurerAdapterили Spring Security rules.
Обработка параметров запроса и передача данных в шаблон

В Spring обработка параметров запроса осуществляется через аннотации @RequestParam, @PathVariable или @ModelAttribute в контроллере. Эти данные можно передать в шаблон с помощью объекта Model или ModelMap.
Пример контроллера:
@GetMapping("/product")
public String productDetail(@RequestParam("id") Long id, Model model) {
Product product = productService.findById(id);
model.addAttribute("product", product);
return "product";
}
В данном примере параметр id извлекается из URL, используется для получения объекта Product и передаётся в шаблон product.html.
| Аннотация | Назначение | Пример использования |
|---|---|---|
| @RequestParam | Извлечение параметров из query string | @RequestParam(«name») String name |
| @PathVariable | Извлечение параметров из пути URL | @PathVariable Long id |
| @ModelAttribute | Заполнение объекта из параметров запроса | @ModelAttribute User user |
Для передачи сложных структур данных в шаблон рекомендуется использовать Map или DTO. Это упрощает работу с шаблоном и снижает количество логики в HTML.
Пример передачи нескольких параметров:
@GetMapping("/search")
public String search(@RequestParam String query, @RequestParam int page, Model model) {
SearchResult result = searchService.search(query, page);
model.addAttribute("query", query);
model.addAttribute("result", result);
return "search";
}
В шаблоне можно обращаться к данным через синтаксис выбранного шаблонизатора (Thymeleaf, FreeMarker и др.). Например, в Thymeleaf: th:text="${query}" или th:each="item : ${result.items}".
Решение проблем с кодировкой и путями к ресурсам
В Spring-приложениях частая проблема – некорректное отображение кириллицы. Основное решение – указание кодировки UTF-8. В файле application.properties добавьте:
spring.mvc.locale=UTF-8 и spring.http.encoding.force=true. Также важно указать кодировку в HTML:
<meta charset=»UTF-8″>.
Для возврата HTML-страниц используйте Thymeleaf или FreeMarker. Путь к шаблонам должен соответствовать конфигурации. В Spring Boot по умолчанию:
src/main/resources/templates/ для шаблонов и
src/main/resources/static/ для статических ресурсов.
Проблема с путями возникает, если используются относительные ссылки. Решение – применять выражения Thymeleaf:
th:src=»@{/css/style.css}» или
th:href=»@{/js/app.js}». Это гарантирует правильное разрешение ресурсов независимо от уровня вложенности URL.
Для явной конфигурации ресурсов создайте класс:
@Configuration public class WebConfig implements WebMvcConfigurer {
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(«/static/**»).addResourceLocations(«classpath:/static/»);
}}. Это обеспечивает корректное сопоставление путей и исключает ошибки 404.
При использовании Spring MVC без Boot добавьте в web.xml или Java-конфигурацию фильтр:
CharacterEncodingFilter с параметрами encoding=UTF-8 и forceEncoding=true, чтобы исключить проблемы с кодировкой на уровне сервера.
Вопрос-ответ:
Можно ли вернуть HTML страницу из Spring без использования шаблонизатора?
Да. HTML можно вернуть напрямую из папки static или public. В Spring Boot такие файлы находятся в src/main/resources/static. Например, если там лежит index.html, то он будет доступен по адресу http://localhost:8080/index.html. В таком случае контроллер писать не нужно — Spring автоматически отдаёт файл.
