`

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这个网站我是采用了这两种方式。

分享到:
评论

相关推荐

    Freemarker网站静态化的实现实例源码(eclipse)

    4. **项目结构**:一个典型的Freemarker静态化项目可能包含以下部分: - 模板文件夹(templates):存放Freemarker模板文件,如.ftl。 - Java源代码文件夹(src):包含处理动态数据的Java类,如Controller和Model...

    httpclient,freemarker的静态化分页

    本项目利用了`httpclient`与`freemarker`这两个工具来实现静态化的分页功能。下面将详细阐述这两个工具以及它们在静态化分页中的应用。 首先,`httpclient`是Apache的一个开源HTTP客户端库,它提供了丰富的API,...

    freemarker权威版 网站静态化

    在网站静态化的过程中,Freemarker扮演着关键角色。通过将动态数据注入到预定义的模板中,它能够生成HTML或其他静态格式的文件,从而极大地提高了网站的访问速度,减轻了服务器的负担。 在网站静态化时,Freemarker...

    struts1.2+freemarker实现登录成功页面静态化例子

    总结来说,这个例子展示了如何结合Struts1.2和Freemarker2.3.8实现登录成功页面的静态化,通过静态化可以提高网站性能,减轻服务器负担,提升用户体验。在实际开发中,开发者可以根据项目需求灵活运用这些技术和策略...

    freemarker把jsp静态化简单应用

    通过以上步骤,你就可以在MyEclipse中使用FreeMarker实现JSP页面的静态化。记住,良好的分层设计和模板使用习惯能显著提高代码质量,使项目更加易于维护和扩展。继续深入学习FreeMarker的高级特性,你将能够更高效地...

    freemarker生成静态html示例

    本示例项目是在Eclipse环境中创建的一个工程,目的是演示如何使用Freemarker来生成静态HTML页面。 在了解这个项目之前,首先需要知道什么是Freemarker。Freemarker是一个开源的Java库,它允许开发者通过定义模板(....

    Struts2整合Freemarker生成静态页面

    这通常通过在Action中触发静态化逻辑,将Freemarker渲染后的HTML保存到磁盘,然后直接返回这些静态页面。 9. **错误和异常处理**:Struts2和Freemarker都有自己的错误处理机制。当模板或Action执行出错时,可以通过...

    struts2+freemarker 生成静态页面

    4. **实现过程**:在Struts2中,可以通过自定义Result类型来实现静态化。这个Result类型会在Action处理完请求后,将生成的FreeMarker模板内容写入到一个静态HTML文件中。同时,需要设置适当的缓存策略,例如根据内容...

    SpringBoot2 整合FreeMarker模板,完成页面静态化处理.docx

    通过SpringBoot2和FreeMarker的整合,我们可以构建高效的静态化系统,提升网站性能,同时降低服务器负载,为用户提供更好的浏览体验。在实际项目中,应根据具体需求选择合适的静态化策略,平衡性能、实时性和维护...

    网页静态化例程 网站静态化学习的第一步

    综上所述,实现网站静态化是一个涉及前端模板引擎、后端编程、数据库操作以及URL重写等多个环节的过程。通过这个"网页静态化例程"的学习,你可以掌握基本的静态化技术,为构建高性能、易搜索的网站奠定基础。而...

    教你如何用FreeMarker生成静态页面.doc

    4. 初始化`Configuration`对象,这是FreeMarker的核心配置类,用于管理模板的加载和解析。 5. 使用`setDirectoryForTemplateLoading`设置模板文件所在的目录,并加载模板。 6. 使用`setObjectWrapper`设置对象包装器...

    freemarker生成静态HTML例子

    - **保存为文件**: 将生成的HTML字符串写入到指定的文件中,完成静态化。 4. **示例代码** ```java // 创建数据模型 Map, Object&gt; model = new HashMap(); model.put("title", "Freemarker示例"); model.put...

    首页静态化步骤

    标题“首页静态化步骤”指的是将网站的动态首页转换为静态HTML页面的过程,这有助于提高网站的加载速度、减轻服务器负担以及优化搜索引擎排名。在Web开发中,首页静态化是常见的性能优化手段。 首先,我们需要了解...

    java JSP页面静态化总结_动态页面变为静态页面以减少访问数据库的次数提高速度.zip

    - **URLRewrite实现URL伪静态化**:通过URLRewrite工具,可以改变URL的展示形式,使其看起来像静态页面,但实际仍由动态页面处理。这种方法并不真正生成静态文件,但在用户看来,URL更简洁,更像静态页面。 4. **...

    可视化div布局 生成freemarker模板

    然后在FreeMarker模板中引用这些静态资源,使用FTL语法将动态数据与布局结合。Spring MVC控制器接收请求,处理业务逻辑,构建数据模型,最后将模型传递给FreeMarker模板进行渲染。 7. **最佳实践**:为了提高效率和...

    动态页面静态化汇总--页面静态化方案

    动态页面静态化是一种提高网站性能和搜索引擎友好度的技术手段,主要通过将原本由服务器动态生成的HTML页面转换为预先生成的静态HTML文件。这样,用户请求时,服务器无需执行数据库查询和其他复杂操作,而是直接返回...

    freemark 页面静态化

    总的来说,Freemarker页面静态化能够提高Web应用的性能,减少服务器负载,提升用户体验,尤其适合新闻资讯、博客等需要大量静态页面的网站。同时,它也有助于SEO优化,因为搜索引擎更容易抓取静态HTML页面。因此,...

    velocity freemarke 模版 静态化 实现

    Velocity和FreeMarker是两种常用的Java模板引擎,它们可以方便地结合JSP(JavaServer Pages)进行动态网页生成,并实现页面静态化。本文将详细介绍如何使用Velocity和FreeMarker模板实现页面静态化,并提供具体的...

    有关Java页面静态化

    实现Java页面静态化的工具和库包括: - **JSP/Servlet**:传统的Java Web开发方式,可以通过JSP标签库和EL表达式生成静态HTML。 - **FreeMarker/Velocity**:模板引擎,允许开发者编写静态HTML模板,动态数据在...

    Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化

    Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化,以后直接调用即可,无需修改任何源代码,改压缩文件包括 1、工具类; 2、源码(含jar包); 3、mysql数据库可执行文件; 4、struts2集成...

Global site tag (gtag.js) - Google Analytics