Freemarker网站静态化的实现

 http://www.iteye.com/topic/407756?page=1

 

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

Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cbody%3E%0A%3Cdiv%20id%3D%22wrap%22%3E%0A%20%20%20%20%3C!--%E5%A4%B4%E9%83%A8%E5%BC%80%E5%A7%8B--%3E%0A%20%20%20%20%3Cjsp%3Ainclude%20page%3D%22%2Fhtml%2Ftop.html%22%20flush%3D%22true%22%3E%3C%2Fjsp%3Ainclude%3E%0A%20%20%20%20%3C!--%E5%A4%B4%E9%83%A8%E7%BB%93%E6%9D%9F--%3E%0A%20%20%20%20%3C!--%E5%AF%BC%E8%88%AA%E5%BC%80%E5%A7%8B--%3E%0A%20%20%20%20%3Cjsp%3Ainclude%20page%3D%22%2Fhtml%2Fchannel.html%22%20flush%3D%22true%22%3E%3C%2Fjsp%3Ainclude%3E%0A%20%20%20%20%3C!--%E5%AF%BC%E8%88%AA%E7%BB%93%E6%9D%9F--%3E%0A%20%20%20%20%3Cjsp%3Ainclude%20page%3D%22%2Fhtml%2Fcenter.html%22%20flush%3D%22true%22%3E%3C%2Fjsp%3Ainclude%3E%0A%20%20%20%20%3C!--%E5%8F%8B%E6%83%85%E8%BF%9E%E6%8E%A5%E5%BC%80%E5%A7%8B--%3E%0A%20%20%20%20%3Cjsp%3Ainclude%20page%3D%22%2Fhtml%2Findex_link.html%22%20flush%3D%22true%22%3E%3C%2Fjsp%3Ainclude%3E%0A%20%20%20%20%3C!--%E5%8F%8B%E6%83%85%E7%BB%93%E6%9D%9F--%3E%0A%20%20%20%20%3C!--%E5%BA%95%E9%83%A8%E5%BC%80%E5%A7%8B--%3E%0A%20%20%20%20%3Cjsp%3Ainclude%20page%3D%22%2Fhtml%2Fbottom.html%22%20flush%3D%22true%22%3E%3C%2Fjsp%3Ainclude%3E%0A%20%20%20%20%3C!--%E5%BA%95%E9%83%A8%E7%BB%93%E6%9D%9F--%3E%0A%3C%2Fdiv%3E%0A%3C%2Fbody%3E%0A"></embed>
  1. <body>  
  2. <div id="wrap">  
  3.     <!--头部开始-->  
  4.     <jsp:include page="/html/top.html" flush="true"></jsp:include>  
  5.     <!--头部结束-->  
  6.     <!--导航开始-->  
  7.     <jsp:include page="/html/channel.html" flush="true"></jsp:include>  
  8.     <!--导航结束-->  
  9.     <jsp:include page="/html/center.html" flush="true"></jsp:include>  
  10.     <!--友情连接开始-->  
  11.     <jsp:include page="/html/index_link.html" flush="true"></jsp:include>  
  12.     <!--友情结束-->  
  13.     <!--底部开始-->  
  14.     <jsp:include page="/html/bottom.html" flush="true"></jsp:include>  
  15.     <!--底部结束-->  
  16. </div>  
  17. </body>  

