1. 简介
在上一篇《Thymeleaf3自定义方言Dialect与处理器》中,记录了使用Thymeleaf3自定义方言和处理器的方法,同时也说到了方言Dialect是处理器与表达式的集合。既然处理器支持自定义,那么推测表达式应该也支持自定义的。但在Thymeleaf的官方tutorials以及article中均未能找到相关的指导与说明,若有人知道官方相关说明的位置,希望能留言或者别的方式告知一下。
既然官方tutorials没有,那就baidu了一下,还是找到了网上各位大神的记录文章。主要参考了《thymeleaf自定义工具对象》 这篇文章。
然后辅以我自己的实践、理解,以及对官方源代码的模仿,得到了一些新的理解,整理成了这篇文章。
2. 常用表达式Expression
在Thymeleaf自带的 StandardDialect 和 Spring提供的 SpringStandardDialect 中,有很多常用的表达式Expression,例如 #strings
#calenders
等。
使用样例如下,这些在官方的文档中都有详细的介绍,此处就不再赘述。
/*
* 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)}
3. 实现 IExpressionObjectFactory 接口
从IExpressionObjectFactory
的名称上来看就是表达式对象的工厂类,即为创造提供表达式对象的接口。
创建实现类,大致如下:
public class BaseDialectExpressionFactory implements IExpressionObjectFactory {
public static final String DICTIONARY_UTILS_EXPRESSION_NAME = "dic";
public static final Set<String> ALL_EXPRESSION_OBJECT_NAMES;
static {
final Set<String> allExpressionObjectNames = new LinkedHashSet<String>();
allExpressionObjectNames.add(DICTIONARY_UTILS_EXPRESSION_NAME);
ALL_EXPRESSION_OBJECT_NAMES = Collections.unmodifiableSet(allExpressionObjectNames);
}
@Override
public Set