`

通用大型网站页面静态化解决方案(一)

阅读更多

  最近自己做了一个做网络广告的网站叫全方位商机平台的项目,由于网站首页上板块划分很多,不同板块的数据库查询方式不同,首页内容量巨大,如果按照一般的动态jsp页面的话那么数据库查询将是巨大的开销,会导致首页访问速度的下降。于是考虑将这个首页全部静态化。
   整个网站才用struts2 + spring + hibernate + freemarker + urlrewrite完成。首页纯静态化,频道及其他页面通过urlrewrite伪静态。现在废话少说。我先给出首页jsp body源代码:
Java代码
<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>

<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。
Java代码
       /**
* 生成静态页面主方法
* @param context ServletContext
* @param data 一个Map的数据结果集
* @param templatePath ftl模版路径
* @param targetHtmlPath 生成静态页面的路径
*/
ublic 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(); 


         /**
  * 生成静态页面主方法
  * @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文件。友情链接数据来源通过数据库查询获取。
然后再写一个方法专门生成友情链接静态页面:
Java代码
       /**
* 生成友情链接的静态页index_link.html
* @param context
* @param data
*/
ublic static void createIndexFriendLink(ServletContext context,Map<String,Object> data){ 
crateHTML(context,data,”index_link.ftl”,”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中的一个方法:
Java代码
        /**
* 生成友情链接静态页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”; 
    } 
}

         /**
  * 生成友情链接静态页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模版源码:
Java代码
<#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>

<#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方法实时的生成静态页面。如果更新速度不慢可以在后台手动更新或者利用操作系统的定时任务功能去执行你的静态页面生成程序。

分享到:
评论
2 楼 安静听歌 2015-11-25  
现在在搞这个,,,,,哎~头都大了,,,又freemarker,又urlrewrite,这正则表达式简单还行,,,复杂的脑子就不行咧。静态页面是好生成,就是不知道怎么系统地管理,地址又要做成*.html的,方便蜘蛛收录。真心不知道怎么设计这个管理页面的东西
1 楼 马清天 2015-06-03  
[b][/b][list]
[*]
引用
[u][/u]

[/list]

相关推荐

    通用大型网站页面静态化解决方案

    多个文件服务器读写,这里可采用SMB协议 页面静态化,可采用freemarker开源框架 如果考虑到大量的读写请求,则将请求分布式或采用调度的办法来解决 第一点我们首先应该考虑文件服务器与静态页面的映射关系,即什么...

    生活分类信息发布网站的优秀网站管理系统正式版

    是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。采用人性化的Windows操作方式开发,运行速度快,服务器资源占用更少;无论在稳定...

    仿赶集网站模板.net分类信息管理系统下载

    是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。采用人性化的Windows操作方式开发,运行速度快,服务器资源占用更少;无论在稳定...

    网软志成分类信息网站系统.net官方商业版

    是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。采用人性化的Windows操作方式开发,运行速度快,服务器资源占用更少;无论在稳定...

    仿58同城赶集网源码

    北京信息超市源码,本分类信网程序基于asp+mssql技术开发的分类信息程序,是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。...

    ASP.NET的网页代码模型及生命周期

    在创建了ASP.NET应用程序后,系统同样会默认创建一个Default.aspx页面,不同的是,多出了一个Default.aspx.designer.cs,用来初始化页面控件,一般不需要修改。 4.1.5 ASP.NET网站和ASP.NET应用程序的区别 在ASP.NET...

    KesionCMS v9.05 Build20130704 免费正式版 gbk.exe

    KesionCMS是漳州科兴信息技术有限公司开发的一套万能建站产品,是CMS行业最流行的网站建设解决方案之一,V9.0采用ASP ACCESS/MSSQL架构,系统具有极强的可扩展性,并且一直以来完全开放源代码;这套系统自2006年发布...

    KesionCMS v9.05 Build20130704 免费正式版 utf-8.exe

    KesionCMS是漳州科兴信息技术有限公司开发的一套万能建站产品,是CMS行业最流行的网站建设解决方案之一,V9.03采用ASP ACCESS/MSSQL架构,系统具有极强的可扩展性,并且一直以来完全开放源代码;这套系统自2006年发布...

    创易CreateEasy CMS V1.0 Beta版

    本系统基于ASP语言和MSSQL/ACCESS数据库开发,是一个经过完善设计并适用于各种服务器环境的高效、易用、快速、安全和优秀的网站解决方案,无论在稳定性、负载能力、安全保障等方面都做到了尽可能的完善。 创易CMS...

    java 面试题 总结

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap...

    超级有影响力霸气的Java面试题大全文档

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、...

    精易模块[源码] V5.15

    9、改善“网页_访问”中最后一个参数(代理地址)为“”符号时无法访问网页,感谢易友【z00544】反馈。 精易模块 V3.82 what’s new:(20140816) 1、修复“时间_取现行时间戳”有时不能正常返回13位时间戳,当...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    1.6.4 项目和解决方案 11 1.6.5 设置Visual C++ 2010的选项 23 1.6.6 创建和执行Windows应用程序 23 1.6.7 创建Windows Forms应用程序 26 1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 ...

    亮剑.NET深入体验与实战精要2

    3.4.7 在URL中传递中文的解决方案 152 3.4.8 增强用户体验的一些技巧 153 3.4.9 XHTML与HTML的区别 156 3.5 打造自己的页面基类PageBase 161 本章常见技术面试题 164 常见面试技巧之如何做好自我介绍 164 本章小结 ...

    亮剑.NET深入体验与实战精要3

    3.4.7 在URL中传递中文的解决方案 152 3.4.8 增强用户体验的一些技巧 153 3.4.9 XHTML与HTML的区别 156 3.5 打造自己的页面基类PageBase 161 本章常见技术面试题 164 常见面试技巧之如何做好自我介绍 164 本章小结 ...

    eMart 网店系统 V 1.0 SqlServer版

    在access版【下载】的基础上增加了sqlserver【下载】数据库平台的解决方案,可以更加灵活高效的适用于各种商业B2C的场合 系统更加注重于运行的稳定和安全性,保障了您业务的正常进行,当然您可以在效率和功能的杠杆...

    Windows应用程序捆绑核心编程光盘代码

    4.4.5 一个通用套接字类 96 4.4.6 套接字服务器端与客户端间通信的实例 101 4.5 本章小结 106 参考文献 106 第5章 使用LPC和RPC通信 107 5.1 引言 107 5.2 接口定义语言(IDL)简介 107 5.3 使用本地过程调用...

    vfp6.0系统免费下载

    答案: Knowledge Base 是内容广泛的论文集,覆盖了如何使用产品的各种特性、已知的软件错误及其解决方案或回避的方法、以及其他有助于使用各种 Microsoft 产品的有用信息。通过以下站点可访问整个 Knowledge Base: ...

    软件工程知识点

    一、软件工程概述 1.软件特点 软件:计算机程序、方法、规则、相关的文档资料,以及计算机程序运行时所需要的数据。 软件是计算机系统中的逻辑成分,具有无形性。其主要内容包括:程序、配置文件、系统 文档、用户...

Global site tag (gtag.js) - Google Analytics