`

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

阅读更多

  最近自己做了一个做网络广告的网站叫全方位商机平台的项目,由于网站首页上板块划分很多,不同板块的数据库查询方式不同,首页内容量巨大,如果按照一般的动态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开源框架 如果考虑到大量的读写请求,则将请求分布式或采用调度的办法来解决 第一点我们首先应该考虑文件服务器与静态页面的映射关系,即什么...

    通用静态页面生成系统

    总的来说,通用静态页面生成系统结合了参数化数据获取、JSP分页技术,旨在提供一个高效、可定制的解决方案,以生成静态网页,提升网站性能。无论是开发还是运维,都能从中获益,实现更优质的网站管理和用户体验。

    通用静态页面生成系统(Engineer) v.1.rar_ASP 静态_静态页面

    对于ASP环境下的网站开发者和管理员来说,这是一个非常实用的解决方案,它通过静态化处理降低了服务器压力,提高了用户体验,同时也方便了搜索引擎的爬取,对于提升网站的在线可见性具有积极意义。通过深入学习和...

    通用静态页面生成服务(多线程,可以随便配置)

    总的来说,通用静态页面生成服务是现代Web开发中不可或缺的一部分,它结合了多线程技术和Windows服务的特性,为企业级网站提供了高效、灵活的解决方案。通过定制和优化,我们可以构建出更符合业务需求的静态页面生成...

    通用后台管理模板

    "通用后台管理模板"正是为解决这一需求而设计的,它能帮助开发者快速构建出响应式的、设计简洁且漂亮的网站后台。 该模板的核心价值在于其通用性。无论是小型创业团队还是大型企业,都可以通过这个模板轻松搭建自己...

    大型电子商城源码

    综上所述,【大型电子商城源码】是一个全面的电子商务解决方案,涵盖了从后端业务逻辑处理、数据库交互、前端展示到支付接口集成的各个环节。理解和掌握这些知识点对于开发和维护一个成功的在线商城至关重要。

    基于XML的自动化信息发布方案

    【基于XML的自动化信息发布方案】 XML(eXtensible Markup Language)是一种强大的...它可以简化网站的构建,提高信息发布的速度,同时保持了信息的结构化和可移植性,为中小型网站提供了经济实用的信息发布解决方案。

    (Java+JSP)可二次开发Extjs4.0通用后台管理系统源码完整大型项目.zip

    【描述】:“(Java+JSP)可二次开发Extjs4.0通用后台管理系统源码完整大型项目”描述了一个完整的系统解决方案,它不仅包括了后端服务器逻辑,还涵盖了前端用户界面的设计。由于采用的是Extjs4.0,所以系统的界面应该...

    蓝色企业集团网站html静态模板

    综上所述,这个“蓝色企业集团网站html静态模板”是一个全方位的解决方案,适合那些希望快速建立专业集团网站的企业。它包含了一系列常见的企业网站所需页面,设计风格统一且专业,易于定制和部署。同时,由于是静态...

    精典通用企业网站管理系统_吐血大放送.rar

    【精典通用企业网站管理系统】是一款专为各类企业提供高效、便捷的网站管理解决方案。这款系统以其全面的功能、灵活的配置和强大的后台管理能力,深受广大企业和开发者喜爱。"吐血大放送"的表述,意味着这是一份非常...

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

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

    美团通用性能监控平台和WEB性能分析框架

    突破这些瓶颈通常需要创新的解决方案和技术上的深入分析。 6. 性能优化成效:在演讲中,王仕军可能会分享美团通过性能优化带来的成效,这些成效可以是具体的性能指标的改进,或是用户满意度的提升以及业务数据的...

    基于PHP的爱特(aitecms)通用企业集团网站php版源码.zip

    总的来说,AiteCMS是一个全面的解决方案,旨在满足企业集团的复杂需求,提供一个易于管理和扩展的平台。通过学习和使用这个源码,开发者可以深入了解PHP CMS的开发和架构,提升自己的Web开发技能。

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

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

    仿58同城赶集网源码

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

    模板:以perl编写的模块化可扩展静态站点生成器

    这个基于Perl的模块化可扩展静态站点生成器结合了Perl的灵活性和强大的文本处理能力,以及模块化设计的优点,为用户提供了构建高效、安全且易于维护的静态网站的解决方案。通过使用不同的模块和模板,开发者可以根据...

Global site tag (gtag.js) - Google Analytics