当前位置: 首页 > 知识库问答 >
问题:

使用thymeleaf 3处理字符串模板

汪胡非
2023-03-14

我们可以使用StringTemplateResolver用Icontext填充字符串模板吗。如果是这样,我们该怎么办?TemplateProcessingParameters和IResourceResolver已从Thymeleaf 3中删除。任何可行的例子都会大有帮助吗?

我已经遵循了这个例子,它在Thymeleaf 2中工作得很好
有没有办法使Spring Thymeleaf进程成为字符串模板?

我没有看到任何参考,也没有看到任何迁移指南。

共有3个答案

缪远
2023-03-14

随着最新版本的Spring5和thymeleaf其易于阅读的字符串从thymeleaf。

如果您使用的是gradle,请使用下面的导入

compile "org.thymeleaf:thymeleaf:3.0.11.RELEASE"
compile "org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE"

//Code sample starts here
private TemplateEngine templateEngine;

private final static String TEMPLATE_LOCAL = "US";


public TemplateEngine getTemplateEngine() {
    templateEngine = new TemplateEngine();
    StringTemplateResolver stringTemplateResolver = new StringTemplateResolver();
    templateEngine.setTemplateResolver(stringTemplateResolver);
    return templateEngine;
}   



public String getTemplateFromAttributes(String htmlContent, Map<String, Object> attr) 
 {
        templateEngine = getTemplateEngine();
        Context context = new Context(new Locale(TEMPLATE_LOCAL));
        if (!CollectionUtils.isEmpty(attr)) {
            attr.forEach((k,v)->context.setVariable(k, v));
        }
        return templateEngine.process(htmlContent, context);        
}

希望这是一个有用的片段

有翰海
2023-03-14

我们是这样做的,作为一个Spring@Service Bean:

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateProcessingParameters;
import org.thymeleaf.context.IContext;
import org.thymeleaf.messageresolver.IMessageResolver;
import org.thymeleaf.messageresolver.StandardMessageResolver;
import org.thymeleaf.resourceresolver.IResourceResolver;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.templatemode.StandardTemplateModeHandlers;
import org.thymeleaf.templateresolver.ITemplateResolutionValidity;
import org.thymeleaf.templateresolver.ITemplateResolver;
import org.thymeleaf.templateresolver.NonCacheableTemplateResolutionValidity;
import org.thymeleaf.templateresolver.TemplateResolution;
import org.thymeleaf.util.Validate;
import com.rathna.app.model.constants.common.BeanConstants;

/**
 * Ref: https://github.com/thymeleaf/thymeleaf-itutorial/blob/2.1-master/src/test/java/org/thymeleaf/tools/memoryexecutor/StaticTemplateExecutorTest.java
 * @author anandchakru
 *
 */
@Service
public class StaticTemplateService {
    public String processTemplateCode(final String code, final IContext context) {
        Validate.notNull(code, "Code must be non-null");
        Validate.notNull(context, "Context must be non-null");
        String templateMode = StandardTemplateModeHandlers.HTML5.getTemplateModeName();
        IMessageResolver messageResolver = new StandardMessageResolver();
        ITemplateResolver templateResolver = new MemoryTemplateResolver(code, templateMode);
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setMessageResolver(messageResolver);
        templateEngine.setTemplateResolver(templateResolver);
        templateEngine.initialize();
        return templateEngine.process("dummy", context);
    }
}

class FixedMemoryResourceResolver implements IResourceResolver {
    private static final String NAME = "FixedMemoryResourceResolver";
    private final String templateContent;

    public FixedMemoryResourceResolver(final String templateContent) {
        Validate.notNull(templateContent, "Template content must be non-null");
        this.templateContent = templateContent;
    }
    @Override
    public String getName() {
        return NAME;
    }
    @Override
    public InputStream getResourceAsStream(final TemplateProcessingParameters tpp, final String templateName) {
        return new ByteArrayInputStream(templateContent.getBytes());
    }
}

class MemoryTemplateResolver implements ITemplateResolver {
    private static final String NAME = "MemoryTemplateResolver";
    private static final Integer ORDER = 1;
    private final String templateContent;
    private final String templateMode;

