cms内容管理系统之页面静态化技术:
cms是内容管理系统,是一种位于WEB 前端和后端办公系统或流程之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
1页面静态化技术
使用了FreeMarke模板引擎,模板是以.ftl为后缀的
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
静态页面是指页面写好之后,页面中展示的内容不会随着时间的推移或者后台数据库操作而发生改变.
页面静态化是以空间换时间的方式,在添加和修改对象时就生成静态页面,访问时实际访问的是一个静态页面
优点;
1.降低查询数据库的次数,减轻数据库的压力,提高查询效率
2.提高用户体验度好,因为响应速度快
3.大型的网站例如淘宝,京东都是用了页面静态化技术
2使用页面静态化技术步骤:
1.重要:模板(.ftl)和数据(Map对象或Java实体 ,但是List集合不行)
2.导入freemarker.jar
3.获取模板(Template)对象
4.准备数据
5.template.process()生成静态资源
6.创建xxx.ftl模板—模板中使用el表达式获取数据
便于开发使用,可以将它封装成工具类:
public class FreeMarkerUtil {
//loadUrl 加载的路径, templatename 模板的名称 。.ftl结尾 obj根据模板生成页面中的数据 suff生成 的页面以什么做后缀
public static String getFreeMarker(String loadUrl, String templatename,Object obj,String suff){
FileWriter out=null;
try {
// 2.获取模板(Template)对象
// 获取Configuration对象 -- 为了获取模板对象
Configuration config = new Configuration(Configuration.VERSION_2_3_28);
// 设置默认加载路径
File file = new File(loadUrl);
config.setDirectoryForTemplateLoading(file);
// 设置默认编码
config.setDefaultEncoding("utf-8");
// 获取模板
Template template = config.getTemplate(templatename);
// 3.准备数据
// map
// java实体对象
// 4.template.process()生成静态资源
long time = System.currentTimeMillis();
String url=time+suff;
out = new FileWriter(new File(file,url));
template.process(obj, out);
return url;
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(out!=null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
封装工具类时,为了生成的页面不会重复,重构文件名用的是时间戳,生成的页面不会重复
测试页面静态化功能:添加操作时生成静态页面
以文章为例;在页面添加一篇文章展示出来
1.在添加文章的service中使用TemplateUtil工具类和文章详情模板,生成相应的静态页面
2.编写article.ftl 模板 :代码
<script type="text/javascript">
$(function(){
// 获取url
var path=window.location.href;
// 截取
var url=path.substring(path.lastIndexOf("/")+1);
$.ajax({
type:"post",
data: "url="+url, // {"url":url}
url: "/home/updateClickCount",
success:function(msg){
$("#clickCount").text(msg.clickCount)
}
});
});
</script>
3.重构Controller的save方法
4.在添加之前获得文章的url ,把url放到Article对象 再执行添加方法
添加代码实现:
@Override
public void add(Article article, HttpServletRequest req) {
// 获得当前项目下部署路径
String path = req.getServletContext().getRealPath("/static/template");
// 模版
String url =FreeMarkerUtil.getFreeMarker(path, "article.ftl", article, ".html");
article.setUrl(url);
articleMapper.add(article);
}
删除操作页面静态化:
1.需要删除数据库的数据,还要删除应该将之前的静态资源删除
2. 通过id获得article对象,再通过article对象得到url
3. 再由url 获得静态资源文件的路径
4. 再判断静态资源文件是否存在 ,存在就删除
// 删除
@Override
public void deleteById(Integer id,HttpServletRequest req) {
//通过id查询url 通过id获得article对象 点url
Article article= articleMapper.findById(id);
String url = article.getUrl();
// 删除
articleMapper.deleteById(id);
// 获得当前项目下部署路径
String path = req.getServletContext().getRealPath("/static/template");
// 获得file 删除静态页面
File file = new File(path, url);
if(file.exists()){ // 文件存在就删除
file.delete();
}
}
3.修改生成的静态网页
1.找到文件路径,通过id 获得文章对象 ,把url 设置到原来article对象中
2.删除之前的静态资源 :拿到之前的url的文件路径 file.delete();
代码实现:
@Override
public void update(Article article,HttpServletRequest req) {
// 获得当前项目下部署路径
String path = req.getServletContext().getRealPath("/static/template");
// 模版
String url = FreeMarkerUtil.getFreeMarker(path, "article.ftl", article, ".html");
System.out.println(url);
// 获取原来的url 删除掉
//通过id 获得文章对象 ,把url 设置到dbarticle对象中
Article dbArticle = articleMapper.findById(article.getId());
article.setUrl(url);
// 更新
articleMapper.update(article);
// 删除之前的静态资源
File file = new File(path, dbArticle.getUrl());
if(file.exists()){ //如果这个文件存在就删除
file.delete();
}
}