1
votes

I'm new at Spring and thymeleaf, I was working with JSF + Facelets so the method I've choosen thymeleaf layout dialect since it's very similar to Facelets, but, for some reason it's not working in my simple project.

I have this in my config files

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

public class AppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {

        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(WebConfig.class);

    }

}

WebConfig.java

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;


@Configuration
@EnableWebMvc
@Import(ThymeLeafConfig.class)
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

my TyhmeLeafConfig

import nz.net.ultraq.thymeleaf.LayoutDialect;
import org.springframework.context.annotation.Bean;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;


public class ThymeLeafConfig {

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        resolver.setCacheable(false);
        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setDialect(new LayoutDialect());
        return templateEngine;
    }

    @Bean
    public ThymeleafViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");
        return viewResolver;
    }
}

The layout.html file

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
  <head>
    <title>Layout page</title>
    <script src="js/jquery.js"></script>
  </head>
  <body>
    <header>
      <h1>MASTER!!!!</h1>
    </header>
    <section layout:fragment="content">
      <p>MASTER CODE</p>
    </section>
    <footer>
      <p>My footer</p>
      <p layout:fragment="custom-footer">Custom footer here</p>
    </footer>  
  </body>
</html>

The index.html file

<p layout:decorator="layout" layout:fragment="content">
    asada
</p>

the problem is that when I open the index.html, it doesn't include anything that it's in the layout.html file, files are next to other in root so no folders are in there, did I miss something in the configuration? thanks

2
I ran into same issue but resolved it using nz.net.ultraq.thymeleaf dependency and referring to latest layout principles from Thymeleaf.org. Take a look here at the sample template I created here - github.com/ajkr195/SpringBootThymeleafTemplate - Ajay Kumar

2 Answers

6
votes

Even using Spring Boot you have to include on your dependencies layout-dialect like this:

<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>

Use also the following dependency if you are using Spring Security:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
0
votes

According to Read.md in https://github.com/ultraq/thymeleaf-layout-dialect you need to specify file, not file name. So you should have (if they are in the same directory):

<p layout:decorator="layout.html" layout:fragment="content">
    asada
</p>

Moreover, Thymeleaf supports layouts that are also very usefull for including framents into code. More info can be found here: http://www.thymeleaf.org/doc/articles/layouts.html