Thymeleaf完全手册

thymeleaf介绍

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

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

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

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

标准表达式语法

它们分为四类:

1.变量表达式

2.选择或星号表达式

3.文字国际化表达式

4.URL表达式

变量表达式

变量表达式即OGNL表达式或Spring EL表达式(在Spring术语中也叫model attributes)。如下所示:

${session.user.name}

它们将以HTML标签的一个属性来表示:

  • 选择(星号)表达式

    选择表达式很像变量表达式,不过它们用一个预先选择的对象来代替上下文变量容器(map)来执行,如下:

    *{customer.name}

    被指定的object由th:object属性定义:

      ...  
    
      ...  
    
      ...  
    
    

    文字国际化表达式

    文字国际化表达式允许我们从一个外部文件获取区域文字信息(.properties),用Key索引Value,还可以提供一组参数(可选).

    {main.title}

    {message.entrycreated(${entryId})}

    可以在模板文件中找到这样的表达式代码:

      ...  
    
      
    ...
    ... ...

    URL表达式

    URL表达式指的是把一个有用的上下文或回话信息添加到URL,这个过程经常被叫做URL重写。

    @{/order/list}

    URL还可以设置参数:

    @{/order/details(id=${orderId})}

    相对路径:

    @{../documents/report}

    让我们看这些表达式:

    
    

    变量表达式和星号表达有什么区别吗?

    如果不考虑上下文的情况下,两者没有区别;星号语法评估在选定对象上表达,而不是整个上下文

    什么是选定对象?就是父标签的值,如下:

    Name: Sebastian.

    Surname: Pepper.

    Nationality: Saturn.

    这是完全等价于:

      

    Name: Sebastian.

    Surname: Pepper.

    Nationality: Saturn.

    当然,美元符号和星号语法可以混合使用:

      

    Name: Sebastian.

    Surname: Pepper.

    Nationality: Saturn.

    表达式支持的语法

    字面(Literals)

    文本文字(Text literals): 'one text', 'Another one!',…

    数字文本(Number literals): 0, 34, 3.0, 12.3,…

    布尔文本(Boolean literals): true, false

    空(Null literal): null

    文字标记(Literal tokens): one, sometext, main,…

    文本操作(Text operations)

    字符串连接(String concatenation): +

    文本替换(Literal substitutions): |The name is ${name}|

    算术运算(Arithmetic operations)

    二元运算符(Binary operators): +, -, *, /, %

    减号(单目运算符)Minus sign (unary operator): -

    布尔操作(Boolean operations)

    二元运算符(Binary operators):and, or

    布尔否定(一元运算符)Boolean negation (unary operator):!, not

    比较和等价(Comparisons and equality)

    比较(Comparators): >, <, >=, <= (gt, lt, ge, le)

    等值运算符(Equality operators):==, != (eq, ne)

    条件运算符(Conditional operators)

    If-then: (if) ? (then)

    If-then-else: (if) ? (then) : (else)

    Default: (value) ?: (defaultvalue)

    所有这些特征可以被组合并嵌套:

    'User is of type ' + ({user.type} ?: 'Unknown'))

    常用th标签都有那些?


    | 关键字 | 功能介绍 | 案例 |
    | th:id | 替换id | description

    |
    | th:utext | 支持html的文本替换 |

    |
    | th:value | 属性赋值 |

  • |
    | th:style | 设置样式 | th:style="'display:' + @{({users}"> |
    | th:if | 判断条件 |
    |
    | th:case | th:switch的一个分支 |

    User is an administrator

    |
    | th:fragment | 布局标签,定义一个代码片段,方便其它地方引用 |
    |
    | th:include | 布局标签,替换内容到引入的文件 | /> |
    | th:replace | 布局标签,替换整个标签到引入的文件 |
    |
    | th:selected | selected选择框 选中 | th:selected="({configObj.dd})" |
    | th:src | 图片类地址引入 | App Logo |
    | th:inline | 定义js脚本可以使用变量 |

    js附加代码:

    /*[+

    var msg = 'This is a working application';

    +]*/

    js移除代码:

    /*[- */

    var msg = 'This is a non-working template';

    /* -]*/

    使用thymeleaf布局

    使用thymeleaf布局非常的方便

    定义代码片段

    © 2016

    在页面任何地方引入:

    th:include 和 th:replace区别,include只是加载,replace是替换

    返回的HTML如下:

    © 2016

    © 2016

    下面是一个常用的后台页面布局,将整个页面分为头部,尾部、菜单栏、隐藏栏,点击菜单只改变content区域的页面

    任何页面想使用这样的布局值只需要替换中见的 content模块即可

      
    ...

    也可以在引用模版的时候传参

    layout 是文件地址,如果有文件夹可以这样写 fileName/layout:htmlhead

    htmlhead 是指定义的代码片段 如 th:fragment=“copy"

    内嵌变量

    日期格式、组件提取等.

    ${#dates.format(date)}

    ${#dates.arrayFormat(datesArray)}

    ${#dates.listFormat(datesList)}

    ${#dates.setFormat(datesSet)}

    ${#dates.format(date, 'dd/MMM/yyyy HH:mm')}

    ${#dates.arrayFormat(datesArray, 'dd/MMM/yyyy HH:mm')}

    ${#dates.listFormat(datesList, 'dd/MMM/yyyy HH:mm')}

    ${#dates.setFormat(datesSet, 'dd/MMM/yyyy HH:mm')}

    {#dates.month(date)}

    ${#dates.monthName(date)}

    ${#dates.monthNameShort(date)}

    ${#dates.year(date)}

    ${#dates.dayOfWeek(date)}

    ${#dates.dayOfWeekName(date)}

    ${#dates.dayOfWeekNameShort(date)}

    ${#dates.hour(date)}

    ${#dates.minute(date)}

    ${#dates.second(date)}

    ${#dates.millisecond(date)}

    ${#dates.create(year,month,day)}

    ${#dates.create(year,month,day,hour,minute)}

    ${#dates.create(year,month,day,hour,minute,second)}

    ${#dates.create(year,month,day,hour,minute,second,millisecond)}

    ${#dates.createNow()}

    ${#dates.createToday()}

    日历

    ${#calendars.format(cal)}

    ${#calendars.arrayFormat(calArray)}

    ${#calendars.listFormat(calList)}

    ${#calendars.setFormat(calSet)}

    ${#calendars.format(cal, 'dd/MMM/yyyy HH:mm')}

    ${#calendars.arrayFormat(calArray, 'dd/MMM/yyyy HH:mm')}

    ${#calendars.listFormat(calList, 'dd/MMM/yyyy HH:mm')}

    ${#calendars.setFormat(calSet, 'dd/MMM/yyyy HH:mm')}

    ${#calendars.day(date)}

    ${#calendars.month(date)}

    ${#calendars.monthName(date)}

    ${#calendars.monthNameShort(date)}

    ${#calendars.year(date)}

    ${#calendars.dayOfWeek(date)}

    ${#calendars.dayOfWeekName(date)}

    ${#calendars.dayOfWeekNameShort(date)}

    ${#calendars.hour(date)}

    ${#calendars.minute(date)}

    ${#calendars.second(date)}

    ${#calendars.millisecond(date)}

    ${#calendars.create(year,month,day)}

    ${#calendars.create(year,month,day,hour,minute)}

    ${#calendars.create(year,month,day,hour,minute,second)}

    ${#calendars.create(year,month,day,hour,minute,second,millisecond)}

    ${#calendars.createNow()}

    ${#calendars.createToday()}

    格式化数字对象

    ${#numbers.formatInteger(num,3)}

    ${#numbers.arrayFormatInteger(numArray,3)}

    ${#numbers.listFormatInteger(numList,3)}

    ${#numbers.setFormatInteger(numSet,3)}

    ${#numbers.formatInteger(num,3,'POINT')}

    ${#numbers.arrayFormatInteger(numArray,3,'POINT')}

    ${#numbers.listFormatInteger(numList,3,'POINT')}

    ${#numbers.setFormatInteger(numSet,3,'POINT')}

    ${#numbers.formatDecimal(num,3,2)}

    ${#numbers.arrayFormatDecimal(numArray,3,2)}

    ${#numbers.listFormatDecimal(numList,3,2)}

    ${#numbers.setFormatDecimal(numSet,3,2)}

    ${#numbers.formatDecimal(num,3,2,'COMMA')}

    ${#numbers.arrayFormatDecimal(numArray,3,2,'COMMA')}

    ${#numbers.listFormatDecimal(numList,3,2,'COMMA')}

    ${#numbers.setFormatDecimal(numSet,3,2,'COMMA’)}

    ${#numbers.formatDecimal(num,3,'POINT',2,'COMMA')}

    ${#numbers.arrayFormatDecimal(numArray,3,'POINT',2,'COMMA')}

    ${#numbers.listFormatDecimal(numList,3,'POINT',2,'COMMA')}

    ${#numbers.setFormatDecimal(numSet,3,'POINT',2,'COMMA')}

    {#numbers.sequence(from,to,step)}

    字符串处理

    ${#strings.isEmpty(name)}

    ${#strings.arrayIsEmpty(nameArr)}

    ${#strings.listIsEmpty(nameList)}

    ${#strings.setIsEmpty(nameSet)}

    ${#strings.defaultString(text,default)}

    ${#strings.arrayDefaultString(textArr,default)}

    ${#strings.listDefaultString(textList,default)}

    ${#strings.setDefaultString(textSet,default)}

    ${#strings.contains(name,'ez')}

    ${#strings.containsIgnoreCase(name,'ez')}

    ${#strings.startsWith(name,'Don')}

    ${#strings.endsWith(name,endingFragment)}

    ${#strings.indexOf(name,frag)}

    ${#strings.substring(name,3,5)}

    ${#strings.substringAfter(name,prefix)}

    ${#strings.substringBefore(name,suffix)}

    ${#strings.replace(name,'las','ler')}

    ${#strings.prepend(str,prefix)}

    ${#strings.append(str,suffix)}

    ${#strings.toUpperCase(name)}

    ${#strings.toLowerCase(name)}

    ${#strings.arrayJoin(namesArray,',')}

    ${#strings.listJoin(namesList,',')}

    ${#strings.setJoin(namesSet,',')}

    ${#strings.arraySplit(namesStr,',')}

    ${#strings.listSplit(namesStr,',')}

    ${#strings.setSplit(namesStr,',')}

    {#strings.length(str)}

    ${#strings.abbreviate(str,10)}

    ${#strings.capitalize(str)}

    ${#strings.unCapitalize(str)}

    ${#strings.capitalizeWords(str)}

    ${#strings.capitalizeWords(str,delimiters)}

    ${#strings.escapeXml(str)}

    ${#strings.escapeJava(str)}

    ${#strings.escapeJavaScript(str)}

    ${#strings.unescapeJava(str)}

    ${#strings.unescapeJavaScript(str)}

    ${#strings.equals(str)}

    ${#strings.equalsIgnoreCase(str)}

    ${#strings.concat(str)}

    ${#strings.concatReplaceNulls(str)}

    对象处理

    ${#objects.nullSafe(obj,default)}

    ${#objects.arrayNullSafe(objArray,default)}

    ${#objects.listNullSafe(objList,default)}

    ${#objects.setNullSafe(objSet,default)}

    布尔值相关

    ${#bools.isTrue(obj)}

    ${#bools.arrayIsTrue(objArray)}

    ${#bools.listIsTrue(objList)}

    ${#bools.setIsTrue(objSet)}

    ${#bools.isFalse(cond)}

    ${#bools.arrayIsFalse(condArray)}

    ${#bools.listIsFalse(condList)}

    ${#bools.setIsFalse(condSet)}

    ${#bools.arrayAnd(condArray)}

    ${#bools.listAnd(condList)}

    ${#bools.setAnd(condSet)}

    ${#bools.arrayOr(condArray)}

    ${#bools.listOr(condList)}

    ${#bools.setOr(condSet)}

    数组相关

    ${#arrays.toArray(object)}

    ${#arrays.toStringArray(object)}

    ${#arrays.toIntegerArray(object)}

    ${#arrays.toLongArray(object)}

    ${#arrays.toDoubleArray(object)}

    ${#arrays.toFloatArray(object)}

    ${#arrays.toBooleanArray(object)}

    ${#arrays.length(array)}

    ${#arrays.isEmpty(array)}

    ${#arrays.contains(array, element)}

    ${#arrays.containsAll(array, elements)}

    list集合相关

    ${#lists.toList(object)}

    ${#lists.size(list)}

    ${#lists.isEmpty(list)}

    ${#lists.contains(list, element)}

    ${#lists.containsAll(list, elements)}

    ${#lists.sort(list)}

    ${#lists.sort(list, comparator)}

    set集合相关

    ${#sets.toSet(object)}

    ${#sets.size(set)}

    ${#sets.isEmpty(set)}

    ${#sets.contains(set, element)}

    ${#sets.containsAll(set, elements)}

    map集合相关

    ${#maps.size(map)}

    ${#maps.isEmpty(map)}

    ${#maps.containsKey(map, key)}

    ${#maps.containsAllKeys(map, keys)}

    ${#maps.containsValue(map, value)}

    ${#maps.containsAllValues(map, value)}

    聚集,聚合

    ${#aggregates.sum(array)}

    ${#aggregates.sum(collection)}

    ${#aggregates.avg(array)}

    ${#aggregates.avg(collection)}

    获取外部信息内部变量

    ${#messages.msg('msgKey')}

    ${#messages.msg('msgKey', param1)}

    ${#messages.msg('msgKey', param1, param2)}

    ${#messages.msg('msgKey', param1, param2, param3)}

    ${#messages.msgWithParams('msgKey', new Object[] {param1, param2, param3, param4})}

    ${#messages.arrayMsg(messageKeyArray)}

    ${#messages.listMsg(messageKeyList)}

    ${#messages.setMsg(messageKeySet)}

    ${#messages.msgOrNull('msgKey')}

    ${#messages.msgOrNull('msgKey', param1)}

    ${#messages.msgOrNull('msgKey', param1, param2)}

    ${#messages.msgOrNull('msgKey', param1, param2, param3)}

    {#messages.arrayMsgOrNull(messageKeyArray)}

    ${#messages.listMsgOrNull(messageKeyList)}

    ${#messages.setMsgOrNull(messageKeySet)}

    处理可能重复的id属性

    ${#ids.seq('someId')}

    ${#ids.next('someId')}

    ${#ids.prev('someId')}

    你可能感兴趣的:(Thymeleaf完全手册)