не работает вставка фрагмента в 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

→ Ссылка