Thymeleaf - 如何添加自定义的工具类?

13

Thymeleaf有许多有用的实用工具,例如#strings.capitalize(...)#lists.isEmpty(...)。我想添加一个自定义工具,但不知道如何注册它。

已经创建了一个自定义Util类:

public class LabelUtil {

    public String[] splitDoubleWord(String str) {
        return str.split("[A-Z]", 1);
    }
}

现在我要这样使用它:

<span th:each="item : ${#labels.splitDoubleWord(name)}" th:text="${item}"></span>

当然,这不会生效,因为我还没有注册Util并定义#labels变量。

那么问题是如何以及在哪里进行操作呢?

2个回答

11

在Thymeleaf 3中,注册自定义表达式对象的API发生了变化,例如:

public class MyDialect extends AbstractDialect implements IExpressionObjectDialect {

    MyDialect() {
        super("My Dialect");
    }

    @Override
    public IExpressionObjectFactory getExpressionObjectFactory() {
        return new IExpressionObjectFactory() {

            @Override
            public Set<String> getAllExpressionObjectNames() {
                return Collections.singleton("myutil");
            }

            @Override
            public Object buildObject(IExpressionContext context,
                    String expressionObjectName) {
                return new MyUtil();
            }

            @Override
            public boolean isCacheable(String expressionObjectName) {
                return true;
            }
        };
    }
}

能否只使用一个方言注册多个实用类? - Brian Antiqueña
@BrianAntiqueña 是的 - 只需在 getAllExpressionObjectNames 中返回一个包含多个字符串的集合,并根据 expressionObjectNamebuildObject 中返回相应的 util 类 - 在 ryanp 的示例中将是 "myutil" - undefined

10

这个答案适用于 thymeleaf 2.x。

如果您使用的是 thymeleaf 3.x 或更高版本,请查看其他答案。

public class MyDialect extends AbstractDialect implements IExpressionEnhancingDialect {

  public MyDialect() {
    super();
  }

  @Override
  public String getPrefix() {
    // @see org.thymeleaf.dialect.IDialect#getPrefix
    return "xxx";
  }

  @Override
  public boolean isLenient() {
    return false;
  }

  @Override
  public Map<String, Object> getAdditionalExpressionObjects(IProcessingContext ctx) {
    Map<String, Object> expressions = new HashMap<>();
    expressions.put("labels", new LabelUtil());
    return expressions;
  }
}

并注册您的方言。

@Configuration
public class ThymeleafConfig {

  @Bean
  public MyDialect myDialect() {
    return new MyDialect();
  }
}

thymeleaf-extras-java8time的源代码是创建自定义Thymeleaf表达式的好参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接