品优购第十二天freemarker理解

  1. 什么是freemarker

FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。 FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅 可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。

网页静态化解决方案在实际开发中运用比较多,对于大篇幅的广告文本之类的数据,是不适合放入缓存中的(内存资源有限,且比较昂贵),所以我们采用网页静态化的技术解决

模板引擎是什么?

模板引擎是以业务逻辑层和表现层分离为目的的,将规定格式的模板代码转换为业务数据的算法实现。

它可以是一个过程代码、一个类,甚至是一个类库。不同的模板引擎其功用也不尽相同,但其基本原理都差不多。

模板引擎的基本机理就是替换(转换),将指定的标签转换为需要的业务数据;将指定的伪语句按照某种流程来变换输出

Spring-boot支持FreeMarker、Thymeleaf、jsp、veocity,但是对freemarker和thymeleaf的支持最好,不推荐使用jsp

使用jsp弊端:

1:项目目录结构繁琐

2:页面不简洁

3:jsp内置错误页面不能覆盖springboot默认的错误页面

4:只能打成war不能打成jar

5:内置的jetty服务器不支持jsp

性能方面freemarker更好。

 

     2.为什么要用到freemarker

对于电商的商品的详细页来说,至少有几百万个商品,每个商品又有大量的信息,如果用户每次查看商品详情的时候都需要到数据库去进行查询的话,对数据库无疑是一种非常巨大的压力,而且,Tomcat能够支持的并发一般在300到500的样子,在高并发的情况下,是根本行不通的。

所以,这样的情况适用于网页静态化来解决,使用模板引擎把数据往模板里面进行填充生成一个个的静态化的页面,那么用户访问的时候看到的就是已经生成好了的页面而不需要再去数据库查询数据,减少了数据库的压力。同时,对于静态资源,可以把它部署到Nginx服务器上,Nginx服务器可以支持5万的并发,这样又可以解决一部分并发的问题。

 

    3.Freemarker中常用的指令有哪些?

一般,模板文件的后缀名是.ftl

模板文件中四种元素

1、文本,直接输出的部分  

2、注释,即<#--...-->格式不会输出 

3、插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出

4、FTL 指令:FreeMarker 指令,和 HTML 标记类似,名字前加#予以区分,不会输出。

<body>

<#--include指令,引用-->
<#include "head.ftl">
<#--我是一个注释,我不会有任何输出-->
<#--插值-->
${name},你好。${message}
<br>

<#--assign指令-->
<#--定义简单类型-->
<#assign linkman="周先生">
${linkman}

<#--定义对象类型-->
<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
电话: ${info.mobile} 地址: ${info.address}
<br>

<#--if指令-->
<#--在freemarker中==和=都是一样的-->
<#if success=true>
   你已通过实名认证
    <#else>
    你未通过实名认证
</#if>
<br>

<#--list指令-->
----商品价格表----<br>
<#list goodsList as goods>
    ${goods_index+1}商品名称:${goods.name} 价格:${goods.price}<br>
</#list>

<#--内建函数-->
<#--获取集合大小-->
一共${goodsList?size}条记录;
<br>

<#--转换JSON字符串为对象-->
<#assign text="{'bank':'工商银行','account':'10101920201920212'}"/>
<#assign data=text?eval>
开户行:${data.bank} 账号:${data.account}
<br>

<#--日期格式化-->
当前日期:${today?date}<br>
当前时间:${today?time}<br>
当前日期+时间:${today?datetime}<br>
日期格式化:${today?string("yyyy年MM月")}
<br>

<#--数字转化为字符串-->
累计积分:${point?c}<br>

<#--空值处理运算符-->
<#if aaa??>
    aaa变量存在
<#else >
    aaa变量不存在
</#if>
<br>

${bbb!'bbb变量不存在'}<br>

<#--比较运算符-->
<#if (point>100000)>
   黄金会员
</#if>

</body>

    4.FreeMarkerThymeleaf的比较

FreeMarker是一种更符合我们写代码习惯的编程式模板引擎。

使用FreeMarker的模板相比较于Thymeleaf而言,我们只需要思考如何展现数据以及展示哪些数据。比如之前我们用一个判断会这么写:

<#if ${isBig}>Wow!</#if>

而在使用Thymeleaf时,我们首先得考虑我们的DOM(文档对象)是什么,而不仅仅是把判断的逻辑放在哪里。比如用Thymeleaf写一段判断的代码:
 

<div th:switch="${user.role}">
    <p th:case="'admin'">User is an administrator</p>
    <p th:case="#{roles.manager}">User is a manager</p>
    <p th:case="*">User is some other thing</p>
</div>

从这里就可以看出使用Thymeleaf编程实在是太繁琐了。

 

当然,Thymeleaf也并不是一无是处,它还是有一些FreeMarker无法替代的优点的:

1. Thymeleaf可以支持很好地前端浏览器的渲染。

2. Thymeleaf代码直接嵌入在标签和标签属性中对标签和属性操作比较方便.(根据服务端返response返回的数据,通过Thymeleaf来生成html标签)

 

也就是说, Thymeleaf适合做服务器端渲染, 通过服务器端模版渲染,客户端收到的是在服务器端根据模版渲染完的html信息. 例如前端使用:bootstrap时适合用Thymeleaf.

 

但是,当我们的项目使用了easyui等前端框架时,仍然建议使用FreeMarker:

因为:

1freemaker性能比thymeleaf

2:使用了easyuiui框架很少对html 标签和标签属性进行手动处理,都是通过ajax返回json数据,ui框架的组件直接渲染

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页