Spring MVC之使用Freemarker

Freemarker是使用比较广泛的模板,本文介绍如何使用Spring集成Freemarker,并提供完整实例进行演示。代码结构如下:

代码结构

代码结构

定义Freemarker视图解析器

和其它web应用一样,我们可以在WebMvcConfigurerAdapter定义ViewResolver(视图解析器),这里通过子类WebConfig来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Configuration
@EnableWebMvc
@ComponentScan("tantanit.web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
}

@Bean
public ViewResolver viewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setCache(true);
resolver.setPrefix("/WEB-INF/templates/");
resolver.setSuffix(".ftl");
resolver.setContentType("text/html; charset=UTF-8");
return resolver;
}

@Bean
public FreeMarkerConfigurer getFreemarkerConfig() throws IOException, TemplateException {
FreeMarkerConfigurer result = new FreeMarkerConfigurer();
result.setTemplateLoaderPaths("/");
return result;
}
}

其中,viewResolver定义了一个FreeMarkerViewResolver类型的解析器,并且配置模板路径、后缀,以及页面编码。同时,必须定义一个FreeMarkerConfigurer,至少指定加载路径,由于WebConfig类加了@Configuration注解,这个FreeMarkerConfigurer将会被FreeMarkerView使用以下代码从应用上下文中自动查找。

1
2
3
4
5
6
7
8
9
10
11
12
13
//FreeMarkerView类中相关代码
protected FreeMarkerConfig autodetectConfiguration() throws BeansException {
try {
return BeanFactoryUtils.beanOfTypeIncludingAncestors(
getApplicationContext(), FreeMarkerConfig.class, true, false);
}
catch (NoSuchBeanDefinitionException ex) {
throw new ApplicationContextException(
"Must define a single FreeMarkerConfig bean in this web application context " +
"(may be inherited): FreeMarkerConfigurer is the usual implementation. " +
"This bean may be given any name.", ex);
}
}

要使WebConfig生效,还需要实现AbstractAnnotationConfigDispatcherServletInitializer,以初始化DispatcherServlet,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}

@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}

}

DispatcherServlet是Spring MVC的核心,它负责接收request,并且决定request将转给哪个组件。您可以在我写的这篇文章《Spring MVC 的基础配置》中了解更多内容。
由于RootConfig是处理非web配置的,在这里,我们在RootConfig中排除web目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
@ComponentScan(basePackages={"tantanit"},
excludeFilters={
@Filter(type=FilterType.CUSTOM, value=WebPackage.class)
})
public class RootConfig {
public static class WebPackage extends RegexPatternTypeFilter {
public WebPackage() {
super(Pattern.compile("tantanit\\.web"));
}
}
}

到这里,Spring与Freemarker的配置就完成了,下面对页面进行渲染。

渲染页面

主页的controller如下:

1
2
3
4
5
6
7
8
@Controller
public class HomeController {
@RequestMapping( value = "/",method = GET)
public String home(Model model) {
return "home";
}

}

home.ftl如下:

1
2
3
<h1>关于谈谈IT</h1>
<p>谈谈IT,是一个专注于计算机技术、互联网、搜索引擎、SEO、优秀软件、网站架设与运营的原创IT科技博客。</p>
<p>欢迎访问<a href="http://tantanit.com">tantanit.com</a></p>

渲染后效果如下:
代码结构

小结

本文介绍如何将Spring和Freemarker进行集成。本文相关的配置,在之前写的这几篇文章中有更详细的介绍:

此外,之前的这两篇文章讲解了Spring与其它几个主流模板的集成:

© 2021 谈谈IT All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero