经验分享:Freemarker网站静态化的实现(原创)

imyourgod 2009-06-13 12:14:38
加精
做程序也做了将近4年时间了,从来没有发过什么技术性的文章,今天发一个只在大家一起共同学习进步,如有错误地方请指正。
最近自己做了一个做网络广告的网站叫全方位商机平台的项目,由于网站首页上板块划分很多,不同板块的数据库查询方式不同,首页内容量巨大,如果按照一般的动态jsp页面的话那么数据库查询将是巨大的开销,会导致首页访问速度的下降。于是考虑将这个首页全部静态化。参考地址:http://www.31pt.com/。首页的速度是非常快的。
整个网站才用struts2 + spring + hibernate + freemarker + urlrewrite完成。首页纯静态化,频道及其他页面通过urlrewrite伪静态。现在废话少说。我先给出首页jsp body源代码:

<body>
<div id="wrap">
<!--头部开始-->
<jsp:include page="/html/top.html" flush="true"></jsp:include>
<!--头部结束-->
<!--导航开始-->
<jsp:include page="/html/channel.html" flush="true"></jsp:include>
<!--导航结束-->
<jsp:include page="/html/center.html" flush="true"></jsp:include>
<!--友情连接开始-->
<jsp:include page="/html/index_link.html" flush="true"></jsp:include>
<!--友情结束-->
<!--底部开始-->
<jsp:include page="/html/bottom.html" flush="true"></jsp:include>
<!--底部结束-->
</div>
</body>

整个网站首页的基本结构是通过jsp的include标签将所有通过freemarker生成的静态页面组织起来。后台控制各个部分的静态页生成。这样做将首页进行了拆分,便于了静态页面的维护,当我们需要生成“友情链接”部分的时候就只生成友情链接部分,而不需要将整个页面都从新生成一次。
以下是我生成静态页最核心的方法,使用freemarker。

