freemarkerasp.net 伪静态页面面什么原理

一、FreeMarker简介
  1、动态网页和静态网页差异
   在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术。静态网页,随着HTML代码的生成,页面的内容和显示效 果就不会再发生变化(除非你修改页面代码)。而动态网页则不然,页面代码虽然没有发生变化,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而 发生相应的变化。简而言之,动态网页是基本的HTML语法规范与java、VB、VC等高级程序设计语言、数据库编程等多种技术的融合,以实现对网站内容 和风格的高效、动态和交互式的管理。
  通过前面的介绍我们可以得出动态网页和静态网页的优缺点(这里我们只考虑网站性能方面的相关问题,信息安全等多方面问题不做赘述):
  1)静态网页:
  a、静态网页的内容稳定,页面加载速度快。
  b、静态网页的没有数据库支持,在网站制作和维护方面的工作量较大。
  c、静态网页的交互性差,有很大的局限性。
  2)动态网页:
  a、交互性好。
  b、动态网页的信息都需要从数据库中读取,每打开一个一面就需要去获取一次数据库,如果访问人数很多,也就会对服务器增加很大的荷载,从而影响这个网站的运行速度。
   通过上面的比较我们不难看出,要提升网站的性能,我们只要把动态网页做成静态网页就会在运行速度方面有显著的提升,但是问题出来了,如果将所有页面都做 成静态页面显然是不切实际的。有什么办法能让我们的网站即能有动态网页的交互性,又有静态网页的加载速度呢?FreeMarker便能实现这样的需求:实 现动态网页静态化。
  2、FreeMarker原理
  FreeMarker是一个基 于Java的开发包和类库的一种将模板和数据进行整合并输出文本的通用工具,FreeMarker实现页面静态化的原理是:将页面中所需要的样式写入到 FreeMarker模板文件中,然后将页面所需要的数据进行动态绑定并放入到Map中,然后通过FreeMarker的模板解析类process()方 法完成静态页面的生成。其工作原理如图2-1所示。