    public MemoryTemplateResolver(final String templateContent, final String templateMode) {
        Validate.notNull(templateContent, "Template content must be non-null");
        Validate.notNull(templateMode, "Template mode must be non-null");
        this.templateContent = templateContent;
        this.templateMode = templateMode;
    }
    @Override
    public void initialize() {
    }
    @Override
    public String getName() {
        return NAME;
    }
    @Override
    public Integer getOrder() {
        return ORDER;
    }
    @Override
    public TemplateResolution resolveTemplate(final TemplateProcessingParameters tpp) {
        String templateName = "CustomTemplate";
        String resourceName = "CustomResource";
        IResourceResolver resourceResolver = new FixedMemoryResourceResolver(templateContent);
        ITemplateResolutionValidity validity = new NonCacheableTemplateResolutionValidity();
        return new TemplateResolution(templateName, resourceName, resourceResolver, StandardCharsets.UTF_8.toString(),
                templateMode, validity);
    }
}

这样称呼它:

@Autowired
protected StaticTemplateService staticTemplateService;
...
private String getProcessedHtml(){
    Context context2 = new Context();
    context2.setVariable("greet", "Hello");
    return staticTemplateService.processTemplateCode("<div th:text="${greet}">Hi</div> World", context2);
}
漆雕宏浚
2023-03-14

我想我找到了解决办法。如果有人有更好的答案,请告诉我。我之前犯了一个小错误。希望这能有所帮助。

private TemplateEngine templateEngine;

private TemplateEngine getTemplateEngine() {
        if(null == templateEngine){
            templateEngine = new TemplateEngine();
            StringTemplateResolver templateResolver =new   StringTemplateResolver();
            templateResolver.setTemplateMode(TemplateMode.HTML);
            templateEngine.setTemplateResolver(templateResolver);
        }
        return templateEngine;
    }




public String getTemplateFromMap(String htmlContent, Map<String, String> dynamicAttibutesMap) {
    templateEngine = getTemplateEngine();
    String template = null;
    final Context ctx = new Context(new Locale(TEMPLATE_LOCAL));
    if (!CollectionUtils.isEmpty(emailAttibutesMap)) {
        dynamicAttibutesMap.forEach((k,v)->ctx.setVariable(k, v));
    }
    if (null != templateEngine) {
        template = templateEngine.process(htmlContent, ctx);
    } 
    return template;
}
 类似资料:
  • 在 Bash 脚本中可以调用字符串处理工具 awk 来替换内置的字符串处理操作。 样例 10-6. 使用另一种方式来截取和定位子字符串 #!/bin/bash # substring-extraction.sh String=23skidoo1 # 012345678 Bash # 123456789 awk # 注意不同字符串索引系统: # Bash 中第一个字符

  • 我正在使用与Freemarker启动的Spring Boot。 给定以下字符串: 我试图对这个字符串执行一些验证,以确保它包含正确的Freemarker语法。 ----提示:如果已知失败的表达式在法律上引用了有时为null或缺少的内容,可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-

  • StringBuffer 是一个字符串拼接工具,和java中的StringBuilder类似。对于那些需要大量的字符串连接的时候,用 StringBuffer 更高效一些。它实现了以下API: class StringBuffer { public function __construct($str); public function isEmpty(); publi

  • 字符串在我们平常的Web开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割、连接、转换等操作,本小节将通过Go标准库中的strings和strconv两个包中的函数来讲解如何进行有效快速的操作。 字符串操作 下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档。 func Contains(s, substr string)

  • 函数 说明 Series.str.capitalize() 将 Series / 索引中的字符串转换为大写。 Series.str.cat([others, sep, na_rep, join]) 使用给定的分隔符连接 Series / 索引中的字符串。 Series.str.center(width[, fillchar]) 用附加字符填充 Series / 索引中字符串的左侧和右侧。 Seri

  • 在DOS中,字符串是一个有序的字符集合,比如:。 编号 字符串操作 描述 1 创建字符串 字符串可以通过以下方式在DOS中创建。 2 空字符串 空的字符串 3 字符串插值 字符串插值是一种通过将常量,变量,文字和表达式中的值包含在字符串文字中来构造新的字符串值的方法。 4 字符串连接 可以使用运算符连接两个字符串,一个字符串和一个字符,或者两个字符。 以下是一个简单的例子,展示了如何使用字符串连接