七 Freemarker(项目实现思路)
初始用
背景:目前的文章详情页是一 个普通html, 详情数据是需要经过请求发送到后端才能获得数据,静态化就是每个文章的页面都是独立的一个htm页面,不需要经过后端请求就能直接独立打开供用户浏览。而媒体类网站、或者电商商品页通常会进行页面静态化。
页面静态化的优点:
●更容易做SEO (被百度和某些其他搜索引擎收录)
●加速用户访问,先展示主体部分,也就是文章的详情,然后其他数据异步加载
●不经过url请求的同时也降低请求数据库的压力
常见的模板引擎: JSP, Freemarker Thymeleaf, Velocity.
FreeMarker是-款模板引擎:即- 种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的, 而是一个Java类库, 是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言,不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显已经准备好的数据。在模板中,你可以专注于如何展现数据,而在模板之外可以专注于要展示什么数据。
基础语法:
<html>
<head>
<title>Hello Freemarker</title>
</head>
<body>
<#--
Freemarker的构成语法:
1. 注释
2. 表达式
3. 指令
4. 普通文本
-->
<#-- 注释 -->
<#-- ${} 为变量表达式,同jsp -->
<#-- 输出字符串 -->
<div>hello ${there}</div>
</body>
</html>
实现方式(主要是在文章审核完就生成静态化界面):
-
创建了前端文章详情页的ftl模板存放在resource文件中,配置了输出路径后。融合文章类的动态数据生成html模板,减少了数据库的压力提升了用户体验。
-
通过远程rest调用articleId获得文章详情,将文章类存放到articleVO中,并将articleVO放在map中,调用template.procress生成静态页面。
-
文章阅读数需要单独获取,需要单独再写一个接口
改进
背景现在的静态化过程其实都是在同一台电脑上执行的,这样做的话前端后端必须同时部署在同一个服务器,耦合度很大。
解决措施我们可以接触gridfs作为中间存储介质,把生成的html上传,然后通知前端,让前端去gridfs 下载,前后端的程序就能在不同的服务器进行部署了。大大降低耦合度。
解耦后的静态化步骤
1.于是我再article的基础上新创建了html model工程,生成html,并且上传到gridfs中
2.获得mongoFileld,关联保存到文章表中
3.把mongoFileld发送至消费端,让其下载gridfs中的html到节点服务器进行发布创建消费端工程module
public String createArticleHTMLToGridFS(String articleId) throws Exception {
Configuration cfg = new Configuration(Configuration.getVersion());
String classpath = this.getClass().getResource("/").getPath();
cfg.setDirectoryForTemplateLoading(new File(classpath + "templates"));
Template template = cfg.getTemplate("detail.ftl", "utf-8");
// 获得文章的详情数据,使用rest远程调用
ArticleDetailVO detailVO = getArticleDetail(articleId);
Map<String, Object> map = new HashMap<>();
map.put("articleDetail", detailVO);
String htmlContent = FreeMarkerTemplateUtils.processTemplateIntoString(template,map);
//System.out.println(htmlContent);
InputStream inputStream = IOUtils.toInputStream(htmlContent);
ObjectId fileId = gridFSBucket.uploadFromStream(detailVO.getId()+".html",inputStream);
return fileId.toString();
}
删除部分:也是需要rest调用html model里的删除服务。
主要流程如下:
1.用户撤回或者删除文章后,查询该文章对应的html所在gridfs的mongoFileld
2.根据mongoFileld删除gridfs中的文件
3.编码消费端,删除系统路径中的htmI文件
4.生产端调用消费端完整htm文件删除动作
缺点:只是服务器进行解耦并没有对接口进行解耦,请看下一章rabbitmq