Thymeleaf学习

Thymeleaf学习

一、Thymeleaf介绍

Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP

二、Thymeleaf特点

  1. 动静结合

    • Thymeleaf 在有网络和无网络的环境下皆可运行
    • 它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果
    • 这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式
    • 浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;
    • 当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
  2. 开箱即用

    • 它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果
    • ,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
  3. 多方言支持

    • Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,
    • 可以快速的实现表单绑定、属性编辑器、国际化等功能。
  4. 与SpringBoot完美整合

    • 与SpringBoot完美整合,SpringBoot提供了Thymeleaf的默认配置,
    • 并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。

三、添加maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

四、创建模板文件夹

  1. SpringBoot会自动为Thymeleaf注册一个视图解析器ThymeleafViewResolver
  2. 还配置了模板文件(html)的位置,与jsp类似的前缀+ 视图名 + 后缀风格:
  3. 与解析JSP的InternalViewResolver类似,Thymeleaf也会根据前缀和后缀来确定模板文件的位置:前缀:classpath:/templates/ 后缀:.html
  4. 在配置文件中 配置缓存,编码

五、基本使用

  1. 引入名称空间

    • <html lang="en" xmlns:th="http://www.thymeleaf.org">
  2. 表达式

    • ${}:变量表达式
    • *{} :选择变量表达式
    • {...} : Message 表达式

  3. URL

    • 绝对网站

      • 绝对URL用于创建到其他服务器的链接,它们需要指定一个协议名称(http://或https://)开头

      • <a th:href="@{https://www.campsis-tk.top/}"> 
        
    • 上下文相关url

      • 与Web应用程序根相关联URL

      • <a th:href="@{/hello}">跳转</a>
        
    • 与服务器相关url

      • 服务器相关的URL与上下文相关的URL非常相似

      • <a th:href="@{~/hello}">跳转</a>
        
    • 携带参数

      • <a th:href="@{/hero/detail(id=3,action='show')}">aa</a>
        
  4. 字面值

    • 有的时候,我们需要在指令中填写基本类型如:字符串、数值、布尔等,并不希望被Thymeleaf解析为变量,这个时候称为字面值。

    • 字符串字面值

      • <p>
            内容:<span th:text="'Demo'+1">template</span>
        </p>
        
    • 数字字面值

      • <p>
            内容:<span th:text="2+1">template</span>
        </p>
        
    • 布尔字面值

      • 布尔类型的字面值是true或false
  5. 拼接

    • 普通字符串与表达式拼接的情况

      • <span th:text="'欢迎您:' + ${person.name} + '!'"></span>
        
    • 字符串字面值需要用'',拼接起来非常麻烦,Thymeleaf对此进行了简化,使用一对|即可

      • <span th:text="|欢迎您:${person.name}!|"></span>
        
  6. 运算符

    • 算术操作符

      加(+)、减(-)、乘(*)、除(/)、取余(%)

    • 比较运算

      1. 大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)
      2. 但是大于(>)、小于(<)不能直接使用,因为xml会解析为标签
      3. 大于(gt)、小于(lt)、大于或等于(ge)、小于或等于(le)
    • 三元运算

      • <span th:text="${true}?'男':'女'"></span>
        
  7. 内联写法

    • <span>sapn标签([(${person.name})])</span>
      
    • <span>sapn标签[[${person.name}]]</span>
      
  8. 局部变量

    • <div th:with="person = ${allPerson[0]}">
          <h1 th:text="${person.name}"></h1>
          <h1 th:text="${person.age}"></h1>
          <h1 th:text="${person.sex}"></h1>
      </div>
      
  9. 判断

    • th:if

      • <h1 th:if="${1 lt 2}">Hello</h1>
        
    • th:unless

      • <h1 th:unless="1 gt 2">Hello</h1>
        
    • th:switch

      • <div th:switch="1">
            <p th:case="1">Tk</p>
            <p th:case="*">*</p>
        </div>
        
  10. 迭代

    • <table>
          <tr th:each="person:${allPerson[0]}">
              <td th:text="${person.name}"></td>
          </tr>
      </table>
      
    • <table>
          <tr th:each="person,stat:${allPerson[0]}">
              <td th:text="${stat.index}"></td>
              <td th:text="${person.name}"></td>
          </tr>
      </table>
      
    • stat对象包含以下属性

      1. index,从0开始的角标
      2. count,元素的个数,从1开始
      3. size,总元素个数
      4. current,当前遍历到的元素
      5. even/odd,返回是否为奇偶,boolean值
      6. first/last,返回是否为第一或最后,boolean值
  11. 内置对象

    • 环境相关对象

      1. ${#ctx} 上下文对象,可用于获取其它内置对象。
      2. ${#vars}: 上下文变量。
      3. ${#locale}:上下文区域设置。
      4. ${#request}: HttpServletRequest对象。
      5. ${#response}: HttpServletResponse对象。
      6. ${#session}: HttpSession对象。
      7. ${#servletContext}: ServletContext对象。
    • 全局对象功能

      1. strings:字符串工具类

      2. lists:List 工具类

      3. arrays:数组工具类

      4. sets:Set 工具类

      5. maps:常用Map方法。

      6. objects:一般对象类,通常用来判断非空

      7. bools:常用的布尔方法。

      8. execInfo:获取页面模板的处理信息。

      9. messages:在变量表达式中获取外部消息的方法,与使用#{...}语法获取的方法相同。

      10. uris:转义部分URL / URI的方法。

      11. conversions:用于执行已配置的转换服务的方法。

      12. dates:时间操作和时间格式化等。

      13. calendars:用于更复杂时间的格式化。

      14. numbers:格式化数字对象的方法。

      15. aggregates:在数组或集合上创建聚合的方法。

      16. ids:处理可能重复的id属性的方法。

    • 示例

      1. ${#strings.abbreviate(str,10)} str截取0-10位,后面的全部用…这个点代替,注意,最小是3位

      2. ${#strings.toUpperCase(name)}

      3. 判断是不是为空:null: 
        
        <span th:if="${name} != null">不为空</span> 
        
        <span th:if="${name1} == null">为空</span> 
        
        判断是不是为空字符串: “” 
        
        <span th:if="${#strings.isEmpty(name1)}">空的</span>
        
        判断是否相同: 
        
        <span th:if="${name} eq 'jack'">相同于jack,</span> 
        
        <span th:if="${name} eq 'ywj'">相同于ywj,</span> 
        
        <span th:if="${name} ne 'jack'">不相同于jack,</span>
        
         
        
        不存在设置默认值: 
        
        <span th:text="${name2} ?: '默认值'"></span> 
        
        是否包含(分大小写): 
        
        <span th:if="${#strings.contains(name,'ez')}">包ez</span> 
        
        <span th:if="${#strings.contains(name,'y')}">包j</span> 
        
        是否包含(不分大小写) 
        
        <spanth:if="${#strings.containsIgnoreCase(name,'y')}">包</span> 
        
        ${#strings.startsWith(name,'o')} 
        
        ${#strings.endsWith(name, 'o')} 
        
        ${#strings.indexOf(name,frag)}// 下标 
        
        ${#strings.substring(name,3,5)}// 截取 
        
        ${#strings.substringAfter(name,prefix)}// 从 prefix之后的一位开始截取到最后,比如 (ywj,y) = wj, 如果是(abccdefg,c) = cdefg//里面有2个c,取的是第一个c 
        
        ${#strings.substringBefore(name,suffix)}// 同上,不过是往前截取 
        
        ${#strings.replace(name,'las','ler')}// 替换 
        
        ${#strings.prepend(str,prefix)}// 拼字字符串在str前面 
        
        ${#strings.append(str,suffix)}// 和上面相反,接在后面 
        
        ${#strings.toUpperCase(name)} 
        
        ${#strings.toLowerCase(name)} 
        
        ${#strings.trim(str)} 
        
        ${#strings.length(str)} 
        
        ${#strings.abbreviate(str,10)}//  str截取0-10位,后面的全部用…这个点代替,注意,最小是3位
        
  12. 布局

    • 方式1

      • <nav th:fragment="header">
          <h1>网页头部</h1>
        </nav>
        
      • <div th:include="common/base::header"></div>
        
    • 方式2

  * ~~~html
    <nav th:fragment="footer">
      <h1>网页尾部</h1>
    </nav>
    ~~~

  * ~~~html
    <div th:insert="~{common/base::#footer}"></div>
    ~~~

* 引入方式

  > 1. th:insert
  >    + 将公共的标签及内容插入到指定标签当中
  > 2. th:replace
  >    + 将公共的标签替换指定的标签
  > 3. th:include
  >    + 将公共标签的内容包含到指定标签当中

* 传值

  * ~~~html
    <div th:include="common/base::header(active='header')"></div>
    <h1 class="active"></h1>
    <div th:include="common/base::#header(active='footer')"></div>
    ~~~

  * ~~~html
    <nav th:fragment="header">
      <h1 th:class="${active=="header"?'active':''}">头部</h1>
    </nav>
    ~~~
  1. js模板

    1. <script th:inline="javascript">
       var name = /*[[${person.name}]]*/;
          console.log(name);
      </script>
      
    2. 模板引擎不仅可以渲染html,也可以对JS中的进行预处理。而且为了在纯静态环境下可以运行

    3. 在script标签中通过th:inline="javascript"来声明这是要特殊处理的js脚本

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容