在我的 Spring MVC 项目中,我使用 Tiles 来消除任何冗余的页面结构代码。作为视图渲染器,我首先选择了 Thymeleaf,因为它被描述为一个很有前途的新手,而且非常易于使用。不幸的是,Thymeleaf 与 Tiles 的集成依赖于已弃用的 Spring (Tiles2) 类,此外,唯一的 Thymeleaf 论坛几乎不活跃,问题大多仍未得到解答。
因此,我想切换到 Freemarker,因为它拥有完善的用户社区,并且也受到 Spring 的支持。但是集成的 Spring MVC、Tiles3 和 Freemarker 的配置显然没有记录,互联网上的大多数示例都使用 Tiles 结合 JSP 或没有 Tiles 的 Freemarker,但我找不到一个清晰、有效的集成示例。
我对 Spring MVC 和配置不是很有经验,但我认为必须解决以下问题:
- 加载 Tiles 定义文件。根据一些示例,可以使用 MvcConfig 类中的以下方法来完成:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "nl.drsklaus.activiteitensite.web")
public class MvcConfig extends WebMvcConfigurerAdapter {
...other methods
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tc = new TilesConfigurer();
tc.setDefinitions(new String[] {"/WEB-INF/views/tiles/defs/tiles-defs.xml"});
return tc;
}
}
- 将控制器方法返回的字符串解析为 Tiles 定义:
这应该使用 MvcConfig 类中的以下方法来完成:
@Bean
public ViewResolver tilesViewResolver() {
TilesViewResolver viewResolver = new TilesViewResolver();
viewResolver.setViewClass(TilesView.class);
// viewResolver.setOrder(1);
return viewResolver;
}
我的第一个问题是这个 Tiles 视图解析器是否应该以某种方式“感知 Freemarker”。根据 Tiles 文档,属性 'type="freemarker"' 应该添加到标签以及 Tiles 定义 XML 文件中的标签中,但我不清楚它的效果是什么。此外,这些 put-attribute 标记的 value 属性中引用的片段必须被解析为 Freemarker 模板而不是 JSP。我看不出应该如何配置。
事实上,我不清楚 Spring 中 Tiles 片段的查找/解析过程是如何工作的。扩展 .ftl 是否足以让 Spring 知道应该寻找 Freemarker 模板?
一些示例列出了如下代码片段:
@Bean
public FreeMarkerConfigurer freemarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("/WEB-INF/views/freemarker");
configurer.setDefaultEncoding("utf-8");
return configurer;
}
这种方法是否足以让 Spring MVC 从 Tiles 定义中加载 Freemarker 模板?Spring 如何“知道” Tiles 引用的模板实际上是 Freemarker 模板?还有一个扩展 UrlBasedViewResolver 的 FreeMarkerViewResolver 类。但是我不清楚我们是否应该以及如何使用这个类。
我希望得到一些澄清,甚至可能是一个集成示例:)