如何解决使用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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。