整个网站首页的基本结构是通过jsp的include标签将所有通过freemarker生成的静态页面组织起来。后台控制各个部分的静态页生成。这样做将首页进行了拆分,便于了静态页面的维护,当我们需要生成“友情链接”部分的时候就只生成友情链接部分,而不需要将整个页面都从新生成一次。 
   以下是我生成静态页最核心的方法,使用freemarker。 
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%20%20%20%20%20%20%20%20%20%2F**%0A%09%20*%20%E7%94%9F%E6%88%90%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2%E4%B8%BB%E6%96%B9%E6%B3%95%0A%09%20*%20%40param%20context%20ServletContext%0A%09%20*%20%40param%20data%20%E4%B8%80%E4%B8%AAMap%E7%9A%84%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%9C%E9%9B%86%0A%09%20*%20%40param%20templatePath%20ftl%E6%A8%A1%E7%89%88%E8%B7%AF%E5%BE%84%0A%09%20*%20%40param%20targetHtmlPath%20%E7%94%9F%E6%88%90%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2%E7%9A%84%E8%B7%AF%E5%BE%84%0A%09%20*%2F%0A%09public%20static%20void%20crateHTML(ServletContext%20context%2CMap%3CString%2CObject%3E%20data%2CString%20templatePath%2CString%20targetHtmlPath)%7B%0A%09%09Configuration%20freemarkerCfg%20%3D%20new%20Configuration()%3B%0A%09%09%2F%2F%E5%8A%A0%E8%BD%BD%E6%A8%A1%E7%89%88%0A%09%09freemarkerCfg.setServletContextForTemplateLoading(context%2C%20%22%2F%22)%3B%0A%09%09freemarkerCfg.setEncoding(Locale.getDefault()%2C%20%22UTF-8%22)%3B%0A%09%09try%20%7B%0A%09%09%09%2F%2F%E6%8C%87%E5%AE%9A%E6%A8%A1%E7%89%88%E8%B7%AF%E5%BE%84%0A%09%09%09Template%20template%20%3D%20freemarkerCfg.getTemplate(templatePath%2C%22UTF-8%22)%3B%0A%09%09%09template.setEncoding(%22UTF-8%22)%3B%0A%09%09%09%2F%2F%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2%E8%B7%AF%E5%BE%84%0A%09%09%09String%20htmlPath%20%3D%20context.getRealPath(%22%2Fhtml%22)%2B%22%2F%22%2BtargetHtmlPath%3B%0A%09%09%09File%20htmlFile%20%3D%20new%20File(htmlPath)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Writer%20out%20%3D%20new%20BufferedWriter(new%20OutputStreamWriter(new%20FileOutputStream(htmlFile)%2C%20%22UTF-8%22))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E5%A4%84%E7%90%86%E6%A8%A1%E7%89%88%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20template.process(data%2C%20out)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20out.flush()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20out.close()%3B%0A%09%09%7D%20catch%20(Exception%20e)%20%7B%0A%09%09%09e.printStackTrace()%3B%0A%09%09%7D%0A%09%7D%0A"></embed>
  1.        /** 
  2. * 生成静态页面主方法 
  3. * @param context ServletContext 
  4. * @param data 一个Map的数据结果集 
  5. * @param templatePath ftl模版路径 
  6. * @param targetHtmlPath 生成静态页面的路径 
  7. */  
  8. ublic static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){  
  9. Configuration freemarkerCfg = new Configuration();  
  10. //加载模版  
  11. freemarkerCfg.setServletContextForTemplateLoading(context, "/");  
  12. freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");  
  13. try {  
  14.     //指定模版路径  
  15.     Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");  
  16.     template.setEncoding("UTF-8");  
  17.     //静态页面路径  
  18.     String htmlPath = context.getRealPath("/html")+"/"+targetHtmlPath;  
  19.     File htmlFile = new File(htmlPath);  
  20.           Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));  
  21.           //处理模版    
  22.           template.process(data, out);  
  23.           out.flush();  
  24.           out.close();  
  25. catch (Exception e) {  
  26.     e.printStackTrace();  
  27. }  

