#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 : 实用对象,用于在 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:类似于#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: 数字对象的实用方法。
// 参见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: 字符串对象的实用方法。
// 参见 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: 对一般对象的实用方法
// 参见 org.thymeleaf.expression.Objects 类的 javadoc API。 // 如果obj不为空,则返回,否则默认为空。也适用于数组、列表或集合 ${#objects.nullSafe(obj,default)} ${#objects.arrayNullSafe(objArray,default)} ${#objects.listNullSafe(objList,default)} ${#objects.setNullSafe(objSet,default)}
#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: 集合的实用方法
// 参见 org.thymeleaf.expression.Sets 类的 javadoc API。 // 转换为集合 ${#sets.toSet(object)} // 计算大小 ${#sets.size(set)} // 检查集合是否为空 ${#sets.isEmpty(set)} // 检查元素是否包含在集合中 ${#sets.contains(set, element)} ${#sets.containsAll(set, elements)}
#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:用于在数组或集合上创建聚合的实用方法
// 参见 org.thymeleaf.expression.Aggregates 类的 javadoc API。 // 计算总和。如果数组或集合是空的,则返回null ${#aggregates.sum(array)} ${#aggregates.sum(collection)} // 计算平均数。如果数组或集合是空的,则返回null ${#aggregates.avg(array)} ${#aggregates.avg(collection)}
#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')}