- 浏览: 1336182 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
最近自己做了一个做网络广告的网站叫全方位商机平台的项目,由于网站首页上板块划分很多,不同板块的数据库查询方式不同,首页内容量巨大,如果按照一般的动态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方法实时的生成静态页面。如果更新速度不慢可以在后台手动更新或者利用操作系统的定时任务功能去执行你的静态页面生成程序。
评论
[*]
引用[u][/u]
[/list]
发表评论
-
Smack 体系结构
2011-09-20 11:17 4028Smack 体系结构 Zhuam (zhuam... ... -
gson
2011-09-06 20:59 1950Gson User Guide Con ... -
缓存总结
2010-10-25 22:56 1126XXXX项目是目前在实际工作中正在做的事情,该项目是一个大 ... -
freemarker 基本指令
2010-10-25 22:47 1416一:if指令: <#if condition>.. ... -
用freemarker生产静态页面
2010-10-25 22:46 2279FreeMarker概述 * FreeMarker是一 ... -
通用大型网站页面静态化解决方案(二)
2010-10-25 22:44 3254在开发大型网站时,避免不了处理大量的页面静态化操作,这样方便加 ... -
如何在spring框架中解决多数据源的问题
2010-10-24 16:23 1626在我们的项目中遇到这 ... -
NetLog 大规模应用实战:Database-sharding 技术
2010-10-24 15:19 1521一、背景 Netlog是一家社交网站社区,目前拥有大规模的应 ... -
java利用poi读写Excel需要注意的问题
2010-10-20 10:17 5397接到用Java进行数据库与 ... -
FreeMarker demo
2010-08-25 14:53 3926写道 import freemarker.templ ... -
jfreechart demo2
2010-06-29 00:52 3293写道 package com.ijo.demo; impor ... -
jfreechart demo
2010-06-28 22:25 1790写道 package com.ijo.demo; impor ... -
openfire
2010-04-19 18:03 1167openfire http://openfireteam.b ... -
利用 DWR 开发基于 Ajax 的文件上载 portlet
2010-03-30 16:23 1492... -
采用dwr+ajax和struts开发文件上传进度条(转)
2010-01-22 00:16 1803采用dwr+ajax和struts开发文件上传进度条 编 ... -
采用dwr+ajax和struts开发文件上传进度条(转)
2010-01-22 00:11 1556采用dwr+ajax和struts开发文件上传进度条 编 ... -
dwr3 反转ajax例子
2009-12-28 13:23 4421这段时间我主要对jQuery学习和研究,当学习的了Ajax的实 ...
相关推荐
多个文件服务器读写,这里可采用SMB协议 页面静态化,可采用freemarker开源框架 如果考虑到大量的读写请求,则将请求分布式或采用调度的办法来解决 第一点我们首先应该考虑文件服务器与静态页面的映射关系,即什么...
总之,通用静态页面生成系统整合了参数化数据获取、模板引擎技术和JSP分页技术,提供了一个高效、可扩展且易于维护的解决方案,旨在帮助网站提升性能和用户体验。它不仅对开发团队来说是一个强大的开发工具,能够...
对于ASP环境下的网站开发者和管理员来说,这是一个非常实用的解决方案,它通过静态化处理降低了服务器压力,提高了用户体验,同时也方便了搜索引擎的爬取,对于提升网站的在线可见性具有积极意义。通过深入学习和...
总的来说,通用静态页面生成服务是现代Web开发中不可或缺的一部分,它结合了多线程技术和Windows服务的特性,为企业级网站提供了高效、灵活的解决方案。通过定制和优化,我们可以构建出更符合业务需求的静态页面生成...
### 电子商务网站的快速SEO解决方案 #### 一、引言 随着互联网的普及与发展,电子商务已成为现代商业活动中不可或缺的一部分。为了提升电子商务网站的可见度、吸引更多潜在客户并提高转化率,搜索引擎优化(SEO)...
综上所述,【大型电子商城源码】是一个全面的电子商务解决方案,涵盖了从后端业务逻辑处理、数据库交互、前端展示到支付接口集成的各个环节。理解和掌握这些知识点对于开发和维护一个成功的在线商城至关重要。
【基于XML的自动化信息发布方案】 XML(eXtensible Markup Language)是一种强大的...它可以简化网站的构建,提高信息发布的速度,同时保持了信息的结构化和可移植性,为中小型网站提供了经济实用的信息发布解决方案。
【描述】:“(Java+JSP)可二次开发Extjs4.0通用后台管理系统源码完整大型项目”描述了一个完整的系统解决方案,它不仅包括了后端服务器逻辑,还涵盖了前端用户界面的设计。由于采用的是Extjs4.0,所以系统的界面应该...
综上所述,这个“蓝色企业集团网站html静态模板”是一个全方位的解决方案,适合那些希望快速建立专业集团网站的企业。它包含了一系列常见的企业网站所需页面,设计风格统一且专业,易于定制和部署。同时,由于是静态...
【精典通用企业网站管理系统】是一款专为各类企业提供高效、便捷的网站管理解决方案。这款系统以其全面的功能、灵活的配置和强大的后台管理能力,深受广大企业和开发者喜爱。"吐血大放送"的表述,意味着这是一份非常...
是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。采用人性化的Windows操作方式开发,运行速度快,服务器资源占用更少;无论在稳定...
突破这些瓶颈通常需要创新的解决方案和技术上的深入分析。 6. 性能优化成效:在演讲中,王仕军可能会分享美团通过性能优化带来的成效,这些成效可以是具体的性能指标的改进,或是用户满意度的提升以及业务数据的...
总的来说,AiteCMS是一个全面的解决方案,旨在满足企业集团的复杂需求,提供一个易于管理和扩展的平台。通过学习和使用这个源码,开发者可以深入了解PHP CMS的开发和架构,提升自己的Web开发技能。
是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。采用人性化的Windows操作方式开发,运行速度快,服务器资源占用更少;无论在稳定...
北京信息超市源码,本分类信网程序基于asp+mssql技术开发的分类信息程序,是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。...
这个基于Perl的模块化可扩展静态站点生成器结合了Perl的灵活性和强大的文本处理能力,以及模块化设计的优点,为用户提供了构建高效、安全且易于维护的静态网站的解决方案。通过使用不同的模块和模板,开发者可以根据...
是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。采用人性化的Windows操作方式开发,运行速度快,服务器资源占用更少;无论在稳定...