thymeleaf :Spring-Boot配置文件thymeleaf模板参数说明
参数 | 介绍 |
spring.thymeleaf.cache = true | 启用模板缓存(开发时建议关闭) |
spring.thymeleaf.check-template = true | 检查模板是否存在,然后再呈现 |
spring.thymeleaf.check-template-location = true | 检查模板位置是否存在 |
spring.thymeleaf.content-type = text/html | Content-Type值 |
spring.thymeleaf.enabled = true | 启用MVC Thymeleaf视图分辨率 |
spring.thymeleaf.encoding = UTF-8 | 模板编码 |
spring.thymeleaf.excluded-view-names = | 应该从解决方案中排除的视图名称的逗号分隔列表 |
spring.thymeleaf.mode = HTML5 | 应用于模板的模板模式。另请参见StandardTemplateModeHandlers |
spring.thymeleaf.prefix = classpath:/templates/ | 在构建URL时预先查看名称的前缀 |
spring.thymeleaf.suffix = .html | 构建URL时附加查看名称的后缀 |
spring.thymeleaf.template-resolver-order = | 链中模板解析器的顺序 |
spring.thymeleaf.view-names = | 可以解析的视图名称的逗号分隔列表 |
简单介绍
Thymeleaf是面向Web和独立环境的现代服务器端Java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至纯文本。
Thymeleaf的主要目标是提供一个优雅和高度可维护的创建模板的方式。为了实现这一点,它建立在自然模板的概念上,将其逻辑注入到模板文件中,不会影响模板被用作设计原型。这改善了设计的沟通,弥合了设计和开发团队之间的差距。
Thymeleaf也从一开始就设计了Web标准 - 特别是HTML5 - 允许您创建完全验证的模板,如果这是您需要的。
Themeleaf可处理的模板
可让您处理六种模板,每种模板称为模板模式:【有两种标记模板模式(HTML和XML),三个文本模板模式(TEXT,JAVASCRIPT和CSS)和无操作模板模式(RAW)。】
HTML
XML
TEXT
JAVASCRIPT
CSS
RAW
其他
完全替代 JSP技术
thymeleaf解析原理: thymeleaf在指定的模式下处理文件之前会首先将文件转换为格式良好的XML文件,而此XML文件仍然是完全有效的HTML5;解析xml方式为SAX,Html页面要求严格格式,一定要有封闭标签:/> 或 </>
在URL中使用表达式
下面来看看,如下所示的URL表达式:
<a th:href="@{/order/details(id=3,action='show_all')}">
但3和'show_all'都不能是文字值,因为只有在运行时才能知道它们的值,怎么办?
<a th:href="@{/order/details(id=${order.id},action=(${user.admin} ? 'show_all' : 'show_public'))}">
下面看看另一个URL表达式,如下所示:
<a th:href="@{/order/details(id=${order.id})}">
它其实是下面URL的一个快捷方式:
<a th:href="@{'/order/details'(id=${order.id})}">
这意味着URL基本身可以被指定为一个表达式,例如一个变量表达式:
<a th:href="@{${detailsURL}(id=${order.id})}">
或外部化/国际化的文本:
<a th:href="@{#{orders.details.localized_url}(id=${order.id})}">
甚至可以使用复杂的表达式,包括条件表达式,例如:
<a th:href="@{(${user.admin}? '/admin/home' : ${user.homeUrl})(id=${order.id})}">
如果要更清洁,那么可以使用th:with :
<a th:with="baseUrl=(${user.admin}? '/admin/home' : ${user.homeUrl})"
th:href="@{${baseUrl}(id=${order.id})}">
又或者 -
<div th:with="baseUrl=(${user.admin}? '/admin/home' : ${user.homeUrl})">
...
<a th:href="@{${baseUrl}(id=${order.id})}">...</a>
...
</div>
变量表达式
变量表达式是OGNL表达式 - 如果将Thymeleaf 与Spring - 集成在上下文变量上(也称为Spring术语中的模型属性),则为Spring EL。 它们看起来像这样:
${session.user.name}
它们作为属性值或作为它们的一部分,取决于属性:
<span th:text="${book.author.name}">
上面的表达式与下面是相同的(在OGNL和SpringEL中):
((Book)context.getVariable("book")).getAuthor().getName()
但是不仅在涉及输出的场景中找到变量表达式,而且还可以使用更复杂的处理方式,如:条件,迭代…等等。
<li th:each="book : ${books}">
这里${books}从上下文中选择名为books的变量,并在th:each中使用循环将其评估为迭代器。
选择表达式
选择表达式就像变量表达式一样,它们不是整个上下文变量映射上执行,而是在先前选择的对象。 它们看起来像这样:
*{customer.name}
它们所作用的对象由th:object属性指定:
<div th:object="${book}">
...
<span th:text="*{title}">...</span>
...
</div>
所以这相当于:
{
// th:object="${book}"
final Book selection = (Book) context.getVariable("book");
// th:text="*{title}"
output(selection.getTitle());
}
消息(i18n)表达式
消息表达式(通常称为文本外部化,国际化或i18n)允许从外部源(如:.properties)文件中检索特定于语言环境的消息,通过键来引用这引用消息。
在Spring应用程序中,它将自动与Spring的MessageSource机制集成。如下 -
#{main.title}
#{message.entrycreated(${entryId})}
以下是在模板中使用它们的方式:
<table>
...
<th th:text="#{header.address.city}">...</th>
<th th:text="#{header.address.country}">...</th>
...
</table>
请注意,如果希望消息键由上下文变量的值确定,或者希望将变量指定为参数,则可以在消息表达式中使用变量表达式:
#{${config.adminWelcomeKey}(${session.user.name})}
链接(URL)表达式
链接表达式在构建URL并向其添加有用的上下文和会话信息(通常称为URL重写的过程)。
因此,对于部署在Web服务器的/myapp上下文中的Web应用程序,可以使用以下表达式:
<a th:href="@{/order/list}">...</a>
可以转换成如下的东西:
<a href="/myapp/order/list">...</a>
甚至,如果需要保持会话,并且cookie未启用(或者服务器还不知道),那么生成的格式为:
<a href="/myapp/order/list;jsessionid=s2ds3fa31abd241e2a01932">...</a>
网址也可以带参数,如下所示:
<a th:href="@{/order/details(id=${orderId},type=${orderType})}">...</a>
这将产生类似以下的结果 -
<!-- 注意&符号会在标签属性中进行HTML转义... -->
<a href="/myapp/order/details?id=23&type=online">...</a>
链接表达式可以是相对的,在这种情况下,应用程序上下文将不会被加到URL的前面:
<a th:href="@{../documents/report}">...</a>
也是服务器相对的(同样,没有应用程序上下文的前缀):
<a th:href="@{~/contents/main}">...</a>
和协议相关(就像绝对URL一样,但浏览器将使用与正在显示的页面相同的HTTP或HTTPS协议):
<a th:href="@{//static.mycompany.com/res/initial}">...</a>
当然,链接表达式也可以是绝对的:
<a th:href="@{http://www.mycompany.com/main}">...</a>
但是绝对(或协议相对)URL ,在Thymeleaf链接表达式中应该添加什么值? 很简单:由响应过滤器定义URL重写:在基于Servlet的Web应用程序中,对于每个输出的URL(上下文相对,相对,绝对…),在显示URL之前,Thymeleaf总是调用HttpServletResponse.encodeUrl(...)机制。 这意味着一个过滤器可以通过包装HttpServletResponse对象来为应用程序执行自定义的URL重写。
片段表达式
片段表达式是一种简单的方法用来表示标记的片段并将其移动到模板中。 由于这些表达式,片段可以被复制,传递给其他模板的参数等等。
最常见的是使用th:insert或th:replace来插入片段:
<div th:insert="~{commons :: main}">...</div>
但是它们可以在任何地方使用,就像任何其他变量一样:
<div th:with="frag=~{footer :: #main/text()}">
<p th:insert="${frag}">
</div>
片段表达式可以有参数。
文字和操作
有很多类型的文字和操作可用,它们分别如下:
文字
文本文字,例如:'one text', 'Another one!',…
数字文字,例如:0,10, 314, 31.01, 112.83,…
布尔文字,例如:true,false
Null文字,例如:Null
文字标记,例如:one, sometext, main,…
文本操作:
字符串连接:+
文字替换:|The name is ${name}|
算术运算:
二进制操作:+, -, *, /, %
减号(一元运算符):-
布尔运算:
二进制运算符,and,or
布尔否定(一元运算符):!,not
比较和相等:
比较运算符:>,<,>=,<=(gt,lt,ge,le)
相等运算符:==, != (eq, ne)
条件操作符:
If-then:(if) ? (then)
If-then-else:(if) ? (then) : (else)
Default: (value) ?: (defaultvalue)
表达式预处理
关于表达式的最后一件事是知道表达式预处理,在__之间指定,如下所示:
#{selection.__${sel.code}__}
上面代码中,第一个被执行的变量表达式是:${sel.code},并且将使用它的结果作为表达式的一部分(假设${sel.code}的结果为:ALL),在此处执行国际化的情况下(这将查找与关键selection.ALL消息)。
基本的属性
下面来看看标准方言中的几个最基本的属性。 从th:文本开始,它代替了标签的主体:
<p th:text="#{msg.welcome}">Welcome everyone!</p>
现在,th:each重复它所在元素的次数,由它的表达式返回的数组或列表所指定的次数,为迭代元素创建一个内部变量,其语法与Java的foreach表达式相同:
<li th:each="book : ${books}" th:text="${book.title}">En las Orillas del Sar</li>
最后,Thymeleaf为特定的XHTML和HTML5属性提供了许多th属性,这些属性只评估它们的表达式,并将这些属性的值设置为结果。
<form th:action="@{/createOrder}">
<input type="button" th:value="#{form.submit}" />
<a th:href="@{/admin/users}">