Spring Boot & Thymeleaf 与 XML 模板
Spring Boot & Thymeleaf with XML Templates
我有一个 Spring 带有控制器的启动应用程序,该控制器 returns 一个 ModelAndView 和 Thymeleaf 来呈现模板,模板位于 /src/main/resources/templates/*.html
这很好用,但是我如何配置 Spring and/or Thymeleaf 以查找 xml 文件而不是 html?
如果有帮助,我正在使用 Gradle 和 org.springframework.boot:spring-boot-starter-web 依赖项来进行设置。我目前 运行 服务器使用 class 和 main 方法。
在对 viewResolver 和相关事物的各种 bean def 进行尝试并失败后,我终于通过对 application.yaml 文件的更改实现了此功能:
spring:
thymeleaf:
suffix: .xml
content-type: text/xml
对于稍后阅读本文的人,您可以对 application.properties 文件执行类似操作(用点符号代替 yaml 缩进)。
这也行得通:
@Configuration
public class MyConfig
{
@Bean
SpringResourceTemplateResolver xmlTemplateResolver(ApplicationContext appCtx) {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(appCtx);
templateResolver.setPrefix("classpath:/templates/");
templateResolver.setSuffix(".xml");
templateResolver.setTemplateMode("XML");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean(name="springTemplateEngine")
SpringTemplateEngine templateEngine(ApplicationContext appCtx) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(xmlTemplateResolver(appCtx));
return templateEngine;
}
}
以及用法
@RestController
@RequestMapping("/v2/")
public class MenuV2Controller {
@Autowired
SpringTemplateEngine springTemplateEngine;
@GetMapping(value ="test",produces = {MediaType.APPLICATION_XML_VALUE})
@ResponseBody
public String test(){
Map<String, String> pinfo = new HashMap<>();
Context context = new Context();
context.setVariable("pinfo", pinfo);
pinfo.put("lastname", "Jordan");
pinfo.put("firstname", "Michael");
pinfo.put("country", "USA");
String content = springTemplateEngine.process("person-details",context);
return content;
}
}
不要忘记 resources/templates 文件夹中的模板
<?xml version="1.0" encoding="UTF-8"?>
<persons >
<person>
<fname th:text="${pinfo['lastname']}"></fname>
<lname th:text="${pinfo['firstname']}"></lname>
<country th:text="${pinfo['country']}"></country>
</person>
</persons>
我有一个 Spring 带有控制器的启动应用程序,该控制器 returns 一个 ModelAndView 和 Thymeleaf 来呈现模板,模板位于 /src/main/resources/templates/*.html
这很好用,但是我如何配置 Spring and/or Thymeleaf 以查找 xml 文件而不是 html?
如果有帮助,我正在使用 Gradle 和 org.springframework.boot:spring-boot-starter-web 依赖项来进行设置。我目前 运行 服务器使用 class 和 main 方法。
在对 viewResolver 和相关事物的各种 bean def 进行尝试并失败后,我终于通过对 application.yaml 文件的更改实现了此功能:
spring:
thymeleaf:
suffix: .xml
content-type: text/xml
对于稍后阅读本文的人,您可以对 application.properties 文件执行类似操作(用点符号代替 yaml 缩进)。
这也行得通:
@Configuration
public class MyConfig
{
@Bean
SpringResourceTemplateResolver xmlTemplateResolver(ApplicationContext appCtx) {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(appCtx);
templateResolver.setPrefix("classpath:/templates/");
templateResolver.setSuffix(".xml");
templateResolver.setTemplateMode("XML");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean(name="springTemplateEngine")
SpringTemplateEngine templateEngine(ApplicationContext appCtx) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(xmlTemplateResolver(appCtx));
return templateEngine;
}
}
以及用法
@RestController
@RequestMapping("/v2/")
public class MenuV2Controller {
@Autowired
SpringTemplateEngine springTemplateEngine;
@GetMapping(value ="test",produces = {MediaType.APPLICATION_XML_VALUE})
@ResponseBody
public String test(){
Map<String, String> pinfo = new HashMap<>();
Context context = new Context();
context.setVariable("pinfo", pinfo);
pinfo.put("lastname", "Jordan");
pinfo.put("firstname", "Michael");
pinfo.put("country", "USA");
String content = springTemplateEngine.process("person-details",context);
return content;
}
}
不要忘记 resources/templates 文件夹中的模板
<?xml version="1.0" encoding="UTF-8"?>
<persons >
<person>
<fname th:text="${pinfo['lastname']}"></fname>
<lname th:text="${pinfo['firstname']}"></lname>
<country th:text="${pinfo['country']}"></country>
</person>
</persons>