内容简介:Spring MVC 之使用 Freemarker
Freemarker 是使用比较广泛的模板,本文介绍如何使用 Spring 集成 Freemarker,并提供完整实例进行演示。代码结构如下:
代码结构
定义 Freemarker 视图解析器
和其它 web 应用一样,我们可以在 WebMvcConfigurerAdapter 定义 ViewResolver(视图解析器),这里通过子类 WebConfig 来实现:
@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 使用以下代码从应用上下文中自动查找。
//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,代码如下:
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 目录。
@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 如下:
@Controller public class HomeController { @RequestMapping(value = "/",method = GET) public String home(Model model) { return "home"; } }
home.ftl 如下:
<h1>关于谈谈 IT</h1> <p>谈谈 IT,是一个专注于计算机技术、互联网、搜索引擎、SEO、优秀软件、网站架设与运营的原创 IT 科技博客。</p> <p>欢迎访问<a href="http://tantanit.com">tantanit.com</a></p>
渲染后效果如下:
小结
本文介绍如何将 Spring 和 Freemarker 进行集成。本文相关的配置,在之前写的这几篇文章中有更详细的介绍:
此外,之前的这两篇文章讲解了 Spring 与其它几个主流模板的集成:
谈谈 IT的文章均为原创或翻译(翻译会注明外文来源),转载请以链接形式标明本文地址: http://tantanit.com/spring-freemarker-integration/
欢迎关注官方微信公众号获取最新原创文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。