не работает вставка фрагмента в index.html
Приложение на Spring-Boot + thymeleaf. Первым запускается файл index.html, который расположен в папке static. Остальные все шаблоны находятся в папке templates. Я думал сделать index.html главной страницей сайта. Но пытаюсь вставить туда фрагмент шапки, используя thymeleaf, и ни чего не работает, т.е. нет этого фрагмента на этой странице.
<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Home page</title>
</head>
<body>
<div th:insert="navbar :: f-navbar"></div>
<p>Go: <a href="/setting">Настройки</a></p>
</body>
</html>
А если я перейду на страницу setting, где точно такой же фрагмент прекрасно отображается. Что я делаю не так?
Ответы (1 шт):
Во-первых:
Файл index.html в папке static не обрабатывается Thymeleaf.
Это просто статический файл.
Для того, чтобы обработать данный файл как шаблон, у Вас должен быть контроллер, который обрабатывает путь "/" и рендерит шаблон index.html в папке templates:
package com.example.test;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
@RequestMapping("/")
public String home(Model model) {
// some logic ...
return "index";
}
}
или же Вам нужно настроить MVCConfig, для обработки отдельных шаблонов напрямую.
На самом деле данный класс может называться как угодно, главное чтобы он имплементировал интерфейс
WebMvcConfigurer.
Хотя чаще всего я встречаю именно такое название
В дальнейшем, подMVCConfigя буду подразумевать именно класс, который имплементируетWebMvcConfigurer.
Это можно сделать добавив метод addViewControllers в свой MVCConfig если он есть
package com.example.test;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
@EnableWebMvc
public class MVCConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/hello").setViewName("hello");
registry.addViewController("/login").setViewName("login");
}
}
В данном случае Вы просто указываете Спрингу какие пути можно обработать без какой-либо специальной пользовательской логики.
Для этого в Спринге есть ViewController, который просто принимает указанный запрос и в качестве ответа отсылает указанный отрендеренный шаблон.
Метод addViewControllers принимает в качестве параметра реестр.
registry // берём данный реестр
.addViewController("/") // указываем путь, который мы хотим обработать
.setViewName("index"); // указываем имя шаблона
Во-вторых:
Указывайте полный путь к шаблону с фрагментом.
например:
<div th:include="front/themes/dark/blocks::pagination"></div>
в моём случае файл blocks.html лежал по адресу (относительно корня проекта, конечно)
src/main/resources/templates/front/themes/dark/blocks.html
соответственно путь нужно указывать сразу после templates