Thymeleaf - 如何添加自定义实用程序?

Posted

技术标签:

【中文标题】Thymeleaf - 如何添加自定义实用程序?【英文标题】:Thymeleaf - how to add a custom util? 【发布时间】: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。

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

【问题讨论】:

【参考方案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;
            
        ;
    

【讨论】:

是否可以仅使用一种方言注册多个实用程序类?

以上是关于Thymeleaf - 如何添加自定义实用程序?的主要内容,如果未能解决你的问题,请参考以下文章

用于添加自定义实用程序的 Tailwind 插件不适用于 Next

您可以在 Xcode 的实用程序面板中添加自定义按钮吗?

微信小程序-原生开发实用教程05-首页(含自定义调试模式插入图片图文排版底部留白添加本地图片)

thymeleaf自定义属性

如何创建自定义命令实用程序

springboot 学习 —— springboot 2.x ,thymeleaf 自定义 select 标签