/**
* 生成静态页面主方法
* @param context ServletContext
* @param data 一个Map的数据结果集
* @param templatePath ftl模版路径
* @param targetHtmlPath 生成静态页面的路径
*/
public static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){
Configuration freemarkerCfg = new Configuration();
//加载模版
freemarkerCfg.setServletContextForTemplateLoading(context, "/");
freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
try {
//指定模版路径
Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");
template.setEncoding("UTF-8");
//静态页面路径
String htmlPath = context.getRealPath("/html")+"/"+targetHtmlPath;
File htmlFile = new File(htmlPath);
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
//处理模版
template.process(data, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}

其实很简单,只要Google一下就有很多这方面的代码。我也是Google的代码然后自己再根据实际情况修改。简单说明一下参数:
ServletContext :这个不用说了吧。做java web的应该都知道,只不过struts2中这样获取ServletActionContext.getServletContext()
Map<String,Object> data : 模版的数据来源。freemarker通过一个Map给ftl模版送数据。
现在已友情链接为列子详细介绍静态页面如何生成。其他模块以此类推。
String templatePath : ftl所在的路径。我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。
String targetHtmlPath : 最后生成静态页的路径:我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。

友情链接根据这段代码<jsp:include page="/html/index_link.html" flush="true"></jsp:include>我们需要freemarker生成一个index_link.html文件。友情链接数据来源通过数据库查询获取。
然后再写一个方法专门生成友情链接静态页面:

/**
* 生成友情链接的静态页index_link.html
* @param context
* @param data
*/
public static void createIndexFriendLink(ServletContext context,Map<String,Object> data){
crateHTML(context,data,"index_link.ftl","index_link.html");
}

此方法调用上面的createHTML方法。
然后根据以上方法我们就可以再Struts2的action里面从数据库查询数据放入map调用createIndexFriendLink()方法生成静态页了。
这是action中的一个方法:

/**
* 生成友情链接静态页index_link.html
* @return
*/
public String createLink(){
//权限验证
if(! this.isAccess())
return "error";
try{
//得到友情链接
List links = friendLinkDAO.findAll();
//准备数据
HashMap<String,Object> data = new HashMap<String,Object>();
data.put("links", links);
//调用静态页面方法
HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data);
addActionMessage("静态页面生成成功!");
return "message";
}catch(Exception e){
e.printStackTrace();
return "failure";
}
}

List links = friendLinkDAO.findAll();通过spring注入action的hiberate DAO获取数据给list然后通过以下代码
HashMap<String,Object> data = new HashMap<String,Object>();
data.put("links", links);
准备数据调用createIndexFriendLink()方法。
以下是:ftl模版源码:

<#if links?size != 0>
<div class="link">
<strong>友情链接:</strong>
<#list links as link>
<a href="${link.linkUrl}" target="_blank" title="${link.linkName}">${link.linkName}</a>
</#list>
</div>
<#else>
<div class="link"></div>
</#if>


这样友情链接静态页就生成了。然后其他静态页依此葫芦画瓢。

总结:虽然静态页访问速度快和其他的好处,但实现起来毕竟还是很麻烦了,维护也是一个麻烦事情。如果您的站点更新速度快那么就需要在你的后台数据更新部分调用相应的createHTML方法实时的生成静态页面。如果更新速度不慢可以在后台手动更新或者利用操作系统的定时任务功能去执行你的静态页面生成程序。www.361pt.com这个网站我是才用了这两种方式。

本人第一次发帖,还请大家各抒己见,指正不足!
...全文
18658 231 打赏 收藏 转发到动态 举报
写回复
用AI写文章
231 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuailexiaobuding4 2012-10-24
  • 打赏
  • 举报
回复
静态可以生成shtml格式。至于维护可以在后台管理系统走发布。写一套发布的程序用于生成。撤销和维护。
xiaoluo501395377 2012-10-23
  • 打赏
  • 举报
回复
楼主很犀利 顶一个
tr86793411 2012-10-23
  • 打赏
  • 举报
回复
好文章!
  • 打赏
  • 举报
回复
挺好的方法..
libin19880926 2012-10-18
  • 打赏
  • 举报
回复
神马都是浮云
ysn003 2012-08-18
  • 打赏
  • 举报
回复
顶顶顶。。绝对支持,太有用了。
dongmoo 2012-03-02
  • 打赏
  • 举报
回复
用这中方式竟然有这么多的顶声,我是无语了!
BigBear 2011-12-15
  • 打赏
  • 举报
回复
不错啊!!Jsp的静态化!!其实也可以考虑用js作数据缓存来实现,前台的静态化的
小龙在线 2011-12-14
  • 打赏
  • 举报
回复
现在很多站点都用到了页面静态化,支持下
hepeng_8 2011-12-03
  • 打赏
  • 举报
回复
看完了 但是还是不东 顶
gavinloo 2011-09-16
  • 打赏
  • 举报
回复
学习了,项目正好要用静态化。谢谢
leebo_gemini 2011-08-23
  • 打赏
  • 举报
回复
chenchunyu11 2011-08-18
  • 打赏
  • 举报
回复
我也想研究下这个
linfeng19 2011-08-11
  • 打赏
  • 举报
回复
看一下......
--G-- 2011-06-03
  • 打赏
  • 举报
回复
感觉很不错的样子,学习,学习,学习!!!
cht841225 2011-05-18
  • 打赏
  • 举报
回复
uiiui
zhangliang_88 2011-04-17
  • 打赏
  • 举报
回复
学习学习了~
skywuyue 2011-04-17
  • 打赏
  • 举报
回复
学习了,目前静态化的东西做的挺多
  • 打赏
  • 举报
回复
学习了~~~~
wkcgy 2011-04-16
  • 打赏
  • 举报
回复
[Quote=引用 203 楼 wkcgy 的回复:]

挺好的!!我最近这两天想搞一下这个静态化,不错!!!
[/Quote]错了一个字,sorry....
加载更多回复(195)

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