admin

Thymeleaf 自定义工具类
今天在使用Thymeleaf模板的时候,有个这样的需求:后台查询出的fileSize字段的单位是byte类型,在页...
扫描右侧二维码阅读全文
02
2019/03

Thymeleaf 自定义工具类

今天在使用Thymeleaf模板的时候,有个这样的需求:后台查询出的fileSize字段的单位是byte类型,在页面上需要转换成GB、MB、KB这种形式。
由于实体类查询出来就是long类型的,也不想在后台代码将查询结果转换再返回到前台,要是能够在页面用Thymeleaf直接调对应的方法转换就好了。
搜索一波,发现Thymeleaf可以自定义Dialect来实现。
新建自定义Dialect

/***
 * 自定义 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对象:

public class GlobalUtilExpressionObjectFactory implements IExpressionObjectFactory {

    private static final String GLOBAL_UTIL__EVALUATION_VARIABLE_NAME = "dodderUtil";

    private static final Set<String> ALL_EXPRESSION_OBJECT_NAMES = Collections.unmodifiableSet(
            new HashSet<>(Arrays.asList(GLOBAL_UTIL__EVALUATION_VARIABLE_NAME)));


    @Override
    public Set<String> 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类里面的方法。

Last modification:March 2nd, 2019 at 11:50 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment