随笔-67  评论-522  文章-0  trackbacks-0
    通过之前的基于SSM3框架FreeMarker自定义指令(标签)实现这篇文章的介绍,我们对FreeMarker有了一个基本了解,这次大象将使用FreeMarker模板引擎,实现生成静态页的功能。
    我们在开发某个访问很频繁的页面时,首先想到的优化方式就是用缓存,将数据放到缓存中,但是对于大并发量访问的网站,这样做往往系统也吃不消,进一步的改进就是需要将页面静态化,现在的网站都是采用这种做法,访问一个静态html页面,不管是从速度上,还是性能上显然要比直接访问服务器好得多。
    要想用FreeMarker模板引擎实现页面静态化,首先就要有一个模板,模板的定义一般可以有两种方式:
    1、定义一个模板文件
    2、将模板保存到数据库
    本例中,大象将采用第二种做法,这个例子主要是讲怎么实现静态化,因此没有这个模板的CURD操作。另外大象还想说的是,一般操作静态化是放在后台系统,如果网站与后台是同一个主机,那么生成的静态页面可以直接定义到网站的目录下面。但如果网站与后台是分开的两个服务器,那么就需要将生成的静态页放在后台系统的某个目录下面,然后用rsync同步到网站的主机。
    首先新建template
CREATE TABLE `template` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `name` varchar(20DEFAULT NULL COMMENT '模板名称',
  `path` varchar(20DEFAULT NULL COMMENT '外部路径',
  `content` varchar(500DEFAULT NULL COMMENT '模板内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    content字段可以根据实际情况设置,这个表也只是一个参考,所有的都要根据实际开发的需求来设计。
    Template及其Service
    表映射的Pojo类我就不写了,TemplateService写法和UserService一样,根据本例有两个方法,一是从数据库取得对应的模板记录,二是进行生成静态文件前的一些处理工作。
    
    增加ssm3.properties
    上图中Context.getProperty()方法是从ssm3.properties中读取的,我在这个文件中定义了静态文件生成路径和URL访问地址,这样可以方便配置。
    
    这两个配置需要根据各人的实际情况来定,我因为是直接运行Jetty来启动程序,所以目录结构就是我的项目代码目录。
    为了简化代码,我直接将生成静态化的入口代码写在了HelloController里面。
    
    generateFile接收Ajax方式提交,返回结果包含中文字符,所以还需要对字符串进行编码。
    
    而操作入口也在hello.html页面,因为本例只作演示,所以我将数据库template表的主键ID直接写到ajaxurl里面了,实际开发请不要这样做。
    这些做完后,让我们再来看看模板
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>主页模板</title></head>
    <body>
        <h1>${content}</h1>
        <h1><href="${ctx}/hello">进入hello</a></h1>
    </body>
</html>
    这个模板很简单,接收两个插值变量contentctx,在TempateService类的generateFile方法中是不是已经看到了?其实不光可以传递简单的字符串,还可以将ObjectList、指令标签等东西加入到模板中,只要名称一致,使用方式正确就可以生成任何你想要的页面。
    通过数据库取出的这个模板说到底其实就是一串字符串,而FreeMarker引擎生成静态页面是需要模板加载器的。在这里,我们使用freemarker.cache.StringTemplateLoader模板加载器,通过freemarker.template.Configuration这个对象来设置及管理模板、各种配置信息及参数设置。具体请看源码的com.bolo.freemarker.util.GenerateFileUtil
    最后我们要修改servlet-context.xml里面的<mvc:view-controller path="/" view-name="forward:index.htm" />index.htm就是我们生成的静态文件名称,好了,先进入http://localhost:8081/hello让我们来生成静态文件。(端口号请按自己的来)
    
    OK,现在静态页生成好了,去看看吧!输入http://localhost:8081/
    
    到这里,关于使用使用FreeMarker模板生成静态页的介绍就讲完了,如果有什么不对的地方还请大家指出来。谢谢!
    源码下载: ssm3-template   
    本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo
posted on 2014-04-04 16:55 菠萝大象 阅读(5166) 评论(7)  编辑  收藏 所属分类: Spring3

评论:
# re: 基于SSM3框架使用FreeMarker模板生成静态页的实现 2014-04-09 10:46 | 王凯文
大象哥 , 这几天在你的博客学习 ,很感谢你能分享这么多~
ssm3我发现了一个问题 不知道是不是我本地的,
比如 我在html页面改一点点东西 ,刷新页面后 ,新的参数没有响应出来 ,必须要重启一下项目!这个问题怎么解决呢?  回复  更多评论
  
# re: 基于SSM3框架使用FreeMarker模板生成静态页的实现 2014-04-11 17:19 | 菠萝大象
@王凯文
请找到servlet-context.xml文件的这行<prop key="template_update_delay">18000</prop>,这是因为我设置的刷新时间太长了  回复  更多评论
  
# re: 基于SSM3框架使用FreeMarker模板生成静态页的实现 2015-01-27 14:55 | shantouyyt
请教一下:
1、将数据库template表的主键ID直接写到ajax的url里面了,实际开发请不要这样做,为什么不要这么做?
2、生成静态页面的内容${content}是动态的,那不是每当${content}内容改变的时候,都要重新生成一个页面?不知道是不是这样理解?  回复  更多评论
  
# re: 基于SSM3框架使用FreeMarker模板生成静态页的实现 2015-01-27 17:01 | 菠萝大象
@shantouyyt
1、ID值是从数据库取的,这里应该是个变量
2、如果你生成的静态页名字不变,那就只会覆盖你之前的文件  回复  更多评论
  
# re: 基于SSM3框架使用FreeMarker模板生成静态页的实现 2015-01-27 21:02 | shantouyyt
@菠萝大象
不是,可能是我表达不好。假如下面是模板
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>主页模板</title></head>
<body>
<h1>${content}</h1>
</body>
</html>
第一次生成静态页的时候,从数据库中读取content的内容是“1”
第二次生成的时候的时候,从数据库中读取content的内容变为“2”,content内容时刻变化着,是不是不能用静态页??
  回复  更多评论
  
# re: 基于SSM3框架使用FreeMarker模板生成静态页的实现 2015-01-27 21:09 | shantouyyt
@shantouyyt
对于内容时刻变化着的应该不能用静态化是吧?静态化页面一般用在什么地方?新闻资讯?  回复  更多评论
  
# re: 基于SSM3框架使用FreeMarker模板生成静态页的实现 2015-01-28 08:46 | 菠萝大象
@shantouyyt
你首先要弄清楚的是,静态页是干嘛的,静态资源的优势在哪里?
静态资源最大的好处是不用访问Web服务器,比如直接访问静态资源服务器,比如在CDN上缓存起来。这样不经过Web服务器了,你想想这样会快多少?并发会提高多少?一般网站的首页都会是静态页。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: