-
Thymeleaf
2021-02-23 18:43:07Thymeleaf模板引擎 Thymeleaf 应该是目前最受欢迎的模板引擎技术了,Spring Boot 官方也推荐 Java web 开发中使用该技术来替代 JSP 技术,主要由于其“原型即页面”的理念与 Spring Boot 倡导的快速开发非常契合,...Thymeleaf模板引擎
Thymeleaf 应该是目前最受欢迎的模板引擎技术了,Spring Boot 官方也推荐 Java web 开发中使用该技术来替代 JSP 技术,主要由于其“原型即页面”的理念与 Spring Boot 倡导的快速开发非常契合,同时 Thymeleaf 模板引擎技术也确实拥有其他技术所不具备的优点。
Thymeleaf 3
Thymeleaf 于 2016 年 5 月 8 日正式发布了 thymeleaf-3.0.0.RELEASE 版本,目前的大部分项目开发过程中也是使用 Thymeleaf 3.0 及以上版本,因此在这里简单的介绍一下 Thymeleaf 3 的特性。
-
完整的 HTML5 标记支持,全新的解析器
-
自带多种模板模式,也可扩展支持其他模板格式。
-
在 web 和非 web 环境(离线)下都可以正常工作
-
对 Spring web 开发的支持非常完善
-
独立于 Servlet API
Thymeleaf快速上手
新建一个项目
- 导入thymeleaf依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
导入约束
- 在 resources/templates 目录新建模板文件 thymeleaf.html ,Thymeleaf 模板引擎的默认后缀名即为 html,新增文件后,首先在模板文件的 标签中导入 Thymeleaf 的名称空间
- 导入该名称空间主要是为了 Thymeleaf 的语法提示和 Thymeleaf 标签的使用
<html lang="en" xmlns:th="http://www.thymeleaf.org">
新建一个Controller
- 后端通过Model对象存数据
@Controller public class ThymeleafController { @RequestMapping("/tc") public String tc(Model model){ model.addAttribute("msg","Hello Thymeleaf"); return "thymeleaf"; } }
thymeleaf.html
- 前端通过thymeleaf语法取出数据
- 直接打开该页面显示内容是:默认
- 启动项目,通过请求访问内容是:Hello Thymeleaf
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--取出后端存的数据--> <div> <h2 th:text="${msg}">默认</h2> </div> </body> </html>
Thymeleaf属性
th:text 对应的是 HTML5 中的 text 属性,除 th:text 属性外,Thymeleaf 也提供了其他的标签属性来替换 HTML5 原生属性的值,属性节选如下:
- th:background 对应 HTML5 中的背景属性
- th:class 对应 HTML5 中的 class 属性
- th:href 对应 HTML5 中的链接地址属性
- th:id 和 th:name 分别对应 HTML5 中的 id 和 name 属性…
- th:block 比较特殊,它是 Thymeleaf 提供的唯一的一个 Thymeleaf 块级元素,其特殊性在于 Thymeleaf 模板引擎在处理th:block的时候会删掉它本身,而保留其内容。
可以使用ModelMap存放多个数据
Thymeleaf 语法规则
表达式语法
- 变量表达式: ${…}
- 选择变量表达式: *{…}
- 信息表达式: #{…}
- 链接 URL 表达式: @{…}
- 分段表达式: ~{…}
字面量
- 字符串: ‘one text’, ‘Another one!’ …
- 数字: 0, 34, 3.0, 12.3 …
- 布尔值: true, false
- Null 值: null
- 字面量标记:one, sometext, main …
文本运算
- 字符串拼接: +
- 字面量置换: |The name is ${name}|
算术运算
- 二元运算符: +, -, *, /, %
- 负号(一元运算符): (unary operator): -
布尔运算
- 二元运算符: and, or
- 布尔非(一元运算符): !, not
比较运算
- 比较: >, <, >=, <= (gt, lt, ge, le)
- 相等运算符: ==, != (eq, ne)
- 比较运算符也可以使用转义字符,比如大于号,可以使用 Thymeleaf 语法 gt 也可以使用转义字符>
条件运算符
- If-then: (if) ? (then)
- If-then-else: (if) ? (then) : (else)
- Default: (value) ?: (defaultvalue)
特殊语法
- 无操作: _
Thymeleaf 模板引擎使用注意事项
必须引入名称空间
- 即使不引入以上名称空间,静态资源访问以及模板动态访问都不会报错,因此有些开发者可能会忽略这个事情。但是建议在开发过程中最好引入该名称空间,因为引入之后会有 Thymeleaf 代码的语法提示,能够提升开发效率,也减少人为造成的低级错误。
<html lang="en" xmlns:th="http://www.thymeleaf.org"></html>
禁入模板引擎
- Thymeleaf 的默认缓存设置是通过配置文件的 spring.thymeleaf.cache 配置属性决定的,通过如上 Thymeleaf 模板的配置属性类 ThymeleafProperties 可以发现该属性默认为 true,因此 Thymeleaf 默认是使用模板缓存的,该设置有助于改善应用程序的性能,因为模板只需编译一次即可,但是在开发过程中不能实时看到页面变更的效果,除非重启应用程序,因此建议将该属性设置为 false,在配置文件中修改如下:
spring.thymeleaf.cache=false
IDEA 中通过 Thymeleaf 语法读取变量时爆红问题
- 如下图所示,在刚开始使用 Thymeleaf 开发时可能会碰到这种问题,在模板文件中通过 Thymeleaf 语法读取变量时,该变量名称下会出现红色波浪线,也就是错误的标志。
- 只是由于 IDEA 中默认开启了表达式参数验证,即使在后端的 model 数据中添加了该变量,但是对于前端文件是无法感知的,因此会报这个错误,可以在 IDEA 中默认将验证关闭或者将提示级别修改掉也可以。
-
-
thymeleaf
2018-05-15 15:18:59thymeleaf TEXT MODEpublic class ThymeTemplate { private ThymeTemplate(){ } public static String merge(Map<String,Object> param, String template) { TemplateEngine templateEngine =...thymeleaf TEXT MODE
public class ThymeTemplate { private ThymeTemplate(){ } public static String merge(Map<String,Object> param, String template) { TemplateEngine templateEngine = getInstance(); Context context = new Context(); context.setVariables(param); return templateEngine.process(template, context); } private static TemplateEngine getInstance() { return EngineGenerator.templateEngine; } private static class EngineGenerator { private static TemplateEngine templateEngine = new TemplateEngine(); static { StringTemplateResolver cltr = new StringTemplateResolver(); cltr.setTemplateMode(TemplateMode.TEXT); templateEngine.addTemplateResolver(cltr); } } }
"C:\Program Files\Java\jdk1.8.0_144\bin\java" "-javaagent:D:\IntelliJ IDEA Community Edition 2017.2.5\lib\idea_rt.jar=65031:D:\IntelliJ IDEA Community Edition 2017.2.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;D:\gitLocal\seasnail\feature\20171019_1403053_dev_1\seasnail-web\target\test-classes;D:\gitLocal\seasnail\feature\20171019_1403053_dev_1\seasnail-web\target\classes;D:\gitLocal\seasnail\feature\20171019_1403053_dev_1\seasnail-api-server\target\classes;D:\gitLocal\seasnail\feature\20171019_1403053_dev_1\seasnail-biz\target\classes;D:\gitLocal\seasnail\feature\20171019_1403053_dev_1\seasnail-dal\target\classes;D:\m2repository\org\mybatis\generator\mybatis-generator-core\1.3.2\mybatis-generator-core-1.3.2.jar;D:\gitLocal\seasnail\feature\20171019_1403053_dev_1\seasnail-common\target\classes;D:\m2repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\1.1.1\mybatis-spring-boot-starter-1.1.1.jar;D:\m2repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\1.1.1\mybatis-spring-boot-autoconfigure-1.1.1.jar;D:\m2repository\org\mybatis\mybatis\3.4.0\mybatis-3.4.0.jar;D:\m2repository\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar;D:\m2repository\org\springframework\boot\spring-boot-starter-jdbc\1.4.3.RELEASE\spring-boot-starter-jdbc-1.4.3.RELEASE.jar;D:\m2repository\org\apache\tomcat\tomcat-jdbc\8.5.6\tomcat-jdbc-8.5.6.jar;D:\m2repository\org\apache\tomcat\tomcat-juli\8.5.6\tomcat-juli-8.5.6.jar;D:\m2repository\org\springframework\spring-jdbc\4.3.5.RELEASE\spring-jdbc-4.3.5.RELEASE.jar;D:\m2repository\org\springframework\spring-tx\4.3.5.RELEASE\spring-tx-4.3.5.RELEASE.jar;D:\m2repository\com\alibaba\boot\pandora-hsf-spring-boot-starter\2017-11-release\pandora-hsf-spring-boot-starter-2017-11-release.jar;D:\m2repository\com\taobao\pandora\pandora-boot-starter-hsf\2017-11-release\pandora-boot-starter-hsf-2017-11-release.jar;D:\m2repository\com\taobao\pandora\pandora-boot-starter\2017-11-release\pandora-boot-starter-2017-11-release.jar;D:\m2repository\com\taobao\pandora\pandora-boot-bootstrap\2.1.7.9\pandora-boot-bootstrap-2.1.7.9.jar;D:\m2repository\com\taobao\pandora\taobao-hsf.sar-container\2017-11-release\taobao-hsf.sar-container-2017-11-release.jar;D:\m2repository\com\taobao\pandora\plugin\metrics\1.6.3\metrics-1.6.3.jar;D:\m2repository\com\taobao\pandora\plugin\pandolet\1.0.2\pandolet-1.0.2.jar;D:\m2repository\com\taobao\pandora\plugin\pandora-qos-service\2.1.6.4\pandora-qos-service-2.1.6.4.jar;D:\m2repository\com\taobao\pandora\plugin\unitrouter\1.1.3\unitrouter-1.1.3.jar;D:\m2repository\com\taobao\pandora\plugin\hsf\2.2.3.9\hsf-2.2.3.9.jar;D:\m2repository\com\taobao\pandora\plugin\diamond-client\3.8.3\diamond-client-3.8.3.jar;D:\m2repository\com\taobao\pandora\plugin\config-client\1.9.2\config-client-1.9.2.jar;D:\m2repository\com\taobao\pandora\plugin\eagleeye-core\1.6.3\eagleeye-core-1.6.3.jar;D:\m2repository\com\taobao\pandora\plugin\vipserver-client\4.6.9\vipserver-client-4.6.9.jar;D:\m2repository\com\taobao\pandora\plugin\spas-sdk-service\1.2.5\spas-sdk-service-1.2.5.jar;D:\m2repository\com\taobao\pandora\plugin\spas-sdk-client\1.2.5\spas-sdk-client-1.2.5.jar;D:\m2repository\com\alibaba\boot\pandora-hsf-spring-boot-autoconfigure\2017-11-release\pandora-hsf-spring-boot-autoconfigure-2017-11-release.jar;D:\m2repository\com\alibaba\middleware\sdk\2017-11-release\sdk-2017-11-release.jar;D:\m2repository\com\alibaba\middleware\spas-sdk-service-sdk\1.2.5--2017-11-release\spas-sdk-service-sdk-1.2.5--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\metrics-sdk\1.6.3--2017-11-release\metrics-sdk-1.6.3--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\vipserver-client-sdk\4.6.9--2017-11-release\vipserver-client-sdk-4.6.9--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\monitor-sdk\1.2.1--2017-11-release\monitor-sdk-1.2.1--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\acl.plugin-sdk\1.2.56--2017-11-release\acl.plugin-sdk-1.2.56--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\notify-tr-client-sdk\3.4.0--2017-11-release\notify-tr-client-sdk-3.4.0--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\spas-sdk-client-sdk\1.2.5--2017-11-release\spas-sdk-client-sdk-1.2.5--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\config-client-sdk\1.9.2--2017-11-release\config-client-sdk-1.9.2--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\filesync-client-sdk\1.0.8--2017-11-release\filesync-client-sdk-1.0.8--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\tddl-client-sdk\5.2.2-8--2017-11-release\tddl-client-sdk-5.2.2-8--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\tbsession-sdk\3.1.3.5--2017-11-release\tbsession-sdk-3.1.3.5--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\hsf-notify-client-sdk\3.2.2--2017-11-release\hsf-notify-client-sdk-3.2.2--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\diamond-client-sdk\3.8.3--2017-11-release\diamond-client-sdk-3.8.3--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\live-profiler-pandora-sdk\1.0.3--2017-11-release\live-profiler-pandora-sdk-1.0.3--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\pandora-qos-service-sdk\2.1.6.4--2017-11-release\pandora-qos-service-sdk-2.1.6.4--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\ons-sdk-sdk\1.3.1--2017-11-release\ons-sdk-sdk-1.3.1--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\tair-plugin-sdk\2.2.29--2017-11-release\tair-plugin-sdk-2.2.29--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\rocketmq-client-sdk\4.1.2--2017-11-release\rocketmq-client-sdk-4.1.2--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\switch-sdk\2.1.0.4.1--2017-11-release\switch-sdk-2.1.0.4.1--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\buc.sso.client.plugin-sdk\0.9.1--2017-11-release\buc.sso.client.plugin-sdk-0.9.1--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\eagleeye-core-sdk\1.6.3--2017-11-release\eagleeye-core-sdk-1.6.3--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\pandora-framework-sdk\2.1.8.1--2017-11-release\pandora-framework-sdk-2.1.8.1--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\alimonitor-jmonitor-sdk\1.2.5--2017-11-release\alimonitor-jmonitor-sdk-1.2.5--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\pandolet-sdk\1.0.2--2017-11-release\pandolet-sdk-1.0.2--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\hsf-sdk\2.2.3.9--2017-11-release\hsf-sdk-2.2.3.9--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\metaq-client-sdk\4.1.4.Final--2017-11-release\metaq-client-sdk-4.1.4.Final--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\mtop-uncenter-sdk\1.0.3.6--2017-11-release\mtop-uncenter-sdk-1.0.3.6--2017-11-release.jar;D:\m2repository\com\alibaba\middleware\unitrouter-sdk\1.1.3--2017-11-release\unitrouter-sdk-1.1.3--2017-11-release.jar;D:\m2repository\com\alibaba\ais\iceberg-common-util\1.2.1-SNAPSHOT\iceberg-common-util-1.2.1-20180410.091751-43.jar;D:\m2repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\m2repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;D:\m2repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\m2repository\org\apache\httpcomponents\httpcore\4.4.5\httpcore-4.4.5.jar;D:\m2repository\org\apache\httpcomponents\httpclient\4.5.2\httpclient-4.5.2.jar;D:\m2repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;D:\m2repository\org\apache\poi\poi\3.15\poi-3.15.jar;D:\m2repository\org\apache\poi\poi-ooxml\3.15\poi-ooxml-3.15.jar;D:\m2repository\org\apache\poi\poi-ooxml-schemas\3.15\poi-ooxml-schemas-3.15.jar;D:\m2repository\org\apache\xmlbeans\xmlbeans\2.6.0\xmlbeans-2.6.0.jar;D:\m2repository\stax\stax-api\1.0.1\stax-api-1.0.1.jar;D:\m2repository\com\github\virtuald\curvesapi\1.04\curvesapi-1.04.jar;D:\m2repository\com\google\code\gson\gson\2.7\gson-2.7.jar;D:\m2repository\com\google\guava\guava\23.0\guava-23.0.jar;D:\m2repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;D:\m2repository\com\google\errorprone\error_prone_annotations\2.0.18\error_prone_annotations-2.0.18.jar;D:\m2repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;D:\m2repository\org\codehaus\mojo\animal-sniffer-annotations\1.14\animal-sniffer-annotations-1.14.jar;D:\m2repository\org\apache\commons\commons-lang3\3.6\commons-lang3-3.6.jar;D:\m2repository\org\apache\commons\commons-collections4\4.1\commons-collections4-4.1.jar;D:\m2repository\com\alibaba\ais\iceberg-common-support\1.2.1-SNAPSHOT\iceberg-common-support-1.2.1-20180410.091755-43.jar;D:\m2repository\com\alibaba\ais\oceankeeper-api-client\1.0.2-SNAPSHOT\oceankeeper-api-client-1.0.2-20180315.103024-13.jar;D:\m2repository\com\taobao\messenger\messenger-common\2.0.0-SNAPSHOT\messenger-common-2.0.0-20180314.095112-62.jar;D:\m2repository\com\alibaba\iwork\shared\mc.api\1.1.4\mc.api-1.1.4.jar;D:\m2repository\com\alibaba\iwork\shared\iwork-commons-model\1.0.9\iwork-commons-model-1.0.9.jar;D:\m2repository\org\thymeleaf\thymeleaf\3.0.9.RELEASE\thymeleaf-3.0.9.RELEASE.jar;D:\m2repository\ognl\ognl\3.1.12\ognl-3.1.12.jar;D:\m2repository\org\javassist\javassist\3.20.0-GA\javassist-3.20.0-GA.jar;D:\m2repository\org\attoparser\attoparser\2.0.4.RELEASE\attoparser-2.0.4.RELEASE.jar;D:\m2repository\org\unbescape\unbescape\1.1.5.RELEASE\unbescape-1.1.5.RELEASE.jar;D:\m2repository\org\slf4j\slf4j-api\1.7.22\slf4j-api-1.7.22.jar;D:\m2repository\io\dropwizard\metrics\metrics-core\3.1.2\metrics-core-3.1.2.jar;D:\gitLocal\seasnail\feature\20171019_1403053_dev_1\seasnail-api-client\target\classes;D:\m2repository\com\alibaba\ais\iceberg-common-lang\1.2.1-SNAPSHOT\iceberg-common-lang-1.2.1-20180410.091748-43.jar;D:\m2repository\org\projectlombok\lombok\1.16.12\lombok-1.16.12.jar;D:\m2repository\org\hibernate\hibernate-validator\5.2.4.Final\hibernate-validator-5.2.4.Final.jar;D:\m2repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\m2repository\org\jboss\logging\jboss-logging\3.3.0.Final\jboss-logging-3.3.0.Final.jar;D:\m2repository\com\fasterxml\classmate\1.3.3\classmate-1.3.3.jar;D:\m2repository\org\springframework\spring-test\4.3.2.RELEASE\spring-test-4.3.2.RELEASE.jar;D:\m2repository\org\springframework\spring-core\4.3.5.RELEASE\spring-core-4.3.5.RELEASE.jar;D:\m2repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\m2repository\org\springframework\boot\spring-boot-test\1.4.3.RELEASE\spring-boot-test-1.4.3.RELEASE.jar;D:\m2repository\org\springframework\boot\spring-boot\1.4.3.RELEASE\spring-boot-1.4.3.RELEASE.jar;D:\m2repository\com\taobao\pandora\pandora-boot-test\2.1.7.9\pandora-boot-test-2.1.7.9.jar;D:\m2repository\com\taobao\pandora\pandora-boot-common\2.1.7.9\pandora-boot-common-2.1.7.9.jar;D:\m2repository\com\taobao\pandora\pandora-boot-loader\2.1.7.9\pandora-boot-loader-2.1.7.9.jar;D:\m2repository\com\taobao\pandora\pandora-boot-version\2.1.7.9\pandora-boot-version-2.1.7.9.jar;D:\m2repository\com\taobao\pandora\pandora.archive\2.1.7.1\pandora.archive-2.1.7.1.jar;D:\m2repository\com\taobao\pandora\pandora-boot-autoconf\2.1.7.9\pandora-boot-autoconf-2.1.7.9.jar;D:\m2repository\junit\junit\4.12\junit-4.12.jar;D:\m2repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\m2repository\org\mockito\mockito-all\1.10.19\mockito-all-1.10.19.jar;D:\m2repository\com\alibaba\schedulerx\schedulerx-client\2.1.2\schedulerx-client-2.1.2.jar;D:\m2repository\com\alibaba\schedulerx\schedulerx-api\1.0.0-SNAPSHOT\schedulerx-api-1.0.0-20180106.023644-20.jar;D:\m2repository\com\taobao\diamond\diamond-client\3.7.4\diamond-client-3.7.4.jar;D:\m2repository\com\taobao\diamond\diamond-utils\3.2.0\diamond-utils-3.2.0.jar;D:\m2repository\org\codehaus\jackson\jackson-mapper-lgpl\1.9.6\jackson-mapper-lgpl-1.9.6.jar;D:\m2repository\org\codehaus\jackson\jackson-core-lgpl\1.9.6\jackson-core-lgpl-1.9.6.jar;D:\m2repository\com\taobao\middleware\logger.api\0.2.0\logger.api-0.2.0.jar;D:\m2repository\com\taobao\eagleeye\eagleeye-core\1.4.7\eagleeye-core-1.4.7.jar;D:\m2repository\com\alibaba\fastjson\1.2.8.sec01\fastjson-1.2.8.sec01.jar;D:\m2repository\org\springframework\spring-beans\4.3.5.RELEASE\spring-beans-4.3.5.RELEASE.jar;D:\m2repository\org\springframework\spring-aop\4.3.5.RELEASE\spring-aop-4.3.5.RELEASE.jar;D:\m2repository\org\springframework\spring-context\4.3.5.RELEASE\spring-context-4.3.5.RELEASE.jar;D:\m2repository\org\springframework\spring-expression\4.3.5.RELEASE\spring-expression-4.3.5.RELEASE.jar;D:\m2repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\m2repository\com\taobao\common\fulllinkstresstesting\0.9.9.5\fulllinkstresstesting-0.9.9.5.jar;D:\m2repository\com\alibaba\druid\1.0.20\druid-1.0.20.jar;D:\m2repository\com\alibaba\boot\schedulerx-spring-boot-starter\1.1.0-SNAPSHOT\schedulerx-spring-boot-starter-1.1.0-20170523.121559-3.jar;D:\m2repository\org\springframework\boot\spring-boot-actuator\1.4.3.RELEASE\spring-boot-actuator-1.4.3.RELEASE.jar;D:\m2repository\org\springframework\boot\spring-boot-autoconfigure\1.4.3.RELEASE\spring-boot-autoconfigure-1.4.3.RELEASE.jar;D:\m2repository\com\fasterxml\jackson\core\jackson-databind\2.8.5\jackson-databind-2.8.5.jar;D:\m2repository\com\fasterxml\jackson\core\jackson-annotations\2.8.5\jackson-annotations-2.8.5.jar;D:\m2repository\com\fasterxml\jackson\core\jackson-core\2.8.5\jackson-core-2.8.5.jar;D:\m2repository\org\springframework\boot\spring-boot-starter-aop\1.4.3.RELEASE\spring-boot-starter-aop-1.4.3.RELEASE.jar;D:\m2repository\org\springframework\boot\spring-boot-starter\1.4.3.RELEASE\spring-boot-starter-1.4.3.RELEASE.jar;D:\m2repository\org\springframework\boot\spring-boot-starter-logging\1.4.3.RELEASE\spring-boot-starter-logging-1.4.3.RELEASE.jar;D:\m2repository\ch\qos\logback\logback-classic\1.1.8\logback-classic-1.1.8.jar;D:\m2repository\ch\qos\logback\logback-core\1.1.8\logback-core-1.1.8.jar;D:\m2repository\org\slf4j\jcl-over-slf4j\1.7.22\jcl-over-slf4j-1.7.22.jar;D:\m2repository\org\slf4j\jul-to-slf4j\1.7.22\jul-to-slf4j-1.7.22.jar;D:\m2repository\org\slf4j\log4j-over-slf4j\1.7.22\log4j-over-slf4j-1.7.22.jar;D:\m2repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;D:\m2repository\org\aspectj\aspectjweaver\1.8.9\aspectjweaver-1.8.9.jar;D:\m2repository\com\aliexpress\boot\spring-boot-starter-endpoints\1.0.3\spring-boot-starter-endpoints-1.0.3.jar;D:\m2repository\org\springframework\boot\spring-boot-starter-web\1.4.3.RELEASE\spring-boot-starter-web-1.4.3.RELEASE.jar;D:\m2repository\org\springframework\boot\spring-boot-starter-tomcat\1.4.3.RELEASE\spring-boot-starter-tomcat-1.4.3.RELEASE.jar;D:\m2repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.6\tomcat-embed-core-8.5.6.jar;D:\m2repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.6\tomcat-embed-el-8.5.6.jar;D:\m2repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.6\tomcat-embed-websocket-8.5.6.jar;D:\m2repository\org\springframework\spring-web\4.3.5.RELEASE\spring-web-4.3.5.RELEASE.jar;D:\m2repository\org\springframework\spring-webmvc\4.3.5.RELEASE\spring-webmvc-4.3.5.RELEASE.jar;D:\m2repository\com\alibaba\alimonitor\alimonitor-jmonitor\1.1.7\alimonitor-jmonitor-1.1.7.jar;D:\m2repository\com\aliyun\aliyun-java-sdk-core\3.0.0\aliyun-java-sdk-core-3.0.0.jar;D:\m2repository\com\aliyun\aliyun-java-sdk-dm\3.3.1\aliyun-java-sdk-dm-3.3.1.jar;D:\m2repository\com\sun\mail\javax.mail\1.5.6\javax.mail-1.5.6.jar;D:\m2repository\javax\activation\activation\1.1\activation-1.1.jar" com.alibaba.ais.seasnail.web.test.ThymeleafTest 15:25:00.448 [main] DEBUG org.thymeleaf.TemplateEngine - [THYMELEAF] INITIALIZING TEMPLATE ENGINE 15:25:00.913 [main] DEBUG org.thymeleaf.TemplateEngine.CONFIG - Initializing Thymeleaf Template engine configuration... [THYMELEAF] TEMPLATE ENGINE CONFIGURATION: [THYMELEAF] * Thymeleaf version: 3.0.9.RELEASE (built 2017-11-05T00:10:15+0000) [THYMELEAF] * Cache Manager implementation: org.thymeleaf.cache.StandardCacheManager [THYMELEAF] * Template resolvers: [THYMELEAF] * org.thymeleaf.templateresolver.StringTemplateResolver [THYMELEAF] * Message resolvers: [THYMELEAF] * org.thymeleaf.messageresolver.StandardMessageResolver [THYMELEAF] * Link builders: [THYMELEAF] * org.thymeleaf.linkbuilder.StandardLinkBuilder [THYMELEAF] * Dialect: Standard (org.thymeleaf.standard.StandardDialect) [THYMELEAF] * Prefix: "th" [THYMELEAF] * Processors for Template Mode: HTML [THYMELEAF] * Element Tag Processors by [matching element and attribute name] [precedence]: [THYMELEAF] * [* {th:include,data-th-include}] [100]: org.thymeleaf.standard.processor.StandardIncludeTagProcessor [THYMELEAF] * [* {th:insert,data-th-insert}] [100]: org.thymeleaf.standard.processor.StandardInsertTagProcessor [THYMELEAF] * [* {th:replace,data-th-replace}] [100]: org.thymeleaf.standard.processor.StandardReplaceTagProcessor [THYMELEAF] * [* {th:substituteby,data-th-substituteby}] [100]: org.thymeleaf.standard.processor.StandardSubstituteByTagProcessor [THYMELEAF] * [* {th:each,data-th-each}] [200]: org.thymeleaf.standard.processor.StandardEachTagProcessor [THYMELEAF] * [* {th:switch,data-th-switch}] [250]: org.thymeleaf.standard.processor.StandardSwitchTagProcessor [THYMELEAF] * [* {th:case,data-th-case}] [275]: org.thymeleaf.standard.processor.StandardCaseTagProcessor [THYMELEAF] * [* {th:if,data-th-if}] [300]: org.thymeleaf.standard.processor.StandardIfTagProcessor [THYMELEAF] * [* {th:unless,data-th-unless}] [400]: org.thymeleaf.standard.processor.StandardUnlessTagProcessor [THYMELEAF] * [* {th:object,data-th-object}] [500]: org.thymeleaf.standard.processor.StandardObjectTagProcessor [THYMELEAF] * [* {th:with,data-th-with}] [600]: org.thymeleaf.standard.processor.StandardWithTagProcessor [THYMELEAF] * [* {th:attr,data-th-attr}] [700]: org.thymeleaf.standard.processor.StandardAttrTagProcessor [THYMELEAF] * [* {th:attrprepend,data-th-attrprepend}] [800]: org.thymeleaf.standard.processor.StandardAttrprependTagProcessor [THYMELEAF] * [* {th:attrappend,data-th-attrappend}] [900]: org.thymeleaf.standard.processor.StandardAttrappendTagProcessor [THYMELEAF] * [* {th:alt-title,data-th-alt-title}] [990]: org.thymeleaf.standard.processor.StandardAltTitleTagProcessor [THYMELEAF] * [* {th:lang-xmllang,data-th-lang-xmllang}] [990]: org.thymeleaf.standard.processor.StandardLangXmlLangTagProcessor [THYMELEAF] * [* {th:action,data-th-action}] [1000]: org.thymeleaf.standard.processor.StandardActionTagProcessor [THYMELEAF] * [* {th:default,data-th-default}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:hidden,data-th-hidden}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:pubdate,data-th-pubdate}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:nowrap,data-th-nowrap}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:ismap,data-th-ismap}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:async,data-th-async}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:multiple,data-th-multiple}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:checked,data-th-checked}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:required,data-th-required}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:seamless,data-th-seamless}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:declare,data-th-declare}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:selected,data-th-selected}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:readonly,data-th-readonly}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:reversed,data-th-reversed}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:loop,data-th-loop}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:scoped,data-th-scoped}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:disabled,data-th-disabled}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:defer,data-th-defer}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:autoplay,data-th-autoplay}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:novalidate,data-th-novalidate}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:formnovalidate,data-th-formnovalidate}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:autofocus,data-th-autofocus}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:controls,data-th-controls}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:open,data-th-open}] [1000]: org.thymeleaf.standard.processor.StandardConditionalFixedValueTagProcessor [THYMELEAF] * [* {th:onresize,data-th-onresize}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondragend,data-th-ondragend}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onoffline,data-th-onoffline}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onkeydown,data-th-onkeydown}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onkeypress,data-th-onkeypress}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onended,data-th-onended}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onchange,data-th-onchange}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onmouseover,data-th-onmouseover}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onblur,data-th-onblur}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onkeyup,data-th-onkeyup}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onratechange,data-th-onratechange}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onmessage,data-th-onmessage}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onabort,data-th-onabort}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondragstart,data-th-ondragstart}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondrag,data-th-ondrag}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onsuspend,data-th-onsuspend}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onclick,data-th-onclick}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ontimeupdate,data-th-ontimeupdate}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondragleave,data-th-ondragleave}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:oncontextmenu,data-th-oncontextmenu}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onloadstart,data-th-onloadstart}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onscroll,data-th-onscroll}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onplay,data-th-onplay}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondragover,data-th-ondragover}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onreset,data-th-onreset}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onbeforeprint,data-th-onbeforeprint}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onforminput,data-th-onforminput}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onprogress,data-th-onprogress}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onredo,data-th-onredo}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onmousemove,data-th-onmousemove}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onshow,data-th-onshow}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondblclick,data-th-ondblclick}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onemptied,data-th-onemptied}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onload,data-th-onload}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onpause,data-th-onpause}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:oninvalid,data-th-oninvalid}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:oncanplaythrough,data-th-oncanplaythrough}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onhashchange,data-th-onhashchange}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onformchange,data-th-onformchange}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onvolumechange,data-th-onvolumechange}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onseeked,data-th-onseeked}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onloadeddata,data-th-onloadeddata}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onloadedmetadata,data-th-onloadedmetadata}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onafterprint,data-th-onafterprint}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onmousedown,data-th-onmousedown}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onplaying,data-th-onplaying}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondrop,data-th-ondrop}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onundo,data-th-onundo}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onselect,data-th-onselect}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onsubmit,data-th-onsubmit}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondragenter,data-th-ondragenter}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onseeking,data-th-onseeking}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onpopstate,data-th-onpopstate}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onunload,data-th-onunload}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onbeforeunload,data-th-onbeforeunload}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:oninput,data-th-oninput}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onwaiting,data-th-onwaiting}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ondurationchange,data-th-ondurationchange}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onmousewheel,data-th-onmousewheel}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onstorage,data-th-onstorage}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onmouseout,data-th-onmouseout}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onstalled,data-th-onstalled}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onmouseup,data-th-onmouseup}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onreadystatechange,data-th-onreadystatechange}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:oncanplay,data-th-oncanplay}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:ononline,data-th-ononline}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onfocus,data-th-onfocus}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:onerror,data-th-onerror}] [1000]: org.thymeleaf.standard.processor.StandardDOMEventAttributeTagProcessor [THYMELEAF] * [* {th:href,data-th-href}] [1000]: org.thymeleaf.standard.processor.StandardHrefTagProcessor [THYMELEAF] * [* {th:inline,data-th-inline}] [1000]: org.thymeleaf.standard.processor.StandardInlineHTMLTagProcessor [THYMELEAF] * [* {th:method,data-th-method}] [1000]: org.thymeleaf.standard.processor.StandardMethodTagProcessor [THYMELEAF] * [* {th:name,data-th-name}] [1000]: org.thymeleaf.standard.processor.StandardNonRemovableAttributeTagProcessor [THYMELEAF] * [* {th:type,data-th-type}] [1000]: org.thymeleaf.standard.processor.StandardNonRemovableAttributeTagProcessor [THYMELEAF] * [* {th:contextmenu,data-th-contextmenu}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:media,data-th-media}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:abbr,data-th-abbr}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:content,data-th-content}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:http-equiv,data-th-http-equiv}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:min,data-th-min}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:formaction,data-th-formaction}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:draggable,data-th-draggable}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:optimum,data-th-optimum}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:vspace,data-th-vspace}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:start,data-th-start}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:audio,data-th-audio}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:formenctype,data-th-formenctype}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:manifest,data-th-manifest}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:frameborder,data-th-frameborder}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:hspace,data-th-hspace}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:enctype,data-th-enctype}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:sandbox,data-th-sandbox}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:pattern,data-th-pattern}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:scrolling,data-th-scrolling}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:rules,data-th-rules}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:width,data-th-width}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:maxlength,data-th-maxlength}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:frame,data-th-frame}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:preload,data-th-preload}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:autocomplete,data-th-autocomplete}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:icon,data-th-icon}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:background,data-th-background}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:keytype,data-th-keytype}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:cols,data-th-cols}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:marginheight,data-th-marginheight}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:step,data-th-step}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:axis,data-th-axis}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:title,data-th-title}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:colspan,data-th-colspan}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:formtarget,data-th-formtarget}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:summary,data-th-summary}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:kind,data-th-kind}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:cellpadding,data-th-cellpadding}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:usemap,data-th-usemap}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:bgcolor,data-th-bgcolor}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:charset,data-th-charset}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:scope,data-th-scope}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:hreflang,data-th-hreflang}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:placeholder,data-th-placeholder}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:dir,data-th-dir}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:span,data-th-span}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:cellspacing,data-th-cellspacing}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:archive,data-th-archive}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:sizes,data-th-sizes}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:poster,data-th-poster}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:tabindex,data-th-tabindex}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:list,data-th-list}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:marginwidth,data-th-marginwidth}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:headers,data-th-headers}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:target,data-th-target}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:align,data-th-align}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:codebase,data-th-codebase}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:rel,data-th-rel}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:cite,data-th-cite}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:form,data-th-form}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:border,data-th-border}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:longdesc,data-th-longdesc}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:scheme,data-th-scheme}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:valuetype,data-th-valuetype}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:style,data-th-style}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:data,data-th-data}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:compact,data-th-compact}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:standby,data-th-standby}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:srclang,data-th-srclang}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:challenge,data-th-challenge}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:dropzone,data-th-dropzone}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:accesskey,data-th-accesskey}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:wrap,data-th-wrap}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:height,data-th-height}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:contenteditable,data-th-contenteditable}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:max,data-th-max}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:codetype,data-th-codetype}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:for,data-th-for}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:rev,data-th-rev}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:label,data-th-label}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:lang,data-th-lang}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:high,data-th-high}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:classid,data-th-classid}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:formmethod,data-th-formmethod}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:alt,data-th-alt}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:rowspan,data-th-rowspan}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:class,data-th-class}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:rows,data-th-rows}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:datetime,data-th-datetime}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:accept-charset,data-th-accept-charset}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:low,data-th-low}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:spellcheck,data-th-spellcheck}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:size,data-th-size}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:accept,data-th-accept}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:id,data-th-id}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:radiogroup,data-th-radiogroup}] [1000]: org.thymeleaf.standard.processor.StandardRemovableAttributeTagProcessor [THYMELEAF] * [* {th:src,data-th-src}] [1000]: org.thymeleaf.standard.processor.StandardSrcTagProcessor [THYMELEAF] * [* {th:value,data-th-value}] [1000]: org.thymeleaf.standard.processor.StandardValueTagProcessor [THYMELEAF] * [* {th:xmlbase,data-th-xmlbase}] [1000]: org.thymeleaf.standard.processor.StandardXmlBaseTagProcessor [THYMELEAF] * [* {th:xmllang,data-th-xmllang}] [1000]: org.thymeleaf.standard.processor.StandardXmlLangTagProcessor [THYMELEAF] * [* {xmlns:th}] [1000]: org.thymeleaf.standard.processor.StandardXmlNsTagProcessor [THYMELEAF] * [* {th:xmlspace,data-th-xmlspace}] [1000]: org.thymeleaf.standard.processor.StandardXmlSpaceTagProcessor [THYMELEAF] * [* {th:classappend,data-th-classappend}] [1100]: org.thymeleaf.standard.processor.StandardClassappendTagProcessor [THYMELEAF] * [* {th:styleappend,data-th-styleappend}] [1100]: org.thymeleaf.standard.processor.StandardStyleappendTagProcessor [THYMELEAF] * [* {th:text,data-th-text}] [1300]: org.thymeleaf.standard.processor.StandardTextTagProcessor [THYMELEAF] * [* {th:utext,data-th-utext}] [1400]: org.thymeleaf.standard.processor.StandardUtextTagProcessor [THYMELEAF] * [* {th:fragment,data-th-fragment}] [1500]: org.thymeleaf.standard.processor.StandardFragmentTagProcessor [THYMELEAF] * [* {th:assert,data-th-assert}] [1550]: org.thymeleaf.standard.processor.StandardAssertTagProcessor [THYMELEAF] * [* {th:remove,data-th-remove}] [1600]: org.thymeleaf.standard.processor.StandardRemoveTagProcessor [THYMELEAF] * [* {th:ref,data-th-ref}] [10000]: org.thymeleaf.standard.processor.StandardRefAttributeTagProcessor [THYMELEAF] * [{th:block,th-block} *] [100000]: org.thymeleaf.standard.processor.StandardBlockTagProcessor [THYMELEAF] * [* th:*] [2147483647]: org.thymeleaf.standard.processor.StandardDefaultAttributesTagProcessor [THYMELEAF] * Text Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningTextProcessor [THYMELEAF] * DOCTYPE Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardTranslationDocTypeProcessor [THYMELEAF] * CDATA Section Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningCDATASectionProcessor [THYMELEAF] * Comment Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningCommentProcessor [THYMELEAF] * [1100]: org.thymeleaf.standard.processor.StandardConditionalCommentProcessor [THYMELEAF] * Processors for Template Mode: XML [THYMELEAF] * Element Tag Processors by [matching element and attribute name] [precedence]: [THYMELEAF] * [* {th:include}] [100]: org.thymeleaf.standard.processor.StandardIncludeTagProcessor [THYMELEAF] * [* {th:insert}] [100]: org.thymeleaf.standard.processor.StandardInsertTagProcessor [THYMELEAF] * [* {th:replace}] [100]: org.thymeleaf.standard.processor.StandardReplaceTagProcessor [THYMELEAF] * [* {th:substituteby}] [100]: org.thymeleaf.standard.processor.StandardSubstituteByTagProcessor [THYMELEAF] * [* {th:each}] [200]: org.thymeleaf.standard.processor.StandardEachTagProcessor [THYMELEAF] * [* {th:switch}] [250]: org.thymeleaf.standard.processor.StandardSwitchTagProcessor [THYMELEAF] * [* {th:case}] [275]: org.thymeleaf.standard.processor.StandardCaseTagProcessor [THYMELEAF] * [* {th:if}] [300]: org.thymeleaf.standard.processor.StandardIfTagProcessor [THYMELEAF] * [* {th:unless}] [400]: org.thymeleaf.standard.processor.StandardUnlessTagProcessor [THYMELEAF] * [* {th:object}] [500]: org.thymeleaf.standard.processor.StandardObjectTagProcessor [THYMELEAF] * [* {th:with}] [600]: org.thymeleaf.standard.processor.StandardWithTagProcessor [THYMELEAF] * [* {th:attr}] [700]: org.thymeleaf.standard.processor.StandardAttrTagProcessor [THYMELEAF] * [* {th:attrprepend}] [800]: org.thymeleaf.standard.processor.StandardAttrprependTagProcessor [THYMELEAF] * [* {th:attrappend}] [900]: org.thymeleaf.standard.processor.StandardAttrappendTagProcessor [THYMELEAF] * [* {th:inline}] [1000]: org.thymeleaf.standard.processor.StandardInlineXMLTagProcessor [THYMELEAF] * [* {xmlns:th}] [1000]: org.thymeleaf.standard.processor.StandardXmlNsTagProcessor [THYMELEAF] * [* {th:text}] [1300]: org.thymeleaf.standard.processor.StandardTextTagProcessor [THYMELEAF] * [* {th:utext}] [1400]: org.thymeleaf.standard.processor.StandardUtextTagProcessor [THYMELEAF] * [* {th:fragment}] [1500]: org.thymeleaf.standard.processor.StandardFragmentTagProcessor [THYMELEAF] * [* {th:assert}] [1550]: org.thymeleaf.standard.processor.StandardAssertTagProcessor [THYMELEAF] * [* {th:remove}] [1600]: org.thymeleaf.standard.processor.StandardRemoveTagProcessor [THYMELEAF] * [* {th:ref}] [10000]: org.thymeleaf.standard.processor.StandardRefAttributeTagProcessor [THYMELEAF] * [{th:block} *] [100000]: org.thymeleaf.standard.processor.StandardBlockTagProcessor [THYMELEAF] * [* th:*] [2147483647]: org.thymeleaf.standard.processor.StandardDefaultAttributesTagProcessor [THYMELEAF] * Text Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningTextProcessor [THYMELEAF] * CDATA Section Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningCDATASectionProcessor [THYMELEAF] * Comment Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningCommentProcessor [THYMELEAF] * Processors for Template Mode: TEXT [THYMELEAF] * Element Tag Processors by [matching element and attribute name] [precedence]: [THYMELEAF] * [* {th:insert}] [100]: org.thymeleaf.standard.processor.StandardInsertTagProcessor [THYMELEAF] * [* {th:replace}] [100]: org.thymeleaf.standard.processor.StandardReplaceTagProcessor [THYMELEAF] * [* {th:each}] [200]: org.thymeleaf.standard.processor.StandardEachTagProcessor [THYMELEAF] * [* {th:switch}] [250]: org.thymeleaf.standard.processor.StandardSwitchTagProcessor [THYMELEAF] * [* {th:case}] [275]: org.thymeleaf.standard.processor.StandardCaseTagProcessor [THYMELEAF] * [* {th:if}] [300]: org.thymeleaf.standard.processor.StandardIfTagProcessor [THYMELEAF] * [* {th:unless}] [400]: org.thymeleaf.standard.processor.StandardUnlessTagProcessor [THYMELEAF] * [* {th:object}] [500]: org.thymeleaf.standard.processor.StandardObjectTagProcessor [THYMELEAF] * [* {th:with}] [600]: org.thymeleaf.standard.processor.StandardWithTagProcessor [THYMELEAF] * [* {th:inline}] [1000]: org.thymeleaf.standard.processor.StandardInlineTextualTagProcessor [THYMELEAF] * [* {th:text}] [1300]: org.thymeleaf.standard.processor.StandardTextTagProcessor [THYMELEAF] * [* {th:utext}] [1400]: org.thymeleaf.standard.processor.StandardUtextTagProcessor [THYMELEAF] * [* {th:assert}] [1550]: org.thymeleaf.standard.processor.StandardAssertTagProcessor [THYMELEAF] * [* {th:remove}] [1600]: org.thymeleaf.standard.processor.StandardRemoveTagProcessor [THYMELEAF] * [* 100000] [org.thymeleaf.standard.processor.StandardBlockTagProcessor]: {} [THYMELEAF] * [{th:block} *] [100000]: org.thymeleaf.standard.processor.StandardBlockTagProcessor [THYMELEAF] * Text Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningTextProcessor [THYMELEAF] * Processors for Template Mode: JAVASCRIPT [THYMELEAF] * Element Tag Processors by [matching element and attribute name] [precedence]: [THYMELEAF] * [* {th:insert}] [100]: org.thymeleaf.standard.processor.StandardInsertTagProcessor [THYMELEAF] * [* {th:replace}] [100]: org.thymeleaf.standard.processor.StandardReplaceTagProcessor [THYMELEAF] * [* {th:each}] [200]: org.thymeleaf.standard.processor.StandardEachTagProcessor [THYMELEAF] * [* {th:switch}] [250]: org.thymeleaf.standard.processor.StandardSwitchTagProcessor [THYMELEAF] * [* {th:case}] [275]: org.thymeleaf.standard.processor.StandardCaseTagProcessor [THYMELEAF] * [* {th:if}] [300]: org.thymeleaf.standard.processor.StandardIfTagProcessor [THYMELEAF] * [* {th:unless}] [400]: org.thymeleaf.standard.processor.StandardUnlessTagProcessor [THYMELEAF] * [* {th:object}] [500]: org.thymeleaf.standard.processor.StandardObjectTagProcessor [THYMELEAF] * [* {th:with}] [600]: org.thymeleaf.standard.processor.StandardWithTagProcessor [THYMELEAF] * [* {th:inline}] [1000]: org.thymeleaf.standard.processor.StandardInlineTextualTagProcessor [THYMELEAF] * [* {th:text}] [1300]: org.thymeleaf.standard.processor.StandardTextTagProcessor [THYMELEAF] * [* {th:utext}] [1400]: org.thymeleaf.standard.processor.StandardUtextTagProcessor [THYMELEAF] * [* {th:assert}] [1550]: org.thymeleaf.standard.processor.StandardAssertTagProcessor [THYMELEAF] * [* {th:remove}] [1600]: org.thymeleaf.standard.processor.StandardRemoveTagProcessor [THYMELEAF] * [* 100000] [org.thymeleaf.standard.processor.StandardBlockTagProcessor]: {} [THYMELEAF] * [{th:block} *] [100000]: org.thymeleaf.standard.processor.StandardBlockTagProcessor [THYMELEAF] * Text Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningTextProcessor [THYMELEAF] * Processors for Template Mode: CSS [THYMELEAF] * Element Tag Processors by [matching element and attribute name] [precedence]: [THYMELEAF] * [* {th:insert}] [100]: org.thymeleaf.standard.processor.StandardInsertTagProcessor [THYMELEAF] * [* {th:replace}] [100]: org.thymeleaf.standard.processor.StandardReplaceTagProcessor [THYMELEAF] * [* {th:each}] [200]: org.thymeleaf.standard.processor.StandardEachTagProcessor [THYMELEAF] * [* {th:switch}] [250]: org.thymeleaf.standard.processor.StandardSwitchTagProcessor [THYMELEAF] * [* {th:case}] [275]: org.thymeleaf.standard.processor.StandardCaseTagProcessor [THYMELEAF] * [* {th:if}] [300]: org.thymeleaf.standard.processor.StandardIfTagProcessor [THYMELEAF] * [* {th:unless}] [400]: org.thymeleaf.standard.processor.StandardUnlessTagProcessor [THYMELEAF] * [* {th:object}] [500]: org.thymeleaf.standard.processor.StandardObjectTagProcessor [THYMELEAF] * [* {th:with}] [600]: org.thymeleaf.standard.processor.StandardWithTagProcessor [THYMELEAF] * [* {th:inline}] [1000]: org.thymeleaf.standard.processor.StandardInlineTextualTagProcessor [THYMELEAF] * [* {th:text}] [1300]: org.thymeleaf.standard.processor.StandardTextTagProcessor [THYMELEAF] * [* {th:utext}] [1400]: org.thymeleaf.standard.processor.StandardUtextTagProcessor [THYMELEAF] * [* {th:assert}] [1550]: org.thymeleaf.standard.processor.StandardAssertTagProcessor [THYMELEAF] * [* {th:remove}] [1600]: org.thymeleaf.standard.processor.StandardRemoveTagProcessor [THYMELEAF] * [* 100000] [org.thymeleaf.standard.processor.StandardBlockTagProcessor]: {} [THYMELEAF] * [{th:block} *] [100000]: org.thymeleaf.standard.processor.StandardBlockTagProcessor [THYMELEAF] * Text Processors by [precedence]: [THYMELEAF] * [1000]: org.thymeleaf.standard.processor.StandardInliningTextProcessor [THYMELEAF] * Expression Objects: [THYMELEAF] * #ctx [THYMELEAF] * #root [THYMELEAF] * #vars [THYMELEAF] * #object [THYMELEAF] * #locale [THYMELEAF] * #request [THYMELEAF] * #response [THYMELEAF] * #session [THYMELEAF] * #servletContext [THYMELEAF] * #conversions [THYMELEAF] * #uris [THYMELEAF] * #calendars [THYMELEAF] * #dates [THYMELEAF] * #bools [THYMELEAF] * #numbers [THYMELEAF] * #objects [THYMELEAF] * #strings [THYMELEAF] * #arrays [THYMELEAF] * #lists [THYMELEAF] * #sets [THYMELEAF] * #maps [THYMELEAF] * #aggregates [THYMELEAF] * #messages [THYMELEAF] * #ids [THYMELEAF] * #execInfo [THYMELEAF] * #httpServletRequest [THYMELEAF] * #httpSession [THYMELEAF] * Execution Attributes: [THYMELEAF] * "StandardExpressionParser": Standard Expression Parser [THYMELEAF] * "StandardJavaScriptSerializer": org.thymeleaf.standard.serializer.StandardJavaScriptSerializer@757277dc [THYMELEAF] * "StandardCSSSerializer": org.thymeleaf.standard.serializer.StandardCSSSerializer@687e99d8 [THYMELEAF] * "StandardVariableExpressionEvaluator": OGNL [THYMELEAF] * "StandardConversionService": org.thymeleaf.standard.expression.StandardConversionService@e4487af [THYMELEAF] TEMPLATE ENGINE CONFIGURED OK 15:25:00.922 [main] DEBUG org.thymeleaf.TemplateEngine - [THYMELEAF] TEMPLATE ENGINE INITIALIZED value + 哈哈 Process finished with exit code 0
-
Thymeleaf 模板引擎简介 与 Spring Boot 整合入门
2018-07-15 16:48:13Thymeleaf 模板引擎 官方文档下载 Hello World 新建应用 后台控制器 前端页面 浏览器访问测试 Thymeleaf 模板引擎 1、Thymeleaf 是 Web 和独立环境的现代服务器端 Java 模板引擎,能够处理HTML,XML,...目录
Thymeleaf 模板引擎
1、Thymeleaf 是 Web 和独立环境的现代服务器端 Java 模板引擎,能够处理HTML,XML,JavaScript,CSS 甚至纯文本。
2、Thymeleaf 的主要目标是提供一种优雅和高度可维护的创建模板的方式。为了实现这一点,它建立在自然模板的概念上,将其逻辑注入到模板文件中,不会影响模板被用作设计原型。这改善了设计的沟通,弥补了设计和开发团队之间的差距。
3、Thymeleaf 也从一开始就设计了Web标准 - 特别是 HTML5 - 允许您创建完全验证的模板,Spring Boot 官方推荐使用 thymeleaf 而不是 JSP。
4、Thymeleaf 官网:https://www.thymeleaf.org/
5、Thymeleaf 在 Github 的主页:https://github.com/thymeleaf/thymeleaf
6、Spring Boot 中使用 Thymeleaf 模板引擎时非常简单,因为 Spring Boot 已经提供了默认的配置,比如解析的文件前缀,文件后缀,文件编码,缓存等等,程序员需要的只是写 html 中的内容即可,可以参考《Spring Boot 引入 Thymeleaf 及入门》
模板引擎
1)市面上主流的 Java 模板引擎有:JSP、Velocity、Freemarker、Thymeleaf
2)JSP本质也是模板引擎,Spring Boot 官方支持:Thymeleaf Templates、FreeMarker Templates、Groovy Templates 等模板引擎。
3)模板引擎原理图如下,模板引擎的作用都是将模板(页面)和数据进行整合然后输出显示,区别在于不同的模板使用不同的语法,如 JSP 的 JSTL 表达式,以及 JSP 自己的表达式和语法,同理 Thymeleaf 也有自己的语法
官方文档下载
https://www.thymeleaf.org/documentation.html
Hello World 快速启动
1、新建 Spring Boot 项目,导入 thymeleaf 依赖:
<!-- 导入Spring Boot的thymeleaf依赖--> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf --> <!-- <version>2.2.7.RELEASE</version> --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
2、提供一个后台控制器如下,用于向前台传递参数(注:后台往前台传参和平时一样即可,Thymeleaf 没有严格要求):
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Map; /** * Created by Administrator on 2018/7/17 0017. * 用户控制器 */ @Controller public class UserController { /** * 全部基于 Spring Boot给 Thymeleaf的默认配置 * 所以下面会跳转到 classpath:/templates/home.html 页面 * * @param paramMap * @return */ @RequestMapping("home") public String goHome(Map<String, Object> paramMap) { /** 默认Map的内容会放大请求域中,页面可以直接使用Thymeleaf取值*/ paramMap.put("name", "张三"); paramMap.put("age", 35); return "home"; } }
3、前端页面使用 Thymeleaf 处理参数:
前端 .html 页面中的 <html> 标签可以加上 xmlns:th="http://www.thymeleaf.org" 属性,IDEA 编辑器就会有 Thymeleaf 语法提示,不写也不影响运行。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head lang="en"> <meta charset="UTF-8"> <title>主页</title> </head> <body> <h3>欢迎来到主页</h3> <!--Thymeleaf 语法取值--> 姓名:<span th:text="${name}">未知</span> 年龄:<span th:text="${age}">未知</span> </body> </html>
4、浏览器访问测试
1、对于Spring Boot关于 Thymeleaf 的渲染规则不清楚的,可以参考《Spring Boot 引入 Thymeleaf 及入门》
2、关于 Thmeleaf 的更多使用语法,以及深入内容可以参考《Thymeleaf》
-
Thymeleaf常见用法,Thymeleaf手册
2018-09-27 13:58:16Thymeleaf常见用法,Thymeleaf使用手册,基于官方手册翻译 -
Thymeleaf资料
2019-03-21 22:19:02介绍Thymeleaf的PPT,思维导图,还有一个整合了Thymeleaf的springBoot的简单示例。 -
【SpringBoot】三、SpringBoot中整合Thymeleaf模板引擎
2020-04-16 21:41:09SpringBoot 为我们提供了 Thymeleaf 自动化配置解决方案,所以我们在 SpringBoot 中使用 Thymeleaf 非常方便 一、简介 Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨...SpringBoot 为我们提供了 Thymeleaf 自动化配置解决方案,所以我们在 SpringBoot 中使用 Thymeleaf 非常方便
一、简介
Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#、PHP语言体系下也有模板引擎。除了thymeleaf之外还有Velocity、FreeMarker等模板引擎,功能类似。
Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。使用thymeleaf创建的html模板可以在浏览器里面直接打开(展示静态数据),这有利于前后端分离。需要注意的是thymeleaf不是spring旗下的。二、整合
- 1、引入 thymeleaf,在 pom.xml 文件中加入:
<!-- thymeleaf 模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- web 开发 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
由于 SpringBoot 为 thymeleaf 提供了一整套的自动化配置方案,使得我们几乎不需要做任何更改就可以直接使用了
- 2、SpringBoot 中 thymeleaf 默认配置
@ConfigurationProperties(prefix = "spring.thymeleaf") public class ThymeleafProperties { private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8; public static final String DEFAULT_PREFIX = "classpath:/templates/"; public static final String DEFAULT_SUFFIX = ".html"; /** * Whether to check that the template exists before rendering it. */ private boolean checkTemplate = true; /** * Whether to check that the templates location exists. */ private boolean checkTemplateLocation = true; /** * Prefix that gets prepended to view names when building a URL. */ private String prefix = DEFAULT_PREFIX; /** * Suffix that gets appended to view names when building a URL. */ private String suffix = DEFAULT_SUFFIX; /** * Template mode to be applied to templates. See also Thymeleaf's TemplateMode enum. */ private String mode = "HTML"; ... }
通过 org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties 找到 SpringBoot 中 thymeleaf 的默认配置,我们不难看出
默认编码格式:UTF-8
默认路径:classpath:/templates/,都放在根目录下的 templates 目录下
默认后缀:.html,thymeleaf 都是 html 文件
检查模板:默认开启
检查模板位置:默认开启
…从上述源码可以看出,我们的 thymeleaf 模板文件默认放在 resources/templates 目录下,默认的后缀是 .html
当然,我们不想使用默认配置,我们也可以在 application.tml 文件中以 spring.thymeleaf 开始个性配置例如:
spring: # thymeleaf模板引擎配置 thymeleaf: # 缓存 cache: false # 编码格式 encoding: UTF-8
我们在开发中,可能被缓存坑过很多次,我们可以将 thymeleaf 中的缓存给关闭,保持实时更新
三、开发
- 1、创建控制层 IndexController.java
@Controller public class IndexController { /** * 请求 index 页面 * @return */ @GetMapping("index") public ModelAndView index() { ModelAndView mav = new ModelAndView("index"); mav.addObject("title", "首页"); List<UserInfo> list = new ArrayList<>(); UserInfo user = null; for (int i = 0; i < 10; i++) { user = new UserInfo(); user.setId(i + 1); user.setNickName("user" + i); user.setSignature("SpringBoot真香,+" + (i + 1)); list.add(user); } mav.addObject("users", list); return mav; } }
我们创建了 IndexController,请求 index 返回 index.html 页面,
- 2、创建 thymeleaf 模板 index.html
下面我们在 resources/templates 目录下创建 index.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title th:text="${title}"></title> </head> <body> <table border="1"> <tr> <td>用户编号</td> <td>用户昵称</td> <td>个性签名</td> </tr> <tr th:each="item : ${list}"> <td th:text="${item.id}"></td> <td th:text="${item.nickName}"></td> <td th:text="${item.signature}"></td> </tr> </table> </body> </html>
注意:
xmlns=“http://www.w3.org/1999/xhtml” xmlns:th=“http://www.thymeleaf.org”,是必须要在 html 标签中写入的
xmlns 是xml namespace的缩写,也就是 XML 命名空间
xmlns 属性可以在文档中定义一个或多个可供选择的命名空间
该属性可以放置在文档内任何元素的开始标签中
该属性的值类似于URL,它定义了一个命名空间,浏览器会将此命名空间用于该属性所在元素内的所有内容我们在 ModelAndView 中传入了 title 参数,使用 th:text="${title}" 给 title 标签赋值,与 JSTL 使用方式类似,效果如图:
我们还通过 th:each=“item : ${list}” 渲染了一个用户表格,如图:
- 3、拼接 URL
<a th:href="@{/user/info(id=${user.id})}">参数拼接</a> <a th:href="@{/user/info(id=${user.id},phone=${user.phone})}">多参数拼接</a> <a th:href="@{/user/info/{uid}(uid=${user.id})}">RESTful风格</a> <a th:href="@{/user/info/{uid}/abc(uid=${user.id})}">RESTful风格</a>
四、使用技巧
thymeleaf 在 JavaScript 中的使用技巧
- 1、开发前戏
<script type="text/javascript" th:inline="javascript"> ... </script>
我们需要在 script 标签中写入 th:inline=“javascript”,注明使用 thymeleaf 的内联方法
- 2、Ajax 路径问题
url: /*[[@{/user/saveUser}]]*/, data: { 'user': user } type: 'post', dataType: 'json',
我们使用 /[[@{/**}]]/ 来获取项目的上下文路径,访问项目
- 3、获取 model 中的数据
<script type="text/javascript" th:inline="javascript"> var userName = [[${user.name}]]; </script>
- 4、使用前端框架的 iframe 弹窗,例如 layui
function showUserInfo() { layer.open({ type: 2, title: '用户信息', shade: 0.2, area: ['600px', '450px'], offset: '100px', shadeClose: false, content: /*[[@{/user/getUserInfo}]]*/ }); }
需要传参:
layer.open({ type: 2, title: '用户信息', shade: 0.2, area: ['600px', '450px'], offset: '100px', shadeClose: false, content: [[@{/user/getUserInfo}]]+'?id='+id });
我们在路径中传入了用户的 id
- 5、时间格式化
<span th:text="${#dates.format(data.createTime, 'yyyy年MM月dd日')}"></span>
<span th:text="${#dates.format(data.createTime, 'yyyy-MM-dd HH:mm:ss')}"></span>
- 6、解析 HTML 内容
<div th:utext="${data.content}"></div>
- 7、动态设置背景图片
<body th:style="'background: url('+@{/pages/login/backgroud.jpg}+') no-repeat center'"></body>
五、手动渲染
我们在发送邮件的时候,会需要使用到邮件模板,我们选择手动渲染即可
- 1、新建一个邮件模板 email.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>欢迎加入我们</title> </head> <body> <h1 style="text-align: center">入职欢迎</h1> <p><span th:text="${user.name}"></span>:你好!!!欢迎加我们XXX公司,你的入职信息如下:</p> <p>岗位:<span th:text="${user.job}"></span></p> <p>月薪:<span th:text="${user.wages}"></span></p> </body> </html>
- 2、发送邮件测试
@Autowired TemplateEngine templateEngine; @Test public void test1() throws MessagingException { Context context = new Context(); context.setVariable("name", "张三"); context.setVariable("job", "Java开发工程师"); context.setVariable("wages", 7800); String mail = templateEngine.process("email", context); emailUtils.sendHtmlMail("xxxxxxxxx@qq.com", "入职通知", mail); }
SpringBoot 中发送邮件的教程请看:SpringBoot中发送邮件
- 3、效果展示
最终,我们收到如下邮件:
总结
Spring Boot 针对 Thymeleaf 提供了一整套的自动化配置方案,这对我们在 SpringBoot 中使用 Thymeleaf 更加方便,SpringBoot 为我们提供了默认配置,我们也可以对其进行个性化配置
以上就是我们在学习 SpringBoot 整合 Thymeleaf 时的一些知识点,更多内容请访问:Thymeleaf 官方文档
Thymeleaf 的官方文档:https://www.thymeleaf.org
如您在阅读中发现不足,欢迎留言!!!
-
thymeleaf --------- To learn more and download latest version: http://www.thymeleaf.org
-
thymeleaf th:if 判断表达式
2018-01-13 16:36:42thymeleaf 判断表达式注意: gt:great than(大于)> ge:great equal(大于等于)>= eq:equal(等于)== lt:less than(小于)< le:less equal(小于等于)<= ne:not equal... -
六 Thymeleaf
2020-09-25 09:14:11thymeleaf介绍 Springboot整合thymeleaf 修改Thymeleaf默认的前缀后缀 -
thymeleaf 遍历
2020-08-09 09:57:21thymeleaf遍历 -
thymeleaf 日志
2020-08-12 16:11:56thymeleaf日志 -
thymeleaf 注释
2020-08-12 10:19:09thymeleaf注释 -
using thymeleaf.pdf
2020-09-22 21:02:02thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用 -
thymeleaf-spring:用于Spring的Thymeleaf集成模块-源码
2021-02-03 19:31:38thymeleaf-spring:用于Spring的Thymeleaf集成模块 -
thymeleaf.zip
2020-02-07 18:52:53Thymeleaf简介 Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 -HTML可以在浏览器中正确显示,也可以作为静态原型工作,从而可以在... -
thymeleaf使用文档
2018-06-06 15:52:56thymeleaf官方使用文档,thymeleaf官方使用文档,thymeleaf官方使用文档 -
Thymeleaf使用
2020-09-22 17:39:19文档地址:https://raledong.gitbooks.io/using-thymeleaf/content/ 官网地址:https://www.thymeleaf.org/ thymeleaf在github的地址:https://github.com/thymeleaf/thymeleaf -
thymeleaf文档_SpringBoot集成Thymeleaf
2020-12-10 14:36:33而在这些前端模板引擎中,SpringBoot首推使用Thymeleaf。这是因为Thymeleaf对SpringMVC提供了完美的支持。Thymeleaf简介Thymeleaf同样是一个Java类库,能够处理HTML/HTML5、XML、JavaScript、CSS,甚⾄纯⽂本。通常... -
thymeleaf documentation
2019-09-19 14:24:32thymeleaf 的API: http://www.thymeleaf.org/apidocs/thymeleaf/2.0.12/org/thymeleaf/expression/Aggregates.html thymeleaf 的参考文档: http://www.thymeleaf... -
thymeleaf获取id值_Thymeleaf
2020-12-26 00:32:03Thymeleaf是一个模板引擎,主要用于HTML,也可以用在XML,JavaScript,CSS甚⾄纯⽂本等。Thymeleaf模板引擎可以使html文件达到类似jsp(jsp运行时需要转成...在spring boot中使用Thymeleaf的主要作用:可以直接访问... -
thymeleaf依赖
2020-04-09 17:10:37<dependency>...org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras<... -
eclipse thymeleaf插件
2018-02-22 09:14:24eclipse的thymeleaf插件 用于编写thymeleaf时候代码提示 -
Eclipse Thymeleaf 插件
2017-11-06 15:53:07Eclipse Spring Tool Suite Thymeleaf 插件 Thymeleaf 代码提示 -
thymeleaf教程
2018-09-16 13:48:19thymeleaf的定义 spring boot整合 thymeleaf语法参考文档 thymeleaf笔记 thymeleaf比jsp好在哪 thymeleaf简单文件 thymeleaf配置 application.properties thymeleaf url thymeleaf表达式 themeleaf包含 footer ...