Thymeleaf 教程

表达式实用程序对象

执行信息

  • #execInfo:表达式对象,提供关于在 Thymeleaf 标准表达式中处理模板的有用信息。

// 参考 org.thymeleaf.expression.ExecutionInfo 类的 javadoc API

// 返回‘叶子’模板的名称和模式。这意味着从中解析正在处理的事件的模板。
// 因此,如果这段代码不在根模板“A”中,而是在从另一个名为“B”的模板插入到“A”中的片段上,
// 则将返回“B”作为模板名称,并返回“B”的模式作为模板模式。
${#execInfo.templateName}
${#execInfo.templateMode}

// 返回“根”模板的名称和模式。这意味着模板引擎返回最初被要求处理的模板名称和模式。
// 因此,如果这段代码不在根模板“A”中,而是在从另一个名为“B”的模板插入到“A”中的片段上,
// 则仍将返回“A”模板的名称和模式。
${#execInfo.processedTemplateName}
${#execInfo.processedTemplateMode}

// 返回正在处理的模板的堆栈(实际上是 List<String> 或 List<TemplateModel>)。
// 第一个元素将是‘processedTemplate’(根元素),最后一个元素将是‘叶子’模板,
// 中间将是出现所有以嵌套方式插入以从根到达叶子的片段。
${#execInfo.templateNames}
${#execInfo.templateModes}

// 返回正在处理的模板堆栈,与 'templateNames' 和 'templateModes' 类似(且顺序相同),
// 但返回一个带有完整模板元数据的 List<TemplateData>。
${#execInfo.templateStack}

消息

  • #messages : 用于获取变量表达式内部的外化信息的实用方法,与使用 #{...} 语法获取的方式相同。

// 参见 org.thymeleaf.expression.Messages 类的 javadoc API。

// 获取外部化的消息。可以接收一个单键,一个键加参数,或一个数组/列表/键集(在这种情况下,它将返回一个数组/列表/外化信息集)。
// 如果没有找到消息,将返回一个默认的消息(如'??msgKey?')。
${#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)}

/*
 * 获得外部化的消息或 null。如果没有找到指定键的消息,将返回 Null 而不是默认消息。
 */
${#messages.msgOrNull('msgKey')}
${#messages.msgOrNull('msgKey', param1)}
${#messages.msgOrNull('msgKey', param1, param2)}
${#messages.msgOrNull('msgKey', param1, param2, param3)}
${#messages.msgOrNullWithParams('msgKey', new Object[] {param1, param2, param3, param4})}
${#messages.arrayMsgOrNull(messageKeyArray)}
${#messages.listMsgOrNull(messageKeyList)}
${#messages.setMsgOrNull(messageKeySet)}

URIs/URLs

  • #uris : 实用对象,用于在 Thymeleaf 标准表达式中执行 URI/URL 操作(特别是转义/反转义)。

// 参见 org.thymeleaf.expression.Uris 类的 javadoc API

// 转义/反转义(Escape/Unescape)作为 URI/URL 路径
${#uris.escapePath(uri)}
${#uris.escapePath(uri, encoding)}
${#uris.unescapePath(uri)}
${#uris.unescapePath(uri, encoding)}

// 转义/反转义(Escape/Unescape)作为 URI/URL 路径段(在‘/’符号之间)
${#uris.escapePathSegment(uri)}
${#uris.escapePathSegment(uri, encoding)}
${#uris.unescapePathSegment(uri)}
${#uris.unescapePathSegment(uri, encoding)}

// 转义/反转义(Escape/Unescape)作为片段标识符(#frag)
${#uris.escapeFragmentId(uri)}
${#uris.escapeFragmentId(uri, encoding)}
${#uris.unescapeFragmentId(uri)}
${#uris.unescapeFragmentId(uri, encoding)}

// 转义/反转义(Escape/Unescape)作为查询参数(?var=value)
${#uris.escapeQueryParam(uri)}
${#uris.escapeQueryParam(uri, encoding)}
${#uris.unescapeQueryParam(uri)}
${#uris.unescapeQueryParam(uri, encoding)}

转换

  • #conversions : 实用对象,允许在模板的任何一点上执行转换服务。

// 参见 org.thymeleaf.expression.Conversions 类的 javadoc API。

// 执行 "object" 值到指定类别的所需转换。
${#conversions.convert(object, 'java.util.TimeZone')}
${#conversions.convert(object, targetClass)}

日期

  • #dates : java.util.Date 对象的实用方法。

// 参见 org.thymeleaf.expression.Dates 类的 javadoc API。

// 用标准的本地格式来格式化日期,也可用于数组、列表或集合来工作
${#dates.format(date)}
${#dates.arrayFormat(datesArray)}
${#dates.listFormat(datesList)}
${#dates.setFormat(datesSet)}

// 用ISO8601格式格式化日期,也可用于数组、列表或集合
${#dates.formatISO(date)}
${#dates.arrayFormatISO(datesArray)}
${#dates.listFormatISO(datesList)}
${#dates.setFormatISO(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.day(date)}                    // 还有 arrayDay(...), listDay(...), 等.
${#dates.month(date)}                  // 还有 arrayMonth(...), listMonth(...), 等
${#dates.monthName(date)}              // 还有 arrayMonthName(...), listMonthName(...), 等
${#dates.monthNameShort(date)}         // 还有 arrayMonthNameShort(...), listMonthNameShort(...), 等
${#dates.year(date)}                   // 还有 arrayYear(...), listYear(...), etc.
${#dates.dayOfWeek(date)}              // also arrayDayOfWeek(...), listDayOfWeek(...), 等
${#dates.dayOfWeekName(date)}          // 还有  arrayDayOfWeekName(...), listDayOfWeekName(...), 等
${#dates.dayOfWeekNameShort(date)}     // 还有 arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), 等
${#dates.hour(date)}                   // 还有 arrayHour(...), listHour(...), 等
${#dates.minute(date)}                 // 还有 arrayMinute(...), listMinute(...), 等
${#dates.second(date)}                 // 还有 arraySecond(...), listSecond(...), 等
${#dates.millisecond(date)}            // also arrayMillisecond(...), listMillisecond(...), 等

//  从组件中创建日期(java.util.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)}

// 为当前日期和时间创建一个日期(java.util.Date)对象。
${#dates.createNow()}
${#dates.createNowForTimeZone()}

// 为当前日期创建一个日期(java.util.Date)对象(时间设置为00:00)
${#dates.createToday()}
${#dates.createTodayForTimeZone()}

日历(Calendars)

  • #calendars:类似于#dates,但适用于java.util.Calendar对象。

// 参见org.thymeleaf.expression.Calendars类的javadoc API。
// 用标准的本地格式来格式化日历,也可与数组、列表或集合一起工作
${#calendars.format(cal)}
${#calendars.arrayFormat(calArray)}
${#calendars.listFormat(calList)}
${#calendars.setFormat(calSet)}

// 采用ISO8601格式的日历,也可与数组、列表或集合一起工作
${#calendars.formatISO(cal)}
${#calendars.arrayFormatISO(calArray)}
${#calendars.listFormatISO(calList)}
${#calendars.setFormatISO(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)}                // 还有 arrayDay(...), listDay(...), 等
${#calendars.month(date)}              // 还有 arrayMonth(...), listMonth(...), 等
${#calendars.monthName(date)}          // 还有 arrayMonthName(...), listMonthName(...), 等
${#calendars.monthNameShort(date)}     // 还有 arrayMonthNameShort(...), listMonthNameShort(...), 等
${#calendars.year(date)}               // 还有 arrayYear(...), listYear(...), 等
${#calendars.dayOfWeek(date)}          // 还有 arrayDayOfWeek(...), listDayOfWeek(...), 等
${#calendars.dayOfWeekName(date)}      // 还有 arrayDayOfWeekName(...), listDayOfWeekName(...), 等
${#calendars.dayOfWeekNameShort(date)} // 还有 arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), 等
${#calendars.hour(date)}               // 还有 arrayHour(...), listHour(...), 等
${#calendars.minute(date)}             // 还有 arrayMinute(...), listMinute(...), 等
${#calendars.second(date)}             // 还有 arraySecond(...), listSecond(...), 等
${#calendars.millisecond(date)}        // 还有 arrayMillisecond(...), listMillisecond(...), 等

// 从其组件中创建日历(java.util.Calendar)对象
${#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.createForTimeZone(year,month,day,timeZone)}
${#calendars.createForTimeZone(year,month,day,hour,minute,timeZone)}
${#calendars.createForTimeZone(year,month,day,hour,minute,second,timeZone)}
${#calendars.createForTimeZone(year,month,day,hour,minute,second,millisecond,timeZone)}

// 为当前日期和时间创建一个日历(java.util.Calendar)对象
${#calendars.createNow()}
${#calendars.createNowForTimeZone()}

// 为当前日期创建一个日历(java.util.Calendar)对象(时间设置为00:00)。
${#calendars.createToday()}
${#calendars.createTodayForTimeZone()}

数字(Numbers)

  • #numbers: 数字对象的实用方法。

// 参见org.thymeleaf.expression.Numbers类的javadoc API。
// 整数的格式化
// 设置最小整数位数,也可与数组、列表或集合一起工作
${#numbers.formatInteger(num,3)}
${#numbers.arrayFormatInteger(numArray,3)}
${#numbers.listFormatInteger(numList,3)}
${#numbers.setFormatInteger(numSet,3)}

// 设置最小整数位和千位分隔符:'POINT', 'COMMA', 'WHITESPACE', 'NONE'或'DEFAULT'(根据地区设置)。也适用于数组、列表或集合
${#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.formatCurrency(num)}
${#numbers.arrayFormatCurrency(numArray)}
${#numbers.listFormatCurrency(numList)}
${#numbers.setFormatCurrency(numSet)}


// 格式化百分比
${#numbers.formatPercent(num)}
${#numbers.arrayFormatPercent(numArray)}
${#numbers.listFormatPercent(numList)}
${#numbers.setFormatPercent(numSet)}

// 设置最小整数位和(精确)小数位。
${#numbers.formatPercent(num, 3, 2)}
${#numbers.arrayFormatPercent(numArray, 3, 2)}
${#numbers.listFormatPercent(numList, 3, 2)}
${#numbers.setFormatPercent(numSet, 3, 2)}


// 实用方法
// 创建一个从x到y的整数序列(数组)
${#numbers.sequence(from,to)}
${#numbers.sequence(from,to,step)}

字符串(Strings)

  • #strings: 字符串对象的实用方法。

// 参见 org.thymeleaf.expression.Strings 类的 javadoc API。

/*
 * Null 安全的 toString()
 */
${#strings.toString(obj)}                           // 还有 array*, list* and set*

// 检查一个字符串是否为空(或空)。在检查前执行trim()操作,也适用于数组、列表或集合。
${#strings.isEmpty(name)}
${#strings.arrayIsEmpty(nameArr)}
${#strings.listIsEmpty(nameList)}
${#strings.setIsEmpty(nameSet)}

// 对一个字符串进行 "isEmpty()" 检查,如果为false,则返回字符串自身,如果为true,则返回指定的默认字符串。
// 也适用于数组、列表或集合。
${#strings.defaultString(text,default)}
${#strings.arrayDefaultString(textArr,default)}
${#strings.listDefaultString(textList,default)}
${#strings.setDefaultString(textSet,default)}

// 检查一个子字符串是否包含在一个字符串中,也适用于数组、列表或集合。
${#strings.contains(name,'ez')}                     // 还有 array*, list* and set*
${#strings.containsIgnoreCase(name,'ez')}           // 还有 array*, list* and set*

// 检查一个字符串是否以一个子字符串开始或结束,也适用于数组、列表或集合。
${#strings.startsWith(name,'Don')}                  // 还有 array*, list* and set*
${#strings.endsWith(name,endingFragment)}           // 还有 array*, list* and set*

// 与子串有关的操作,也适用于数组、列表或集合。
${#strings.indexOf(name,frag)}                      // 还有 array*, list* and set*
${#strings.substring(name,3,5)}                     // 还有 array*, list* and set*
${#strings.substringAfter(name,prefix)}             // 还有 array*, list* and set*
${#strings.substringBefore(name,suffix)}            // 还有 array*, list* and set*
${#strings.replace(name,'las','ler')}               // 还有 array*, list* and set*

// 附加和预置,也适用于数组、列表或集合。
${#strings.prepend(str,prefix)}                     // 还有 array*, list* and set*
${#strings.append(str,suffix)}                      // 还有 array*, list* and set*

// 大小写转换,也适用于数组、列表或集合。
${#strings.toUpperCase(name)}                       // 还有 array*, list* and set*
${#strings.toLowerCase(name)}                       // 还有 array*, list* and set*

// 分割和连接
${#strings.arrayJoin(namesArray,',')}
${#strings.listJoin(namesList,',')}
${#strings.setJoin(namesSet,',')}
${#strings.arraySplit(namesStr,',')}                // returns String[]
${#strings.listSplit(namesStr,',')}                 // returns List<String>
${#strings.setSplit(namesStr,',')}                  // returns Set<String>

// 修剪,也适用于数组、列表或集合。
${#strings.trim(str)}                               // 还有 array*, list* and set*

// 计算长度,也适用于数组、列表或集合。
${#strings.length(str)}                             // 还有 array*, list* and set*

// 缩写文本,使其最大尺寸为n。如果文本更大,它将被剪切并以 "..." 结束。
${#strings.abbreviate(str,10)}                      // 还有 array*, list* and set*

// 将第一个字符转换成大写字母(反之亦然)。
${#strings.capitalize(str)}                         // 还有 array*, list* and set*
${#strings.unCapitalize(str)}                       // 还有 array*, list* and set*

// 将每个词的第一个字符转换成大写字母
${#strings.capitalizeWords(str)}                    // 还有 array*, list* and set*
${#strings.capitalizeWords(str,delimiters)}         // 还有 array*, list* and set*

// 转义和反转义字符串
${#strings.escapeXml(str)}                          // 还有 array*, list* and set*
${#strings.escapeJava(str)}                         // 还有 array*, list* and set*
${#strings.escapeJavaScript(str)}                   // 还有 array*, list* and set*
${#strings.unescapeJava(str)}                       // 还有 array*, list* and set*
${#strings.unescapeJavaScript(str)}                 // 还有 array*, list* and set*

// Null 安全的比较和连接
${#strings.equals(first, second)}
${#strings.equalsIgnoreCase(first, second)}
${#strings.concat(values...)}
${#strings.concatReplaceNulls(nullValue, values...)}

// 随机字符串
${#strings.randomAlphanumeric(count)}

对象(Objects)

  • #objects: 对一般对象的实用方法

// 参见 org.thymeleaf.expression.Objects 类的 javadoc API。
// 如果obj不为空,则返回,否则默认为空。也适用于数组、列表或集合
${#objects.nullSafe(obj,default)}
${#objects.arrayNullSafe(objArray,default)}
${#objects.listNullSafe(objList,default)}
${#objects.setNullSafe(objSet,default)}

布尔(boolean)

  • #bools:用于布尔运算的实用方法

// 参见 org.thymeleaf.expression.Bools 类的 javadoc API。
// 以与th:if标签相同的方式评估一个条件。(见后面的条件评估章节)。也适用于数组、列表或集合
${#bools.isTrue(obj)}
${#bools.arrayIsTrue(objArray)}
${#bools.listIsTrue(objList)} ${#bools.setIsTrue(objArray)}
${#bools.setIsTrue(objSet)}

// 用否定的方式进行评估,同样适用于数组、列表或集合
${#bools.arrayIsFalse(condArray)}
${#bools.listIsFalse(condList)}
${#bools.setIsFalse(condSet)}

// 评估并应用AND运算符,接收一个数组、一个列表或一个集合作为参数
${#bools.listAnd(condList)}
${#bools.setAnd(condSet)}

// 评估并应用OR运算符,接收一个数组、一个列表或一个集合作为参数
${#bools.listOr(condList)}
${#bools.setOr(condSet)}

数组

  • #arrays:数组实用方法

// 参见 org.thymeleaf.expression.Arrays 类的 javadoc API。
// 转换为数组,试图推断出数组组件的类别。
// 注意,如果产生的数组是空的,或者目标对象的元素不都是同一类的,这个方法将返回 Object[]。
${#arrays.toArray(object)}

// 转换为指定组件类的数组
${#arrays.toStringArray(object)}
${#arrays.toIntegerArray(object)}
${#arrays.toLongArray(object)} 
${#arrays.toDigitalArray(object)}
${#arrays.toDoubleArray(object)} 
${#arrays.toDoubleArray(object)}
${#arrays.toFloatArray(object)}
${#arrays.toFloatArray(object)}
${#arrays.toBooleanArray(object)}

// 计算长度
${#arrays.length(array)}

// 检查数组是否为空
${#arrays.isEmpty(array)}

// 检查数组中是否包含一个或多个元素
${#arrays.contains(array, element)}
${#arrays.containsAll(array, elements)}

列表

  • #lists: 列表的实用方法

// 参见 org.thymeleaf.expression.Lists 类的 javadoc API。
// 转换为列表
${#lists.toList(object)}

// 计算大小
${#lists.size(list)}

// 检查列表是否为空
${#lists.isEmpty(list)}

// 检查元素是否包含在列表中
${#lists.contains(list, element)}
${#lists.containsAll(list, elements)}

// 对给定列表的副本进行排序。列表中的成员必须实现可比性,或者你必须定义一个比较器。
${#lists.sort(list)}
${#lists.sort(list, comparator)}

集合(Sets)

  • #sets: 集合的实用方法

// 参见 org.thymeleaf.expression.Sets 类的 javadoc API。
// 转换为集合
${#sets.toSet(object)}

// 计算大小
${#sets.size(set)}

// 检查集合是否为空
${#sets.isEmpty(set)}

// 检查元素是否包含在集合中
${#sets.contains(set, element)}
${#sets.containsAll(set, elements)}

映射(Maps)

  • #maps: Map的实用方法

// 参见 org.thymeleaf.expression.Maps 类的 javadoc API。
// 计算大小
${#maps.size(map)}

// 检查Map是否为空
${#maps.isEmpty(map)}

// 检查地图中是否包含键或值
${#maps.containsKey(map, key)}
${#maps.containsAllKeys(map, keys)}
${#maps.containsValue(map, value)}
${#maps.containsAllValues(map, value)}

聚合(Aggregates)

  • #aggregates:用于在数组或集合上创建聚合的实用方法

// 参见 org.thymeleaf.expression.Aggregates 类的 javadoc API。
// 计算总和。如果数组或集合是空的,则返回null
${#aggregates.sum(array)}
${#aggregates.sum(collection)}

// 计算平均数。如果数组或集合是空的,则返回null
${#aggregates.avg(array)} 
${#aggregates.avg(collection)}

IDs

  • #ids:处理可能被重复的id属性的实用方法(例如,作为一个迭代的结果)。

// 参见 org.thymeleaf.expression.Ids 类的 javadoc API。
// 通常用于th:id属性,用于在 id 属性值上附加一个计数器,以便它在参与迭代过程时仍然是唯一的。
${#ids.seq('someId')}

// 通常用于 th:for <label> 标签中的属性,这样这些标签就可以引用通过 #Ids.seq(…) 函数生成的id。
// 根据 <label> 是在 #ids.seq(...) 函数的元素之前还是之后,
// 应该调用 "next"(标签在 "seq" 之前)或 "prev" 函数(标签在 "seq "之后)函数。
${#ids.next('someId')}
${#ids.prev('someId')}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号