我是第一次与Thymeleaf合作,我需要对模板进行澄清。如果我正确理解文档,我可以在我的页面中包含模板 - 或者只是它的一个片段。例如,我可以写出类似的东西:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head th:include="template/layout :: header">
</head>
<body>
Hello world
<div th:include="template/layout :: footer"></div>
</body>
</html>
但我想要的实际上是使用模板的相反方式:我不想在页面中包含模板片段,而是希望在我的模板中包含内部这样的内容:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
...
</head>
<body>
<div id="my-template-header">...</div>
<div id="the-content">
<!-- include here the content of the current page visited by the user -->
???
</div>
<div id="my-template-footer">...</div>
</body>
换句话说,有没有办法在Thymeleaf中拥有等效的Sitemesh decorators tags?
由于
答案 0 :(得分:67)
创建模板(例如,模板/ layout.html),并在html标记中添加 th:fragment =“page”信息,并使用 th:include定义内容区域=“this :: content”信息:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
th:fragment="page">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
</head>
<body>
layout page
<div th:include="this :: content"/>
layout footer
</body>
</html>
现在创建一个包含此模板的页面,在html标记中添加 th:include =“templates / layout :: page”,并将您的主要内容放在一个带有 th:fragment的div中= “内容”强>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
th:include="templates/layout :: page">
<head>
<title></title>
</head>
<body>
<div th:fragment="content">
my page content
</div>
</body>
</html>
在布局页面中,您可以使用 this (th:include =“this :: content”)或取消此选项(th:include =“:: content” )。我认为这似乎是jsf facelets。
答案 1 :(得分:20)
好的,正如Sotirios Delimanolis所述,Thymeleaf不支持使用模板的方式,或者我应该说“ Hierarchical layouts ”,正如Daniel {{{{{{{{ / p>
由于sitemesh和Thymeleaf兼容,似乎我必须使用这两种解决方案。太糟糕了。
编辑:正如DennisJaamann在评论中所建议的,我最终使用了this thread,这是一种提供我正在寻找的功能的视图方言。
工作代码:
首先我添加LayoutDialect
类:
@Bean
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".html");
//NB, selecting HTML5 as the template mode.
resolver.setTemplateMode("HTML5");
resolver.setCacheable(false);
return resolver;
}
然后,我创建模板(例如templates/layout.html
),并将layout:fragment
信息添加到我想要放置当前页面内容的位置:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
...
</head>
<body>
<div id="my-template-header">...</div>
<div id="the-content" layout:fragment="content">
<!-- include here the content of the current page visited by the user -->
</div>
<div id="my-template-footer">...</div>
</body>
,页面将引用具有属性layout:decorator
的模板:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="templates/layout">
<body>
<div layout:fragment="content">
Hello world
</div>
</body>
</html>
答案 2 :(得分:1)
你需要
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>1.2.2</version>
</dependency>
并将其添加到SpringTemplateEngine:
@Bean
@Description("Thymeleaf template engine with Spring integration")
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.addDialect(new LayoutDialect());
return templateEngine;
}
如果现在在视图文件夹中创建一个名为template的文件夹。
视图/ home.html的
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="template/layout">
<body>
<div layout:fragment="content">
Hello world
</div>
</body>
</html>
视图/布局/的layout.html
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
</head>
<body>
<div id="content" layout:fragment="content">
</div>
</body>
</html>
答案 3 :(得分:0)
据我所知,你不能。一种可能的解决方案是创建始终转发到ViewResolver
文件的decorator
,但同时将Model
属性放入要包含的片段的实际路径中