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

时间:2016-06-19 08:57:01

标签: java spring-boot thymeleaf

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 var。

那么,问题是如何以及在何处进行?

2 个答案:

答案 0 :(得分:9)

这个答案是针对thymeleaf 2.x。

如果您使用百日咳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源代码是创建自定义百日咳表达式的好参考。

答案 1 :(得分:3)

注册自定义表达式对象的API有changed in Thymeleaf 3,例如:

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;
            }
        };
    }
}