【问题标题】:Process string templates with thymeleaf 3使用 thymeleaf 3 处理字符串模板
【发布时间】:2016-08-21 09:29:37
【问题描述】:

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

我遵循了这个示例,它在 Thymeleaf 2 中运行良好
Is there a way to make Spring Thymeleaf process a string template?

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

【问题讨论】:

    标签: spring thymeleaf


    【解决方案1】:

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

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

    【讨论】:

    • 这是东西
    【解决方案2】:

    我们就是这样做的,作为一个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);
    }
    

    【讨论】:

    • 有什么办法让它为&lt;div th:include=\"includeComp::includeFrag\" /&gt;工作?
    【解决方案3】:

    使用最新版本的 spring 5 和 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);        
    }
    

    希望这是一个有用的sn-p

    【讨论】:

    • 如果您打算将TemplateEngine 公开为@Bean,则需要将其设为@Primary,否则它将无法工作,因为默认的spring 模板引擎会妨碍您。
    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2014-05-04
    • 2018-05-02
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多