Thymeleaf 自定义工具类 时间: 2019-03-02 23:50 分类: JAVA Web,Spring 今天在使用`Thymeleaf`模板的时候,有个这样的需求:后台查询出的`fileSize`字段的单位是`byte`类型,在页面上需要转换成`GB、MB、KB`这种形式。 由于实体类查询出来就是`long`类型的,也不想在后台代码将查询结果转换再返回到前台,要是能够在页面用`Thymeleaf`直接调对应的方法转换就好了。 搜索一波,发现`Thymeleaf`可以自定义`Dialect`来实现。 新建自定义`Dialect`: ```java /*** * 自定义 Thymeleaf 工具 Dialect * * @author Mr.Xu * @date 2019-03-02 22:35 **/ @Component public class GlobalUtilDialect extends AbstractDialect implements IExpressionObjectDialect { private final IExpressionObjectFactory GLOBAL_UTIL_EXPRESSION_OBJECTS_FACTORY = new GlobalUtilExpressionObjectFactory(); protected GlobalUtilDialect() { super("dodderUtil"); } @Override public IExpressionObjectFactory getExpressionObjectFactory() { return GLOBAL_UTIL_EXPRESSION_OBJECTS_FACTORY; } } ``` 该类需要继承`AbstractDialect`并实现`IExpressionObjectDialect`接口。 `getExpressionObjectFactory()`方法需要返回`IExpressionObjectFactory`对象,所以我们还需要新建一个`ExpressionObjectFactory`对象: ```java public class GlobalUtilExpressionObjectFactory implements IExpressionObjectFactory { private static final String GLOBAL_UTIL__EVALUATION_VARIABLE_NAME = "dodderUtil"; private static final Set ALL_EXPRESSION_OBJECT_NAMES = Collections.unmodifiableSet( new HashSet<>(Arrays.asList(GLOBAL_UTIL__EVALUATION_VARIABLE_NAME))); @Override public Set getAllExpressionObjectNames() { return ALL_EXPRESSION_OBJECT_NAMES; } @Override public Object buildObject(IExpressionContext context, String expressionObjectName) { if (expressionObjectName.equals(GLOBAL_UTIL__EVALUATION_VARIABLE_NAME)) { return new StringUtil(); } return null; } @Override public boolean isCacheable(String expressionObjectName) { return GLOBAL_UTIL__EVALUATION_VARIABLE_NAME != null && GLOBAL_UTIL__EVALUATION_VARIABLE_NAME.equals(expressionObjectName); } } ``` 实现如上三个方法,最关键的是`buildObject`方法,该方法返回的就是我们需要在页面调用的工具类。 `getAllExpressionObjectNames`返回的就是页面调用的对象名,我这里是`dodderUtil`。 完成上面两个类之后就可以在页面上这样子使用了: ``` ${#dodderUtil.formatSize(torrent.fileSize)} ``` `formatSize`方法就是`StringUtil`类里面的方法。 标签: 无