七 Freemarker(项目实现)

七 Freemarker(项目实现思路)

初始用

背景:目前的文章详情页是一 个普通html, 详情数据是需要经过请求发送到后端才能获得数据,静态化就是每个文章的页面都是独立的一个htm页面,不需要经过后端请求就能直接独立打开供用户浏览。而媒体类网站、或者电商商品页通常会进行页面静态化。

页面静态化的优点:
●更容易做SEO (被百度和某些其他搜索引擎收录)
●加速用户访问,先展示主体部分,也就是文章的详情,然后其他数据异步加载
●不经过url请求的同时也降低请求数据库的压力

常见的模板引擎: JSP, Freemarker Thymeleaf, Velocity.

​ FreeMarker是-款模板引擎:即- 种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的, 而是一个Java类库, 是一款程序员可以嵌入他们所开发产品的组件。
​ 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言,不是像PHP那样成熟的编程语言。那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显已经准备好的数据。在模板中,你可以专注于如何展现数据,而在模板之外可以专注于要展示什么数据。
七 Freemarker(项目实现)
基础语法:

<html>
<head>
    <title>Hello Freemarker</title>
</head>
<body>
<#--
    Freemarker的构成语法:
    1. 注释
    2. 表达式
    3. 指令
    4. 普通文本
-->

<#-- 注释 -->
<#-- ${} 为变量表达式,同jsp -->

    <#-- 输出字符串 -->
    <div>hello ${there}</div>
</body>
</html>

实现方式(主要是在文章审核完就生成静态化界面):

  1. 创建了前端文章详情页的ftl模板存放在resource文件中,配置了输出路径后。融合文章类的动态数据生成html模板,减少了数据库的压力提升了用户体验。

  2. 通过远程rest调用articleId获得文章详情,将文章类存放到articleVO中,并将articleVO放在map中,调用template.procress生成静态页面。

  3. 文章阅读数需要单独获取,需要单独再写一个接口

改进

背景现在的静态化过程其实都是在同一台电脑上执行的,这样做的话前端后端必须同时部署在同一个服务器,耦合度很大。

解决措施我们可以接触gridfs作为中间存储介质,把生成的html上传,然后通知前端,让前端去gridfs 下载,前后端的程序就能在不同的服务器进行部署了。大大降低耦合度。
七 Freemarker(项目实现)
解耦后的静态化步骤
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

上一篇:QtCreator 自动在文件开头添加版权注释信息


下一篇:scrapy框架之递归解析和post请求