19.附录B 表达式工具对象
执行信息
#execInfo
: 提供Thymeleaf标准表达式处理模板的信息 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.ExecutionInfo
- ====================================================================== */
/*
- 返回
叶
模板的名称和模式。叶模板是指该事件开始被处理的模板。 - 所以如果这段代码不是在根模板
A
而是在从B
模板插入到A
的代码段上, - 它会返回B的名称和B的模板模式。 */ ${#execInfo.templateName} ${#execInfo.templateMode}
/ /
- 返回'根'模板的名称和模式。根模板是指最开始请求模板引擎处理的模板。
- 所以如果这段代码不是在根模板"A"上而是在从
B
模板插入到A
的代码段上, - 它会返回A的名称和A的模板模式 */ ${#execInfo.processedTemplateName} ${#execInfo.processedTemplateMode}
/*
- 返回处理模板的堆栈(
List<String>
或是List<templateMode>
)第一个元素为'processedTemplate'(根模板),最后一个是叶模板, - 中间为从根模板到叶模板的所有嵌入的片段 */ ${#execInfo.templateNames} ${#execInfo.templateModes}
/*
- 返回处理模板的堆栈,类似于'templateNames'和'templateModes',
- 但是返回一个包含完整元数据的List
*/ ${#execInfo.templateStack} ```
消息
#messages
:用于获取变量表达式中的外部信息,和通过#{...}
语法获取的方式相同。 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Messages
- ====================================================================== */
/*
- Obtain externalized messages. Can receive a single key, a key plus arguments,
- or an array/list/set of keys (in which case it will return an array/list/set of
- externalized messages).
- If a message is not found, a default message (like '??msgKey??') is returned. */ ${#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)}
/*
- Obtain externalized messages or null. Null is returned instead of a default
- message if a message for the specified key is not found. */ ${#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操作(比如转义/不转义) ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Uris
- ====================================================================== */
/*
- Escape/Unescape as a URI/URL path */ ${#uris.escapePath(uri)} ${#uris.escapePath(uri, encoding)} ${#uris.unescapePath(uri)} ${#uris.unescapePath(uri, encoding)}
/*
- Escape/Unescape as a URI/URL path segment (between '/' symbols) */ ${#uris.escapePathSegment(uri)} ${#uris.escapePathSegment(uri, encoding)} ${#uris.unescapePathSegment(uri)} ${#uris.unescapePathSegment(uri, encoding)}
/*
- Escape/Unescape as a Fragment Identifier (#frag) */ ${#uris.escapeFragmentId(uri)} ${#uris.escapeFragmentId(uri, encoding)} ${#uris.unescapeFragmentId(uri)} ${#uris.unescapeFragmentId(uri, encoding)}
/*
- Escape/Unescape as a Query Parameter (?var=value) */ ${#uris.escapeQueryParam(uri)} ${#uris.escapeQueryParam(uri, encoding)} ${#uris.unescapeQueryParam(uri)} ${#uris.unescapeQueryParam(uri, encoding)} ```
转换
#conversions
: 在模板中任何一点执行转化服务 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Conversions
- ====================================================================== */
/*
- Execute the desired conversion of the 'object' value into the
- specified class. */ ${#conversions.convert(object, 'java.util.TimeZone')} ${#conversions.convert(object, targetClass)} ```
Date
#dates
:java.util.Date
对象的工具方法: ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Dates
- ====================================================================== */
/*
- Format date with the standard locale format
- Also works with arrays, lists or sets */ ${#dates.format(date)} ${#dates.arrayFormat(datesArray)} ${#dates.listFormat(datesList)} ${#dates.setFormat(datesSet)}
/*
- Format date with the ISO8601 format
- Also works with arrays, lists or sets */ ${#dates.formatISO(date)} ${#dates.arrayFormatISO(datesArray)} ${#dates.listFormatISO(datesList)} ${#dates.setFormatISO(datesSet)}
/*
- Format date with the specified pattern
- Also works with arrays, lists or sets */ ${#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')}
/*
- Obtain date properties
- Also works with arrays, lists or sets */ ${#dates.day(date)} // also arrayDay(...), listDay(...), etc. ${#dates.month(date)} // also arrayMonth(...), listMonth(...), etc. ${#dates.monthName(date)} // also arrayMonthName(...), listMonthName(...), etc. ${#dates.monthNameShort(date)} // also arrayMonthNameShort(...), listMonthNameShort(...), etc. ${#dates.year(date)} // also arrayYear(...), listYear(...), etc. ${#dates.dayOfWeek(date)} // also arrayDayOfWeek(...), listDayOfWeek(...), etc. ${#dates.dayOfWeekName(date)} // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc. ${#dates.dayOfWeekNameShort(date)} // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc. ${#dates.hour(date)} // also arrayHour(...), listHour(...), etc. ${#dates.minute(date)} // also arrayMinute(...), listMinute(...), etc. ${#dates.second(date)} // also arraySecond(...), listSecond(...), etc. ${#dates.millisecond(date)} // also arrayMillisecond(...), listMillisecond(...), etc.
/*
- Create date (java.util.Date) objects from its components */ ${#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)}
/*
- Create a date (java.util.Date) object for the current date and time */ ${#dates.createNow()}
${#dates.createNowForTimeZone()}
/*
- Create a date (java.util.Date) object for the current date (time set to 00:00) */ ${#dates.createToday()}
${#dates.createTodayForTimeZone()}
### Calendars ###
---------------------------------------
* `#calendars` : 类似于`#dates`,但是用于`java.util.Calendar`对象:
/*
- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Calendars
- ====================================================================== */
/*
- Format calendar with the standard locale format
- Also works with arrays, lists or sets */ ${#calendars.format(cal)} ${#calendars.arrayFormat(calArray)} ${#calendars.listFormat(calList)} ${#calendars.setFormat(calSet)}
/*
- Format calendar with the ISO8601 format
- Also works with arrays, lists or sets */ ${#calendars.formatISO(cal)} ${#calendars.arrayFormatISO(calArray)} ${#calendars.listFormatISO(calList)} ${#calendars.setFormatISO(calSet)}
/*
- Format calendar with the specified pattern
- Also works with arrays, lists or sets */ ${#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')}
/*
- Obtain calendar properties
- Also works with arrays, lists or sets */ ${#calendars.day(date)} // also arrayDay(...), listDay(...), etc. ${#calendars.month(date)} // also arrayMonth(...), listMonth(...), etc. ${#calendars.monthName(date)} // also arrayMonthName(...), listMonthName(...), etc. ${#calendars.monthNameShort(date)} // also arrayMonthNameShort(...), listMonthNameShort(...), etc. ${#calendars.year(date)} // also arrayYear(...), listYear(...), etc. ${#calendars.dayOfWeek(date)} // also arrayDayOfWeek(...), listDayOfWeek(...), etc. ${#calendars.dayOfWeekName(date)} // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc. ${#calendars.dayOfWeekNameShort(date)} // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc. ${#calendars.hour(date)} // also arrayHour(...), listHour(...), etc. ${#calendars.minute(date)} // also arrayMinute(...), listMinute(...), etc. ${#calendars.second(date)} // also arraySecond(...), listSecond(...), etc. ${#calendars.millisecond(date)} // also arrayMillisecond(...), listMillisecond(...), etc.
/*
- Create calendar (java.util.Calendar) objects from its components */ ${#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)}
/*
- Create a calendar (java.util.Calendar) object for the current date and time */ ${#calendars.createNow()}
${#calendars.createNowForTimeZone()}
/*
- Create a calendar (java.util.Calendar) object for the current date (time set to 00:00) */ ${#calendars.createToday()}
${#calendars.createTodayForTimeZone()}
### Numbers ###
---------------------------------------
* `#numbers` : 数字对象的工具方法:
/*
- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Numbers
- ====================================================================== */
/*
- ==========================
- Formatting integer numbers
- ========================== */
/*
- Set minimum integer digits.
- Also works with arrays, lists or sets */ ${#numbers.formatInteger(num,3)} ${#numbers.arrayFormatInteger(numArray,3)} ${#numbers.listFormatInteger(numList,3)} ${#numbers.setFormatInteger(numSet,3)}
/*
- Set minimum integer digits and thousands separator:
- 'POINT', 'COMMA', 'WHITESPACE', 'NONE' or 'DEFAULT' (by locale).
- Also works with arrays, lists or sets */ ${#numbers.formatInteger(num,3,'POINT')} ${#numbers.arrayFormatInteger(numArray,3,'POINT')} ${#numbers.listFormatInteger(numList,3,'POINT')} ${#numbers.setFormatInteger(numSet,3,'POINT')}
/*
- ==========================
- Formatting decimal numbers
- ========================== */
/*
- Set minimum integer digits and (exact) decimal digits.
- Also works with arrays, lists or sets */ ${#numbers.formatDecimal(num,3,2)} ${#numbers.arrayFormatDecimal(numArray,3,2)} ${#numbers.listFormatDecimal(numList,3,2)} ${#numbers.setFormatDecimal(numSet,3,2)}
/*
- Set minimum integer digits and (exact) decimal digits, and also decimal separator.
- Also works with arrays, lists or sets */ ${#numbers.formatDecimal(num,3,2,'COMMA')} ${#numbers.arrayFormatDecimal(numArray,3,2,'COMMA')} ${#numbers.listFormatDecimal(numList,3,2,'COMMA')} ${#numbers.setFormatDecimal(numSet,3,2,'COMMA')}
/*
- Set minimum integer digits and (exact) decimal digits, and also thousands and
- decimal separator.
- Also works with arrays, lists or sets */ ${#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')}
/*
- =====================
- Formatting currencies
- ===================== */
${#numbers.formatCurrency(num)} ${#numbers.arrayFormatCurrency(numArray)} ${#numbers.listFormatCurrency(numList)} ${#numbers.setFormatCurrency(numSet)}
/*
- ======================
- Formatting percentages
- ====================== */
${#numbers.formatPercent(num)} ${#numbers.arrayFormatPercent(numArray)} ${#numbers.listFormatPercent(numList)} ${#numbers.setFormatPercent(numSet)}
/*
- Set minimum integer digits and (exact) decimal digits. */ ${#numbers.formatPercent(num, 3, 2)} ${#numbers.arrayFormatPercent(numArray, 3, 2)} ${#numbers.listFormatPercent(numList, 3, 2)} ${#numbers.setFormatPercent(numSet, 3, 2)}
/*
- ===============
- Utility methods
- =============== */
/*
- Create a sequence (array) of integer numbers going
- from x to y */ ${#numbers.sequence(from,to)} ${#numbers.sequence(from,to,step)} ```
Strings
#strings
:String
对象的工具方法 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Strings
- ====================================================================== */
/*
- Null-safe toString() / ${#strings.toString(obj)} // also array, list and set
/*
- Check whether a String is empty (or null). Performs a trim() operation before check
- Also works with arrays, lists or sets */ ${#strings.isEmpty(name)} ${#strings.arrayIsEmpty(nameArr)} ${#strings.listIsEmpty(nameList)} ${#strings.setIsEmpty(nameSet)}
/*
- Perform an 'isEmpty()' check on a string and return it if false, defaulting to
- another specified string if true.
- Also works with arrays, lists or sets */ ${#strings.defaultString(text,default)} ${#strings.arrayDefaultString(textArr,default)} ${#strings.listDefaultString(textList,default)} ${#strings.setDefaultString(textSet,default)}
/*
- Check whether a fragment is contained in a String
- Also works with arrays, lists or sets / ${#strings.contains(name,'ez')} // also array, list and set ${#strings.containsIgnoreCase(name,'ez')} // also array, list and set*
/*
- Check whether a String starts or ends with a fragment
- Also works with arrays, lists or sets / ${#strings.startsWith(name,'Don')} // also array, list and set ${#strings.endsWith(name,endingFragment)} // also array, list and set*
/*
- Substring-related operations
- Also works with arrays, lists or sets / ${#strings.indexOf(name,frag)} // also array, list and set ${#strings.substring(name,3,5)} // also array, list and set ${#strings.substringAfter(name,prefix)} // also array, list and set ${#strings.substringBefore(name,suffix)} // also array, list and set ${#strings.replace(name,'las','ler')} // also array, list and set
/*
- Append and prepend
- Also works with arrays, lists or sets / ${#strings.prepend(str,prefix)} // also array, list and set ${#strings.append(str,suffix)} // also array, list and set*
/*
- Change case
- Also works with arrays, lists or sets / ${#strings.toUpperCase(name)} // also array, list and set ${#strings.toLowerCase(name)} // also array, list and set*
/*
- Split and join
*/
${#strings.arrayJoin(namesArray,',')}
${#strings.listJoin(namesList,',')}
${#strings.setJoin(namesSet,',')}
${#strings.arraySplit(namesStr,',')} // returns String[]
${#strings.listSplit(namesStr,',')} // returns List
${#strings.setSplit(namesStr,',')} // returns Set
/*
- Trim
- Also works with arrays, lists or sets / ${#strings.trim(str)} // also array, list and set
/*
- Compute length
- Also works with arrays, lists or sets / ${#strings.length(str)} // also array, list and set
/*
- Abbreviate text making it have a maximum size of n. If text is bigger, it
- will be clipped and finished in "..."
- Also works with arrays, lists or sets / ${#strings.abbreviate(str,10)} // also array, list and set
/*
- Convert the first character to upper-case (and vice-versa) / ${#strings.capitalize(str)} // also array, list and set ${#strings.unCapitalize(str)} // also array, list and set*
/*
- Convert the first character of every word to upper-case / ${#strings.capitalizeWords(str)} // also array, list and set ${#strings.capitalizeWords(str,delimiters)} // also array, list and set*
/*
- Escape the string / ${#strings.escapeXml(str)} // also array, list and set ${#strings.escapeJava(str)} // also array, list and set ${#strings.escapeJavaScript(str)} // also array, list and set ${#strings.unescapeJava(str)} // also array, list and set ${#strings.unescapeJavaScript(str)} // also array, list and set
/*
- Null-safe comparison and concatenation */ ${#strings.equals(first, second)} ${#strings.equalsIgnoreCase(first, second)} ${#strings.concat(values...)} ${#strings.concatReplaceNulls(nullValue, values...)}
/*
- Random */ ${#strings.randomAlphanumeric(count)} ```
Objects
#objects
:一般对象的工具方法 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Objects
- ====================================================================== */
/*
- Return obj if it is not null, and default otherwise
- Also works with arrays, lists or sets */ ${#objects.nullSafe(obj,default)} ${#objects.arrayNullSafe(objArray,default)} ${#objects.listNullSafe(objList,default)} ${#objects.setNullSafe(objSet,default)} ```
Booleans
#bools
:布尔值的工具方法 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Bools
- ====================================================================== */
/*
- Evaluate a condition in the same way that it would be evaluated in a th:if tag
- (see conditional evaluation chapter afterwards).
- Also works with arrays, lists or sets */ ${#bools.isTrue(obj)} ${#bools.arrayIsTrue(objArray)} ${#bools.listIsTrue(objList)} ${#bools.setIsTrue(objSet)}
/*
- Evaluate with negation
- Also works with arrays, lists or sets */ ${#bools.isFalse(cond)} ${#bools.arrayIsFalse(condArray)} ${#bools.listIsFalse(condList)} ${#bools.setIsFalse(condSet)}
/*
- Evaluate and apply AND operator
- Receive an array, a list or a set as parameter */ ${#bools.arrayAnd(condArray)} ${#bools.listAnd(condList)} ${#bools.setAnd(condSet)}
/*
- Evaluate and apply OR operator
- Receive an array, a list or a set as parameter */ ${#bools.arrayOr(condArray)} ${#bools.listOr(condList)} ${#bools.setOr(condSet)} ```
Arrays
#arrays
:数组的工具方法 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Arrays
- ====================================================================== */
/*
- Converts to array, trying to infer array component class.
- Note that if resulting array is empty, or if the elements
- of the target object are not all of the same class,
- this method will return Object[]. */ ${#arrays.toArray(object)}
/*
- Convert to arrays of the specified component class. */ ${#arrays.toStringArray(object)} ${#arrays.toIntegerArray(object)} ${#arrays.toLongArray(object)} ${#arrays.toDoubleArray(object)} ${#arrays.toFloatArray(object)} ${#arrays.toBooleanArray(object)}
/*
- Compute length */ ${#arrays.length(array)}
/*
- Check whether array is empty */ ${#arrays.isEmpty(array)}
/*
- Check if element or elements are contained in array */ ${#arrays.contains(array, element)} ${#arrays.containsAll(array, elements)} ```
Lists
#lists
: list工具方法 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Lists
- ====================================================================== */
/*
- Converts to list */ ${#lists.toList(object)}
/*
- Compute size */ ${#lists.size(list)}
/*
- Check whether list is empty */ ${#lists.isEmpty(list)}
/*
- Check if element or elements are contained in list */ ${#lists.contains(list, element)} ${#lists.containsAll(list, elements)}
/*
- Sort a copy of the given list. The members of the list must implement
- comparable or you must define a comparator. */ ${#lists.sort(list)} ${#lists.sort(list, comparator)} ```
Sets
#sets
:set工具方法 ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Sets
- ====================================================================== */
/*
- Converts to set */ ${#sets.toSet(object)}
/*
- Compute size */ ${#sets.size(set)}
/*
- Check whether set is empty */ ${#sets.isEmpty(set)}
/*
- Check if element or elements are contained in set */ ${#sets.contains(set, element)} ${#sets.containsAll(set, elements)} ```
Maps
#maps
:Map工具方法: ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Maps
- ====================================================================== */
/*
- Compute size */ ${#maps.size(map)}
/*
- Check whether map is empty */ ${#maps.isEmpty(map)}
/*
- Check if key/s or value/s are contained in maps */ ${#maps.containsKey(map, key)} ${#maps.containsAllKeys(map, keys)} ${#maps.containsValue(map, value)} ${#maps.containsAllValues(map, value)} ```
Aggregates
#aggregates
:对数组或集进行合计的工具方法: ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Aggregates
- ====================================================================== */
/*
- Compute sum. Returns null if array or collection is empty */ ${#aggregates.sum(array)} ${#aggregates.sum(collection)}
/*
- Compute average. Returns null if array or collection is empty */ ${#aggregates.avg(array)} ${#aggregates.avg(collection)} ```
IDs
#ids
:处理可能会出现重复值的id属性的工具: ``` /*- ======================================================================
- See javadoc API for class org.thymeleaf.expression.Ids
- ====================================================================== */
/*
- Normally used in th:id attributes, for appending a counter to the id attribute value
- so that it remains unique even when involved in an iteration process. */ ${#ids.seq('someId')}
/*
- Normally used in th:for attributes in
- generated by means if the #ids.seq(...) function. *
- Depending on whether the
- function, the "next" (label goes before "seq") or the "prev" function (label goes after
- "seq") function should be called. */ ${#ids.next('someId')} ${#ids.prev('someId')} ```