最近在学习Django,对它的模板继承功能爱不释手,相比以前的使用过的Sitemesh来说,其功能、灵活性、易用性、复用性都比sitemesh高出一大截。
于是结合struts2+Freemarker做过的项目进行思考,原来用struts2+Freemarker也可以轻松做到Django模板的功能,几天试用下来,那不是一般的爽,sitemesh暂时放一边去吧。
以一个例子来说明
1. 首先定义模板,假设路径为: /webapps/exam/base.ftl, 定义基本布局
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title><@title/></title>
</head>
<body>
<h1>Welcom</h1>
<#if content?exists>
<@content/>
</#if>
<#if images?exists>
<@images/>
</#if>
<#if comment?exists>
<@comment/>
</#if>
<p>
<hr/>
2003-2008 xxx.com. All rights reserved.
</p>
</body>
</html>
分为头、正文内容区域、图片区域、评论区域、尾,这是一个很简单的布局
2. 写一个简单的页面来测试,路径:/webapps/exam/simple.ftl,内容如下
<#include "/exam/base.ftl"/>
<#macro title>
测试
</#macro>
<#macro content>
蒂皮出版的《我的野生动物朋友》一书中,配有她的父母现场拍摄的130多幅照片,展现小女孩与各种凶残的非洲野生动物毫无顾忌玩耍的情景。这本书的广告称,这是又一个“狼孩”故事。
</#macro>
<#macro comment>
<hr>
<p>用户评论</p>
<p>
Tom Say: very good
</p>
</#macro>
这个简单页面就完成了,在simple.ftl中我们不关心布局,爱怎么摆就怎么摆,浏览器中可以看到效果了。
3. 通过继承增强simple.ftl
现在用户的需求来了,要在书籍介绍下显示插图,可以直接修改上面的simple.ftl来实现,另外我们来看看继承simple.ftl来实现这个需求,添加一个文件:/webapps/exam/image-book.ftl,内容如下:
<#include "/exam/simple.ftl"/>
<#macro images>
<p>
<img src='http://img2.cache.netease.com/cnews/2008/11/17/20081117095448372ff.jpg'/>
</p>
</#macro>
现在来看看,很好,已经在原来的页面上加上了图片。
这个例子非常简单,只是为了说明如何实现模板继承,应用场景应该很多。项目中正在用,感觉很方便。