其实很简单,只要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文件。友情链接数据来源通过数据库查询获取。 
然后再写一个方法专门生成友情链接静态页面: 
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%20%20%20%20%20%20%20%20%20%2F**%0A%09%20*%20%E7%94%9F%E6%88%90%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5%E7%9A%84%E9%9D%99%E6%80%81%E9%A1%B5index_link.html%0A%09%20*%20%40param%20context%0A%09%20*%20%40param%20data%0A%09%20*%2F%0A%09public%20static%20void%20createIndexFriendLink(ServletContext%20context%2CMap%3CString%2CObject%3E%20data)%7B%0A%09%09crateHTML(context%2Cdata%2C%22index_link.ftl%22%2C%22index_link.html%22)%3B%0A%09%7D%0A"></embed>
  1.        /** 
  2. * 生成友情链接的静态页index_link.html 
  3. * @param context 
  4. * @param data 
  5. */  
  6. ublic static void createIndexFriendLink(ServletContext context,Map<String,Object> data){  
  7. crateHTML(context,data,"index_link.ftl","index_link.html");  

此方法调用上面的createHTML方法。 
然后根据以上方法我们就可以再Struts2的action里面从数据库查询数据放入map调用createIndexFriendLink()方法生成静态页了。 
这是action中的一个方法: 
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%20%20%20%20%20%20%20%20%20%2F**%0A%09%20*%20%E7%94%9F%E6%88%90%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5%E9%9D%99%E6%80%81%E9%A1%B5index_link.html%0A%09%20*%20%40return%0A%09%20*%2F%0A%09public%20String%20createLink()%7B%0A%09%09%2F%2F%E6%9D%83%E9%99%90%E9%AA%8C%E8%AF%81%0A%09%09if(!%20this.isAccess())%0A%09%09%09return%20%22error%22%3B%0A%09%09try%7B%0A%09%09%09%2F%2F%E5%BE%97%E5%88%B0%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5%0A%09%09%09List%20links%20%3D%20friendLinkDAO.findAll()%3B%0A%09%09%09%2F%2F%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%0A%09%09%09HashMap%3CString%2CObject%3E%20data%20%3D%20new%20HashMap%3CString%2CObject%3E()%3B%0A%09%09%09data.put(%22links%22%2C%20links)%3B%0A%09%09%09%2F%2F%E8%B0%83%E7%94%A8%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2%E6%96%B9%E6%B3%95%0A%09%09%09HTML.createIndexFriendLink(ServletActionContext.getServletContext()%2C%20data)%3B%0A%09%09%09addActionMessage(%22%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2%E7%94%9F%E6%88%90%E6%88%90%E5%8A%9F%EF%BC%81%22)%3B%0A%09%09%09return%20%22message%22%3B%0A%09%09%7Dcatch(Exception%20e)%7B%0A%09%09%09e.printStackTrace()%3B%0A%09%09%09return%20%22failure%22%3B%0A%09%09%7D%0A%09%7D%0A"></embed>
  1.         /** 
  2.  * 生成友情链接静态页index_link.html 
  3.  * @return 
  4.  */  
  5. public String createLink(){  
  6.     //权限验证  
  7.     if(! this.isAccess())  
  8.         return "error";  
  9.     try{  
  10.         //得到友情链接  
  11.         List links = friendLinkDAO.findAll();  
  12.         //准备数据  
  13.         HashMap<String,Object> data = new HashMap<String,Object>();  
  14.         data.put("links", links);  
  15.         //调用静态页面方法  
  16.         HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data);  
  17.         addActionMessage("静态页面生成成功!");  
  18.         return "message";  
  19.     }catch(Exception e){  
  20.         e.printStackTrace();  
  21.         return "failure";  
  22.     }  
  23. }  

List links = friendLinkDAO.findAll();通过spring注入action的hiberate DAO获取数据给list然后通过以下代码 
HashMap<String,Object> data = new HashMap<String,Object>(); 
data.put("links", links); 
准备数据调用createIndexFriendLink()方法。 
以下是:ftl模版源码: 
Java代码 <embed type="application/x-shockwave-flash" width="14" height="15" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%3C%23if%20links%3Fsize%20!%3D%200%3E%0A%3Cdiv%20class%3D%22link%22%3E%0A%09%20%20%20%20%3Cstrong%3E%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5%EF%BC%9A%3C%2Fstrong%3E%0A%09%20%20%20%20%3C%23list%20links%20as%20link%3E%0A%09%09%3Ca%20href%3D%22%24%7Blink.linkUrl%7D%22%20target%3D%22_blank%22%20title%3D%22%24%7Blink.linkName%7D%22%3E%24%7Blink.linkName%7D%3C%2Fa%3E%0A%09%09%3C%2F%23list%3E%0A%3C%2Fdiv%3E%0A%3C%23else%3E%0A%3Cdiv%20class%3D%22link%22%3E%3C%2Fdiv%3E%0A%3C%2F%23if%3E%0A%0A"></embed>
  1. <#if links?size != 0>  
  2. <div class="link">  
  3.         <strong>友情链接:</strong>  
  4.         <#list links as link>  
  5.         <a href="${link.linkUrl}" target="_blank" title="${link.linkName}">${link.linkName}</a>  
  6.         </#list>  
  7. </div>  
  8. <#else>  
  9. <div class="link"></div>  
  10. </#if>  

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

总结:虽然静态页访问速度快,但实现起来毕竟还是比较麻烦了,维护也是一个麻烦事情。如果您的站点更新速度快那么就需要在你的后台数据更新部分调用相应的createHTML方法实时的生成静态页面。如果更新速度不慢可以在后台手动更新或者利用操作系统的定时任务功能去执行你的静态页面生成程序。www.361pt.com这个网站我是采用了这两种方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值