【问题标题】:Thymeleaf - how to add a custom util?Thymeleaf - 如何添加自定义实用程序?
【发布时间】:2016-10-20 16:56:00
【问题描述】:

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。

那么,问题是如何以及在哪里做呢?

【问题讨论】:

    标签: java spring-boot thymeleaf


    【解决方案1】:

    此答案适用于 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 表达式的良好参考。

    【讨论】:

      【解决方案2】:

      注册自定义表达式对象的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;
                  }
              };
          }
      }
      

      【讨论】:

      • 是否可以仅使用一种方言注册多个实用程序类?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2017-09-17
      • 1970-01-01
      • 2012-09-01
      • 2012-11-11
      • 2012-01-19
      • 2011-04-19
      相关资源
      最近更新 更多