模板&+ &数据模型&=&输出
二, 示例演示FreeMarker
先看一下Demo项目的整体结构:
上面我们已经说了,&模板 + &数据模型 =&输出, 那么我们就一个个看模板和数据模型是什么样子的, 以及最后的输出是什么样子的.
注: 这里将省略freemarker的语法, 因为很多都是类似EL表达式的, 这里只提供几种情况的讲解, 其中包括:
list, map, list和map混合
FMDemo.java:
1 public class FMDemo {
//Freemarker
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
//模板+数据模型 = 输出
//ftl: freemarker template
//第一步: 读取html模板
String dir = &C:\\workspace\\freemarker\\ftl\\&;
conf.setDirectoryForTemplateLoading(new File(dir));
Template template = conf.getTemplate(&freemarker.html&);
//第二步: 加载数据模型
Map root = new HashMap();
root.put(&world&, &世界你好&);
//List集合
List&String& persons = new ArrayList&String&();
persons.add(&范冰冰&);
persons.add(&李冰冰&);
persons.add(&何炅&);
root.put(&persons&, persons);
Map map = new HashMap();
map.put(&fbb&, &范冰冰&);
map.put(&lbb&, &李冰冰&);
root.put(&map&, map);
//list和map混合
List&Map& maps = new ArrayList&Map&();
Map pms1 = new HashMap();
pms1.put(&id1&, &范冰冰&);
pms1.put(&id2&, &李冰冰&);
Map pms2 = new HashMap();
pms2.put(&id1&, &曾志伟&);
pms2.put(&id2&, &何炅&);
maps.add(pms1);
maps.add(pms2);
root.put(&maps&, maps);
Writer out = new FileWriter(new File(dir + &hello.html&));
template.process(root, out);
System.out.println(&生成完成&);
freemarker.html: 模板文件
1 &!DOCTYPE html&
4 &meta charset=&UTF-8&&
5 &title&Insert title here&/title&
8 ${world}
11 &#list persons as person&
&#if person_index == 2&
${person}---红色
${person}---绿色
17 &/#list&&br/&
19 &#list map?keys as key&
${map[key]}
21 &/#list&
22 ${map.fbb}/${map.lbb}&br/&
24 &#list maps as map&
&#list map?keys as key&
${map[key]}
28 &/#list&
29 &#list maps as map&
${map.id1}///${map.id2}
31 &/#list&
32 &/body&
33 &/html&
执行FMDemo.java中的Main方法, 这会生成:
hello.html:
三, 静态化页面在项目中的使用
这里就来说下静态化页面在项目中的使用情况, 现在只是给商品详情页做了静态化处理.
前面关于ActiveMQ的文章已经说过, 当一个商品上架的时候, 通过发送消息来通知babasport-cms 来将对应的页面静态化.&
在这里我们只写接收消息的方法, 首先来看看babasport-cms的结构图:
CustomMessageListener.java:接收MQ中的消息
StaticPageServiceImpl.java:
使用Spring管理Freemarker配置文件:
1 &!-- 配置freemarker 实现类 --&
&bean class=&cn.itcast.core.service.StaticPageServiceImpl&&
&property name=&freeMarkerConfig&&
&bean class=&org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer&&
&!-- 设置模板所在目录或文件夹的位置, 相对路径
&property name=&templateLoaderPath& value=&/WEB-INF/ftl/& /&
&!-- 设置默认编码集 --&
&property name=&defaultEncoding& value=&UTF-8&&&/property&
&/property&
模板页面: product.html 中的改动:
引入其他页面:
&!-- header start --&
&#include &commons/header.html& /&
循环遍历colors:
1 &div class=&dd& id=&colors&&
&#list colors as color&
&div class=&item& onclick=&colorToRed(this,'${color.id}')&&
&a href=&javascript:;& title=&${color.name }& &
&img data-img=&1&
src=&/images/53f44cc2N0b714cb2_002.jpg&
alt=&灰色三件套& height=&25& width=&25&&&i&${color.name }&/i&&/a&
循环遍历imgUrls, 并且使用if..else 进行判断:
1 &div class=&spec-items&&
&ul class=&lh&&
&#list product.imgUrls as pic&
&#if pic_index == 0&
&li&&img data-img=&1& class=&img-hover&
alt=&${product.name}& src=&${pic}& width=&50& height=&50&&&/li&
&li&&img data-img=&1& alt=&${product.name}& src=&${pic}&
width=&50& height=&50& &&/li&
其他的照常使用EL表达式, 然后生成 id.html的静态化页面, 查看访问后的页面
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:810次
排名:千里之外java web(2)
FreeMarker生成静态页原理
&&&&& FreeMarker适合于作为Web应用的表现层。freemarker大致原理是:将页面中所需要的样式放入FreeMarker文件中,然后将页面所需要的数据动态绑定,并放入Map中,通过调用FreeMarker模板文件解析类process()方法完成静态页面的生成。了解了上面的原理,接下来我就一步 步带您实现FreeMarker生成静态页面。
一、 创建FreeMarker模板文件user.ftl
&!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN&&
& &meta http-equiv=Content-Type content=&text/ charset=utf-8&&
&&& &title&user.ftl&/title&
&&& ${user.userName}
&&& ${user.userPassword}
二、 创建FreeMarker模板文件动态绑定的数据对象类User.java(Sring中pojo)
//..省略包的导入
&&&&& public class User{
&private String userN
private String userP
…省略getter()与setter方法
三、 创建FreeMarker模板文件解析器类FreeMarkertUtil
FreeMarkertUtil.java
//省略包的导入
Public class FreeMarkerUtil{
//templatePath模板文件存放路径
//templateName 模板文件名称
//filename 生成的文件名称
public static void analysisTemplate(String templatePath,String templateName,String fileName,Map&?,?&root){
&& Configuration config=new Configuration();
& //设置要解析的模板所在的目录,并加载模板文件
& config.setDirectoryForTemplateLoading(new File(templatePath));
&& //设置包装器,并将对象包装为数据模型
&& config.setObjectWrapper(new DefaultObjectWrapper());
&&//获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
&//否则会出现乱码
Template template=config.getTemplate(templateName,“UTF-8”);
&& //合并数据模型与模板
&& FileOutputStream fos = new FileOutputStream(fileName);
&& Writer out = new OutputStreamWriter(fos,“UTF-8”);
&&&&& template.process(root, out);
&&&&& out.flush();
&&&&& out.close();
& } catch (IOException e) {
&& e.printStackTrace();
& }catch (TemplateException e) {
&& e.printStackTrace();
四、 创建FreeMarker生成静态页面测试类ClientTest.java
//..省略包的导入
public class ClientTest{
&public static void main(String[] args){
& User user=new User();
& user.setUserName(&张三&);
& user.setUserPassword(&123&);
&&Map&String,Object& root=new HashMap&String, Object&();
& root.put(&user&, user);
& String templatesPath=&D:/DevPlateForm/Eclipse/workspaces/freeMakerTest/src/templates&;
& String templateFile=&/user.ftl&;
& String htmlFile=templatesPath+&/user.html&;
&&& FreeMarkertUtil.analysisTemplate(templatesPath,templateFile,htmlFile,root);
注意: templatesPath为我机器上的FreeMarker模板文件存放路径。如果您要是测试的话,可以将此改为您创建的模板文件存放路径。好了,所有的工作都已经完成了,我们可以运行ClientTest类来测试了。
&本例在您的工程中运行时,必须导入freemarker.jar文件,否则不能编译。
&在我的工程中,您可以找到对应的文件。
五。freemarker变量值的获取
在Struts2框架下,Struts2框架充当了之前的Servlet角色,只要浏览器的请求经过Struts2处理后,Struts2都会自动加载FreeMarker模板,并使用数据模型来填充该模板,再将最后的HTML页面输出给客户端
Struts2解析FreeMarker模板中变量的顺序如下:
&1,FreeMarker模板内建的变量;
&2,ValueStack中的变量;
&3,ActionContext中的变量;
&4,HttpServletRequest中的属性;
&5,HttpSession中的属性;
&6,ServletContext范围的属性.
FreeMarker模板的内建变量有如下几个:
&1,stack:代表ValueStack本身,可通过如下方式来访问其中的变量&${stack.findString('ognl expr')}&
&2,action:代表刚刚执行过的Action实例
&3,response:代表HpptServletResponse实例
&4,res:代表HpptServletResponse实例
&5,request:代表HpptServletRequest实例
&6,req:代表HpptServletRequest实例
&7,session:代表HpptSession实例
&8,application:代表ServletContext实例
&9,base:代表用户请求的上下文路径.
六. 数据模式+模板=输出
&&&&& 这些例子是在简单的HTML中加入了一些由${…}包围的特定代码,这些特定代码是FreeMarker的指令,而包含FreeMarker的指令的文件就称为模板(Template)。
&&&& 至于user.name和latestProduct.name来自于数据模型(data model)。数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成。模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型。
&1、下面是一个可能的数据模型:
& +- user = &Big Joe&
& +- latestProduct
&&&&& +- url = &products/greenmouse.html&
&&&&& +- name = &green mouse&
数据模型类似于计算机的文件系统,latestProduct可以看作是目录。
2、数据模型
在快速入门中介绍了在模板中使用的三种基本对象类型:scalars、hashes 和sequences,其实还可以有其它更多的能力:
scalars:存储单值
hashes:充当其它对象的容器,每个都关联一个唯一的查询名字
sequences:充当其它对象的容器,按次序访问
方法:通过传递的参数进行计算,以新对象返回结果
用户自定义FTL标记:宏和变换器
通常每个变量只具有上述的一种能力,但一个变量可以具有多个上述能力,如下面的例子:
&+- mouse = &Yerri&
&&&& +- age = 12
&&&& +- color = &brown&&&
mouse既是scalars又是hashes,将上面的数据模型合并到下面的模板:
${mouse}&&&&&& &#-- use mouse as scalar --&
${mouse.age}&& &#-- use mouse as hash --&
${mouse.color} &#-- use mouse as hash --&&
输出结果是:
(2)Scalar变量
Scalar变量存储单值,可以是:
字符串:简单文本,在模板中使用引号(单引号或双引号)括起
数字:在模板中直接使用数字值
日期:存储日期/时间相关的数据,可以是日期、时间或日期-时间(Timestamp);通常情况,日期值由程序员加到数据模型中,设计者只需要显示它们
布尔值:true或false,通常在&#if …&标记中使用
(3)hashes 、sequences和集合
有些变量不包含任何可显示的内容,而是作为容器包含其它变量,者有两种类型:
hashes:具有一个唯一的查询名字和它包含的每个变量相关联
sequences:使用数字和它包含的每个变量相关联,索引值从0开始
集合变量通常类似sequences,除非无法访问它的大小和不能使用索引来获得它的子变量;集合可以看作只能由&#list …&指令使用的受限sequences
方法变量通常是基于给出的参数计算值。
下面的例子假设程序员已经将方法变量avg放到数据模型中,用来计算数字平均值:
The average of 3 and 5 is: ${avg(3, 5)}
The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
The average of the price of python and elephant is:
&&& ${avg(animals.python.price, animals.elephant.price)}
(5)宏和变换器
宏和变换器变量是用户自定义指令(自定义FTL标记),会在后面讲述这些高级特性
节点变量表示为树型结构中的一个节点,通常在XML处理中使用,会在后面的专门章节中讲
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:108517次
积分:1325
积分:1325
排名:千里之外
原创:10篇
转载:118篇
(1)(2)(2)(1)(1)(8)(7)(11)(6)(12)(30)(17)(1)(16)(13)君,已阅读到文档的结尾了呢~~
SpringMVC&Freemarker静态化页面的处理思路方法,解决,思路,静态化的,静态化,页面静态化,静态化处理,静态化解决,静态化页面,静态页面
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
SpringMVC&Freemarker静态化页面的处理思路
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Freemarker网站静态化的实现
做程序也做了将近4年时间了,从来没有发过什么技术性的文章,今天发一个只在大家一起共同学习进步,如有错误地方请指正。 &
最近自己做了一个做网络广告的网站叫的项目,由于网站首页上板块划分很多,不同板块的数据库查询方式不同,首页内容量巨大,如果按照 一般的动态jsp页面的话那么数据库查询将是巨大的开销,会导致首页访问速度的下降。于是考虑将这个首页全部静态化。参考地 址:/。首页的速度是非常快的。 &
整个网站才用struts2 + spring +
hibernate + freemarker +
urlrewrite完成。首页纯静态化,频道及其他页面通过urlrewrite伪静态。现在废话少说。我先给出首页jsp 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。
* 生成静态页面主方法
* @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");
//指定模版路径
Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");
template.setEncoding("UTF-8");
//静态页面路径
String htmlPath = context.getRealPath("/html")+"/"+targetHtmlP
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文件。 友情链接数据来源通过数据库查询获取。然后再写一个方法专门生成友情链接静态页面:
* 生成友情链接的静态页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中的一个方 法:
* 生成友情链接静态页index_link.html
public String createLink(){
//权限验证
if(! this.isAccess())
return "error";
//得到友情链接
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模版源码:
&#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方 法实时的生成静态页面。如果更新速度不慢可以在后台手动更新或者利用操作系统的定时任务功能去执行你的静态页面生成程序。这个 网站我是才用了这两种方式。本人第一次发帖,还请大家各抒己见,指正不足!
struts2本身就支持freemarker做前端表示,为何要在java端自己做渲染生成html呢?
说是纯静态的,其实仍然不是纯静态,jsp组装的那部分完全可以由服务器的ssi组件进行组装,那样的话,网站就可以完全脱离jsp容器运行,效率也高许多,另外,列表做成动态倒还可以,但为什么,正文不做成为静态呢?看了一下这个网站,打开很慢
没看出来哪里设置了这些静态页面的 缓存!要是没有缓存,那就是 在通常的情况下 多了一个要通过freemarker生成静态页面的过程,而换来的只是静态了而已。这样,多了一个操作,会比通常更慢!
真是大容量的首页,肯定要用静态。
至于首页的内容就用程序写,
主要目的是为了推广这个平台,而不是让大家去看这篇文章研究这个技术!
如果网站想用模板静态化的,最好是自己写标签,这样才能灵活。比如:
&mytag:list item="xxxx" pagesize="20" classid="体育用品" start="0" &
${xxxx.title}----${xxxx.pubdate}...............
&/mytag:list&
静态的好处是搜索引擎...
为什么我的页面上面显示&& The requested resource (/lottery/WEB-INF/web/sidebar/WEB-INF/web/sidebar/web_index_news.html) is not available&&& 这个。&& 我正在学习Freemarker,求教!!!!!
网站是不是倒闭了?
spring 可以去渲染 为什么要自己 生成html呢}

我要回帖

更多关于 freemarker 伪静态 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信