使用Thymeleaf的动态模板解析器

问题描述

我们需要动态地解析html或文本模板。具有可变占位符的模板内容(字符串)将在数据库中提供。

我们必须根据需要使用变量的实际值动态地解析它们,并获取最终的字符串内容

示例:(不是完整的代码

String myHtmlTemplateContent = "<h1>Hi ${first_name} ${last_name}</h1>";
Map<String,Object> myMapWithValues = ..;
engine.resolve(myHtmlTemplateContent,myMapWithValues );

如果我们有办法使用百里香叶解决问题,或者有可能使用百里香叶模板引擎,将对您有帮助。

解决方法

您需要创建一个包含以下内容的百里香模板mytemplate.html

<h1 th:text="Hi ${first_name} ${last_name}"></h1>

并将其与在模型中设置变量的mvc控制器一起使用:

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String handle(Model model) {
        model.addAttribute("first_name","Abel");
        model.addAttribute("last_name","Lincon");
        return "mytemplate"; //resolves to mytemplate.html
    }
}

它将呈现<h1>Hi Abel Lincon</h1>

如果要手动处理模板,可以自动连接模板引擎并手动使用它:

@Autowired SpringTemplateEngine templateEngine;

String emailContent = templateEngine.process( "mytemplate",new Context( Locale.ENGLISH,Map.of(
                                "first_name","Abel","last_name","Lincon"
                        )) );
,

我使用了以下方法:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.context.Context;
import java.util.Map;

public class GenericTemplateEngine {

    private final TemplateEngine templateEngine;

    public GenericTemplateEngine(TemplateMode templateMode) {

        templateEngine = new org.thymeleaf.TemplateEngine();

        ClassLoaderTemplateResolver templateResolver
                = new ClassLoaderTemplateResolver(Thread
                        .currentThread().getContextClassLoader());
        templateResolver.setTemplateMode(templateMode);
        templateResolver.setPrefix("/thymeleaf/");
        templateResolver.setCacheTTLMs(3600000L); // one hour
        templateResolver.setCacheable(true);
        this.templateEngine.setTemplateResolver(templateResolver);
    }

    public String getTemplate(String templateName,Map<String,Object> parameters) {
        Context ctx = new Context();
        if (parameters != null) {
            parameters.forEach((k,v) -> {
                ctx.setVariable(k,v);
            });
        }
        return this.templateEngine.process(templateName,ctx).trim();
    }

}

对于HTML模板,可以按以下方式调用它:

HashMap<String,Object> values = new HashMap<>();
values.put("hello","hello everyone");
GenericTemplateEngine engine = new GenericTemplateEngine(TemplateMode.HTML);
String s = engine.getTemplate("hello_world.html",values);
System.out.println(s);

将Map中的值加载到Thymeleaf上下文中,然后与模板一起传递给引擎类。

如果您使用文本模板而不是HTML模板,则可以使用以下内容:

new GenericTemplateEngine(TemplateMode.TEXT);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...