使用 Thymeleaf 的动态模板解析器

Dynamic template resolver using Thymeleaf

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

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

示例:(非完整代码)

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

如果我们有办法解决使用 thymeleaf 的问题或者是否可以使用 thymeleaf 模板引擎,将会有所帮助。

我使用了以下方法:

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 上下文中,然后连同模板一起传递给引擎 class。

如果您有文本模板而不是 HTML 模板,那么您将使用以下内容:

new GenericTemplateEngine(TemplateMode.TEXT);

您需要创建一个 thymeleaf 模板 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"
                        )) );