精华内容
参与话题
问答
  • Thymeleaf

    2020-04-18 14:46:31
    文章目录Thymeleaf快速入门1.为什么是Thymeleaf?2.提供数据3.引入启动器4.静态页面测试6.模板缓存 Thymeleaf快速入门 SpringBoot并不推荐使用jsp,但是支持一些模板引擎技术: 1.为什么是Thymeleaf? 简单说, ...


    Thymeleaf快速入门

    SpringBoot并不推荐使用jsp,但是支持一些模板引擎技术:
    在这里插入图片描述

    1.为什么是Thymeleaf?

    简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较于其他的模板引擎,它有如下四个极吸引人的特点:

    • 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
    • 开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
    • 多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
    • 与SpringBoot完美整合,SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。

    接下来,我们就通过入门案例来体会Thymeleaf的魅力:

    2.提供数据

    编写一个controller方法,返回一些用户数据,放入模型中,将来在页面渲染

    @GetMapping("/list")
    public String all(ModelMap model) {
        // 查询用户
        List<User> users = this.userService.queryAll();
        // 放入模型
        model.addAttribute("users", users);
        // 返回模板名称(就是classpath:/templates/目录下的html文件名)
        return "users";
    }
    

    3.引入启动器

    直接引入启动器:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        //springboot默认导入的是2.1.6版本
    </dependency>
    切换thymeleaf为3.0.9版本
    <properties>
        <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
        <!‐‐ 布局功能的支持程序 thymeleaf3主程序 layout2以上版本 ‐‐>
        <!‐‐ thymeleaf2 layout1   选择正确的设配包‐‐>
        <thymeleaf‐layout‐dialect.version>2.2.2</thymeleaf‐layout‐dialect.version>
    </properties>
    

    SpringBoot会自动为Thymeleaf注册一个视图解析器:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmo7YhEn-1587188377446)(assets/1528133744136.png)]

    与解析JSP的InternalViewResolver类似,Thymeleaf也会根据前缀和后缀来确定模板文件的位置:

    在这里插入图片描述

    • 默认前缀:classpath:/templates/
    • 默认后缀:.html

    所以如果我们返回视图:users,会指向到 classpath:/templates/users.html

    一般我们无需进行修改,默认即可。

    4.静态页面

    根据上面的文档介绍,模板默认放在classpath下的templates文件夹,我们新建一个html文件放入其中:
    在这里插入图片描述

    编写html模板,渲染模型中的数据:

    注意,把html 的名称空间,改成:xmlns:th="http://www.thymeleaf.org" 会有语法提示

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
        <style type="text/css">
            table {border-collapse: collapse; font-size: 14px; width: 80%; margin: auto}
            table, th, td {border: 1px solid darkslategray;padding: 10px}
        </style>
    </head>
    <body>
    <div style="text-align: center">
        <span style="color: darkslategray; font-size: 30px">欢迎光临!</span>
        <hr/>
        <table class="list">
            <tr>
                <th>id</th>
                <th>姓名</th>
                <th>用户名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>生日</th>
            </tr>
            <tr th:each="user : ${users}">
                <td th:text="${user.id}">1</td>
                <td th:text="${user.name}">张三</td>
                <td th:text="${user.userName}">zhangsan</td>
                <td th:text="${user.age}">20</td>
                <td th:text="${user.sex}"></td>
                <td th:text="${user.birthday}">1980-02-30</td>
            </tr>
        </table>
    </div>
    </body>
    </html>
    

    我们看到这里使用了以下语法:

    • ${} :这个类似与el表达式,但其实是ognl的语法,比el表达式更加强大
    • th-指令:th-是利用了Html5中的自定义属性来实现的。如果不支持H5,可以用data-th-来代替
      • th:each:类似于c:foreach 遍历集合,但是语法更加简洁
      • th:text:声明标签中的文本
        • 例如<td th-text='${user.id}'>1</td>,如果user.id有值,会覆盖默认的1
        • 如果没有值,则会显示td中默认的1。这正是thymeleaf能够动静结合的原因,模板解析失败不影响页面的显示效果,因为会显示默认值!

    测试

    接下来,我们打开页面测试一下:
    在这里插入图片描述

    6.模板缓存

    Thymeleaf会在第一次对模板解析之后进行缓存,极大的提高了并发处理能力。但是这给我们开发带来了不便,修改页面后并不会立刻看到效果,我们开发阶段可以关掉缓存使用:

    # 开发阶段关闭thymeleaf的模板缓存
    spring.thymeleaf.cache=false
    

    注意

    在Idea中,我们需要在修改页面后按快捷键:`Ctrl + Shift + F9` 对项目进行rebuild才可以。
    
    eclipse中没有测试过。
    

    我们可以修改页面,测试一下。

    Thymeleaf整合Bootstrap

    • pom.xml
    <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
            <!-- 布局功能的支持程序  thymeleaf3主程序  layout2以上版本 -->
            <!-- thymeleaf2   layout1-->
            <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
        </properties>
    
    
    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <!--引入jquery-webjar-->
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>jquery</artifactId>
                <version>3.3.1</version>
            </dependency>
    
            <!--引入bootstrap-->
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>bootstrap</artifactId>
                <version>4.0.0</version>
            </dependency>
    

    在这里插入图片描述

    • SpringBoot对静态资源的映射规则
      在这里插入图片描述
      index.html
    <!DOCTYPE html>
    <html lang="en"  xmlns:th="http://www.thymeleaf.org">
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    		<meta name="description" content="">
    		<meta name="author" content="">
    		<title>Signin Template for Bootstrap</title>
    		<!-- Bootstrap core CSS -->
    		 <!-- 公共资源用/webjars引入 自己的资源引入asserts-->
    		<link href="asserts/css/bootstrap.min.css" th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}" rel="stylesheet">
    		<!-- Custom styles for this template -->
    		<link href="asserts/css/signin.css" th:href="@{/asserts/css/signin.css}" rel="stylesheet">
    	</head>
    	<body class="text-center">
    		<form class="form-signin" action="dashboard.html" th:action="@{/user/login}" method="post">
    			<img class="mb-4" th:src="@{/asserts/img/bootstrap-solid.svg}" src="asserts/img/bootstrap-solid.svg" alt="" width="72" height="72">
    			<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
    			<!--判断-->
    			<p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
    			<label class="sr-only" th:text="#{login.username}">Username</label>
    			<input type="text"  name="username" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">
    			<label class="sr-only" th:text="#{login.password}">Password</label>
    			<input type="password" name="password" class="form-control" placeholder="Password" th:placeholder="#{login.password}" required="">
    			<div class="checkbox mb-3">
    				<label>
              			<input type="checkbox" value="remember-me"/> [[#{login.remember}]]
            		</label>
    			</div>
    			<button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.btn}">Sign in</button>
    			<p class="mt-5 mb-3 text-muted">© 2020-2021</p>
    			<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
    			<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
    		</form>
    	</body>
    
    </html>
    

    参考

    Spring Boot 模板引擎 Thymeleaf

    展开全文
  • thymeleaf

    2018-05-15 15:18:59
    thymeleaf TEXT MODEpublic class ThymeTemplate { private ThymeTemplate(){ } public static String merge(Map&lt;String,Object&gt; 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:13
    Thymeleaf 模板引擎 官方文档下载 Hello World 新建应用 后台控制器 前端页面 浏览器访问测试 Thymeleaf 模板引擎 1、Thymeleaf 是 Web 和独立环境的现代服务器端 Java 模板引擎,能够处理HTML,XML,...

    目录

    Thymeleaf 模板引擎

    官方文档下载

    Hello World 快速启动


    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资料

    2019-03-21 22:19:02
    介绍Thymeleaf的PPT,思维导图,还有一个整合了Thymeleaf的springBoot的简单示例。
  • thymeleaf --------- To learn more and download latest version: http://www.thymeleaf.org
  • 【SpringBoot】三、SpringBoot中整合Thymeleaf

    万次阅读 多人点赞 2020-04-16 21:41:09
    SpringBoot 为我们提供了 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 使用方式类似,效果如图:
    title效果展示
    我们还通过 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 遍历

    2020-08-09 09:57:21
    thymeleaf遍历
  • thymeleaf 缓存

    2020-08-12 16:37:04
    thymeleaf缓存
  • thymeleaf 注释

    2020-08-12 10:19:09
    thymeleaf注释
  • using thymeleaf.pdf

    2020-09-22 21:02:02
    thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用thymeleaf的使用
  • thymeleaf.zip

    2020-02-07 18:52:53
    Thymeleaf简介 Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 -HTML可以在浏览器中正确显示,也可以作为静态原型工作,从而可以在...
  • thymeleaf使用文档

    2018-06-06 15:52:56
    thymeleaf官方使用文档,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
  • 而在这些前端模板引擎中,SpringBoot首推使用Thymeleaf。这是因为Thymeleaf对SpringMVC提供了完美的支持。Thymeleaf简介Thymeleaf同样是一个Java类库,能够处理HTML/HTML5、XML、JavaScript、CSS,甚⾄纯⽂本。通常...
  • thymeleaf documentation

    2019-09-19 14:24:32
    thymeleaf 的API: http://www.thymeleaf.org/apidocs/thymeleaf/2.0.12/org/thymeleaf/expression/Aggregates.html thymeleaf 的参考文档: http://www.thymeleaf...
  • Thymeleaf入门

    2019-08-13 22:02:08
    文章目录Thymeleaf简介Thymeleaf相关网页Thymeleaf使用导包原理语法示例练习一练习二Thymeleaf总结 Thymeleaf简介 Thymeleaf是一种用于Web和独立环境的现代服务器端的Java模板引擎。 Thymeleaf的主要目标是将优雅的...
  • eclipse thymeleaf插件

    2018-02-22 09:14:24
    eclipse的thymeleaf插件 用于编写thymeleaf时候代码提示
  • thymeleaf教程

    千次阅读 2018-09-16 13:48:19
    thymeleaf的定义 spring boot整合 thymeleaf语法参考文档 thymeleaf笔记 thymeleaf比jsp好在哪 thymeleaf简单文件 thymeleaf配置 application.properties thymeleaf url thymeleaf表达式 themeleaf包含 footer ...
  • 02thymeleaf

    2019-09-21 09:55:38
    常用的有jsp,freemarker,Thymeleaf spring boot 默认不支持jsp 思想 Thymeleaf 引入 org.springframework.boot spring-boot-starter-thymeleaf 版本替换 修改thymeleaf 注意布局版本对应 thymeleaf ...
  • Eclipse Thymeleaf 插件

    2017-11-06 15:53:07
    Eclipse Spring Tool Suite Thymeleaf 插件 Thymeleaf 代码提示
  • Thymeleaf简介

    2020-06-05 17:07:01
    Thymeleaf简介 Thymeleaf简介 Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#、PHP语言体系下也有模板引擎。除了...
  • Thymeleaf 入门

    2019-08-20 08:19:55
    Thymeleaf配置: spring.thymeleaf.mode=LEGACYHTML5 spring.thymeleaf.cache=false spring.thymeleaf.prefix=classpath:/static/ spring.thymeleaf.suffix=.html spring默认的模板映射路径是:src/...
  • thymeleaf依赖

    千次阅读 2020-04-09 17:10:37
    <dependency>...org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras<...
  • JAVA - Thymeleaf

    万次阅读 2020-07-27 22:24:30
    spring 集成了 Thymeleaf 模板引擎,本文对此作些许介绍 方言 Thymeleaf 提供了灵活接口,允许使用方定制自己的方言。因此在自定义方言之前,有必要先了解标准方言。 标准表达式 ${…} : 变量表达式. *{…} : 区域...

空空如也

1 2 3 4 5 ... 20
收藏数 32,285
精华内容 12,914
关键字:

thymeleaf