See freemarker-template-inheritance
Gradle dependencies
dependencies {
compile 'kr.pe.kwonnam.freemarker:freemarker-template-inheritance:0.4.RELEASE'
}
Spring 配置
@Bean
public Map<String, TemplateModel> freemarkerLayoutDirectives() {
Map<String, TemplateModel> freemarkerLayoutDirectives = new HashMap<String, TemplateModel>();
freemarkerLayoutDirectives.put("extends", new ExtendsDirective());
freemarkerLayoutDirectives.put("block", new BlockDirective());
freemarkerLayoutDirectives.put("put", new PutDirective());
return freemarkerLayoutDirectives;
}
@Bean
public FreeMarkerConfigurer freemarkerConfig() {
FreeMarkerConfigurer freemarkerConfig = new FreeMarkerConfigurer();
freemarkerConfig.setTemplateLoaderPath("/WEB-INF/ftls/");
freemarkerConfig.setDefaultEncoding("UTF-8");
Map<String, Object> freemarkerVariables = new HashMap<String, Object>();
freemarkerVariables.put("layout", freemarkerLayoutDirectives());
freemarkerConfig.setFreemarkerVariables(freemarkerVariables);
return freemarkerConfig;
}
@Bean
public ViewResolver viewResolver() {
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
viewResolver.setCache(false);
viewResolver.setPrefix("");
viewResolver.setSuffix(".ftl");
viewResolver.setContentType("text/html; charset=utf-8");
return viewResolver;
}
使用
base.ftl: layout
<!DOCTYPE html>
<html>
<head>
<title>Base Layout</title>
<@layout.block name="head">
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</@layout.block>
</head>
<body>
<@layout.block name="header">
<h1>Base Layout</h1>
</@layout.block>
<div class="base">
<@layout.block name="contents">
<h2>Contents will be here</h2>
</@layout.block>
</div>
<@layout.block name="footer">
<div>Footer base</div>
</@layout.block>
</body>
</html>
view.ftl : contents
<@layout.extends name="layouts/base.ftl">
<@layout.put block="head">
<script src="//ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js"></script>
</@layout.put>
<@layout.put block="header" type="prepend">
<h2>Index Page</h2>
</@layout.put>
<@layout.put block="contents">
<p>blah.. blah..</p>
</@layout.put>
<@layout.put block="footer" type="replace">
<hr/>
<div class="footer">Footer replaced by index</div>
</@layout.put>
</@layout.extends>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…