• 【模板引擎】freemarker模板引擎的常用命令介绍


     个人简介: 

    > 📦个人主页:赵四司机
    > 🏆学习方向:JAVA后端开发 
    > 📣种一棵树最好的时间是十年前,其次是现在!
    > ⏰往期文章:SpringBoot项目整合微信支付
    > 🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

    前言:

    1.前面基于Springboot的单体项目介绍已经完结了,至于项目中的其他功能实现我这里就不打算介绍了,因为涉及的知识点不难,而且都是简单的CRUD操作,假如有兴趣的话可以私信我我再看看要不要写几篇文章做个介绍。

    2.完成上一阶段的学习,我就投入到了微服务的学习当中,所用教程为B站上面黑马的微服务教程。由于我的记性不是很好,所以对于新事物的学习我比较喜欢做笔记以加强理解,在这里我会将笔记的重点内容做个总结发布到“微服务学习”笔记栏目中。我是赵四,一名有追求的程序员,希望大家能多多支持,能给我点个关注就更好了。

    目录

    一:🧸freemarker简介

    二:🧸环境搭建

    1.🧩创建工程&引入依赖

    2.🧩添加配置文件

    三:🧸模板测试

    1.🧩创建一个实体类用于测试

    2.🧩创建模板

    3.🧩创建Controller

    4.🧩创建启动类

    5.🧩进行测试

    四:🧸Freemarker常用语法

    1:🧩基础语法种类

    2:🧩集合指令(Map和List)

    2.1:🎃创建对应的controller

    2.2:🎃模板实现

    2.3:🎃测试

    3.🧩if指令

     4.🧩运算符

    4.1:🎃算术运算符

    4.2:🎃比较运算符

    4.3:🎃逻辑运算符

     5.🧩空值处理

    5.1:🎃判断某变量是否存在使用 “??”

    5.2:🎃缺失变量默认值使用 “!”

     6.🧩内建函数

    6.1:🎃和到某个集合的大小

    6.2:🎃日期格式化

    6.3:🎃内建函数c

    6.4:🎃将json字符串转成对象

    7.🧩静态化测试

    7.1:🎃修改application.yml文件

    7.2:🎃在test下创建测试类

    7.3:🎃结果展示


    一:🧸freemarker简介

            FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

            模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言,不是像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

    常用的java模板有jsp、Velocity、thmeleaf、freemarker等,它们之间的区别如下:

    1.Jsp 为 Servlet 专用,不能单独进行使用。

    2.Thymeleaf 为新技术,功能较为强大,但是执行的效率比较低。

    3.Velocity从2010年更新完 2.0 版本后,便没有在更新。Spring Boot 官方在 1.4 版本后对此也不在支持,虽然 Velocity 在 2017 年版本得到迭代,但为时已晚。

    4.Freemarker性能较好,是一款强大且轻量的模板语言。

    二:🧸环境搭建

    1.🧩创建工程&引入依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-freemarkerartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.bootgroupId>
    12. <artifactId>spring-boot-starter-testartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>org.projectlombokgroupId>
    16. <artifactId>lombokartifactId>
    17. dependency>
    18. <dependency>
    19. <groupId>org.apache.commonsgroupId>
    20. <artifactId>commons-ioartifactId>
    21. <version>1.3.2version>
    22. dependency>
    23. dependencies>

    2.🧩添加配置文件

    1. server:
    2. port: 8881 #服务端口
    3. spring:
    4. application:
    5. name: freemarker-demo #指定服务名
    6. freemarker:
    7. cache: false #关闭模板缓存,方便测试
    8. settings:
    9. template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
    10. suffix: .ftl #指定Freemarker模板文件的后缀名

    三:🧸模板测试

    1.🧩创建一个实体类用于测试

    1. package com.my.freemarker.entity;
    2. import lombok.Data;
    3. import java.util.Date;
    4. @Data
    5. public class Student {
    6. private String name;
    7. private int age;
    8. private Date birthday;
    9. private Float money;
    10. }

    2.🧩创建模板

    在resources下创建templates,此目录为freemarker的默认模板存放目录。

    在templates下创建模板文件 01-basic.ftl ,模板中的插值表达式最终会被freemarker替换成具体的数据。

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>Hello World!title>
    6. head>
    7. <body>
    8. <b>普通文本 String 展示:b><br><br>
    9. Hello ${name} <br>
    10. <hr>
    11. <b>对象Student中的数据展示:b><br/>
    12. 姓名:${stu.name}<br/>
    13. 年龄:${stu.age}
    14. <hr>
    15. body>
    16. html>

    3.🧩创建Controller

    1. package com.my.freemarker.controller;
    2. import com.my.freemarker.entity.Student;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.ui.Model;
    5. import org.springframework.web.bind.annotation.GetMapping;
    6. @Controller
    7. public class helloController {
    8. @GetMapping("/basic")
    9. public String helloTest(Model model){
    10. //1.纯文本形式参数
    11. model.addAttribute("name","freemarker");
    12. //2.实体类相关参数
    13. Student stu = new Student();
    14. stu.setName("小明");
    15. stu.setAge(19);
    16. stu.setMoney(100F);
    17. model.addAttribute("stu",stu);
    18. return "01-basic";
    19. }
    20. }

    4.🧩创建启动类

    1. package com.my.freemarker;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class FreemarkerApplication {
    6. public static void main(String[] args) {
    7. SpringApplication.run(FreemarkerApplication.class,args);
    8. }
    9. }

    5.🧩进行测试

    浏览器输入http:localhost:8881/basic

    96429a0b515d4b26aabef9c39a12ee89.png

    可以看到成功将数据展示出来。 

    四:🧸Freemarker常用语法

    1:🧩基础语法种类

    1.注释,即<#-- 内容 -->,介于其之间的内容会被freemarker当做注释处理

    2.插值(interpolation):即${..}部分,freeremarker会用真实的值代替${..}

    3.FTL指令:和HTML标记类似,名字前加#予以区分,Freeremarker会解析标签中的表达式或逻辑

    <# > FTL指令 

    4.文本,进文本信息,这些不是freeremarker的注释、插值、FTL指令的内容会被freeremarker忽略解析,直接输出其内容。

    2:🧩集合指令(Map和List)

    2.1:🎃创建对应的controller

    1. @GetMapping("/list")
    2. public String list(Model model){
    3. //------------------------------------
    4. Student stu1 = new Student();
    5. stu1.setName("小强");
    6. stu1.setAge(18);
    7. stu1.setMoney(1000.86f);
    8. stu1.setBirthday(new Date());
    9. //小红对象模型数据
    10. Student stu2 = new Student();
    11. stu2.setName("小红");
    12. stu2.setMoney(200.1f);
    13. stu2.setAge(19);
    14. //将两个对象模型数据存放到List集合中
    15. List stus = new ArrayList<>();
    16. stus.add(stu1);
    17. stus.add(stu2);
    18. //向model中存放List集合数据
    19. model.addAttribute("stus",stus);
    20. //------------------------------------
    21. //创建Map数据
    22. HashMap stuMap = new HashMap<>();
    23. stuMap.put("stu1",stu1);
    24. stuMap.put("stu2",stu2);
    25. // 3.1 向model中存放Map数据
    26. model.addAttribute("stuMap", stuMap);
    27. return "02-list";
    28. }

    2.2:🎃模板实现

    在templates包中添加"02-list.ftl"

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>Hello World!title>
    6. head>
    7. <body>
    8. <#-- list 数据的展示 -->
    9. <b>展示list中的stu数据:b>
    10. <br>
    11. <br>
    12. <table>
    13. <tr>
    14. <td>序号td>
    15. <td>姓名td>
    16. <td>年龄td>
    17. <td>钱包td>
    18. tr>
    19. <#list stus as stu>
    20. <tr>
    21. <td>${stu_index+1}td>
    22. <td>${stu.name}td>
    23. <td>${stu.age}td>
    24. <td>${stu.money}td>
    25. tr>
    26. table>
    27. <hr>
    28. <#-- Map 数据的展示 -->
    29. <b>map数据的展示:b>
    30. <br/><br/>
    31. <a href="###">方式一:通过map['keyname'].propertya><br/>
    32. 输出stu1的学生信息:<br/>
    33. 姓名:${stuMap['stu1'].name}<br/>
    34. 年龄:${stuMap['stu1'].age}<br/>
    35. <br/>
    36. <a href="###">方式二:通过map.keyname.propertya><br/>
    37. 输出stu2的学生信息:<br/>
    38. 姓名:${stuMap.stu2.name}<br/>
    39. 年龄:${stuMap.stu2.age}<br/>
    40. <br/>
    41. <a href="###">遍历map中两个学生信息:a><br/>
    42. <table>
    43. <tr>
    44. <td>序号td>
    45. <td>姓名td>
    46. <td>年龄td>
    47. <td>钱包td>
    48. tr>
    49. <#list stuMap?keys as key >
    50. <tr>
    51. <td>${key_index}td>
    52. <td>${stuMap[key].name}td>
    53. <td>${stuMap[key].age}td>
    54. <td>${stuMap[key].money}td>
    55. tr>
    56. table>
    57. <hr>
    58. body>
    59. html>

    2.3:🎃测试

    在浏览器地址栏输入http:localhost:8881/list

    54e17ed7486c4cd39f83f4610c3ee13e.png

     可以看到成功将数据展示

    3.🧩if指令

            if 指令即判断指令,是常用的FTL指令,freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否则跳过内容不再输出。

    <#if >

    使用list指令中的数据作为数据模型,将名字为“小红”的数据输出为红色

    1. <#list stus as stu>
    2. <#if stu.name = '小红'>
    3. <tr style="color: red">
    4. <td>${stu_index+1}td>
    5. <td>${stu.name}td>
    6. <td>${stu.age}td>
    7. <td>${stu.money}td>
    8. tr>
    9. <#else >
    10. <tr>
    11. <td>${stu_index+1}td>
    12. <td>${stu.name}td>
    13. <td>${stu.age}td>
    14. <td>${stu.money}td>
    15. tr>

    c9ed8ff291f848b19a4e9e1d070be22e.png

    可以看到成功将“小红”变为红色。

     4.🧩运算符

    4.1:🎃算术运算符

    FreeMarker表达式中支持+、-、*、/、%操作,只需要将运算表达式放入${}中即可。

    4.2:🎃比较运算符

    • =或者==:判断两个值是否相等.

    • !=:判断两个值是否不等.

    • >或者gt:判断左边值是否大于右边值

    • >=或者gte:判断左边值是否大于等于右边值

    • <或者lt:判断左边值是否小于右边值

    • <=或者lte:判断左边值是否小于等于右边值

    4.3:🎃逻辑运算符

    • 逻辑与:&&

    • 逻辑或:||

    • 逻辑非:!

    逻辑运算符只能作用于布尔值,否则将产生错误 。

     5.🧩空值处理

    5.1:🎃判断某变量是否存在使用 “??”

    用法为:variable??,如果该变量存在,返回true,否则返回false

    例:为防止stus为空报错可以加上判断如下:

    1. <#if stus??>
    2. <#list stus as stu>
    3.   ......

    5.2:🎃缺失变量默认值使用 “!”

    • 使用!要以指定一个默认值,当变量为空时显示默认值

      例: ${name!''}表示如果name为空显示空字符串。

    • 如果是嵌套对象则建议使用()括起来

      例: ${(stu.bestFriend.name)!''}表示,如果stu或bestFriend或name为空默认显示空字符串。

     6.🧩内建函数

    内建函数语法格式: 变量+?+函数名称

    6.1:🎃和到某个集合的大小

    ${集合名?size}

    6.2:🎃日期格式化

    显示年月日: ${today?date} 显示时分秒:${today?time} 显示日期+时间:${today?datetime} 自定义格式化: ${today?string("yyyy年MM月")}

    6.3:🎃内建函数c

    model.addAttribute("point", 102920122);

    point是数字型,使用${point}会显示这个数字的值,每三位使用逗号分隔。

    如果不想显示为每三位分隔的数字,可以使用c函数将数字型转成字符串输出

    ${point?c}

    6.4:🎃将json字符串转成对象

    一个例子:

    其中用到了 assign标签,assign的作用是定义一个变量。

    1. <#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
    2. <#assign data=text?eval />
    3. 开户行:${data.bank} 账号:${data.account}

    7.🧩静态化测试

            之前的测试都是SpringMVC将Freemarker作为视图解析器(ViewReporter)来集成到项目中,工作中,有的时候需要使用Freemarker原生Api来生成静态内容,下面一起来学习下原生Api生成文本文件(这里选择生成html文件)。

    7.1:🎃修改application.yml文件

    添加以下模板存放位置的配置信息,完整配置如下:

    1. server:
    2. port: 8881 #服务端口
    3. spring:
    4. application:
    5. name: freemarker-demo #指定服务名
    6. freemarker:
    7. cache: false #关闭模板缓存,方便测试
    8. settings:
    9. template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
    10. suffix: .ftl #指定Freemarker模板文件的后缀名
    11. template-loader-path: classpath:/templates #模板存放位置

    7.2:🎃在test下创建测试类

    1. package com.my.freemarker.test;
    2. import com.my.freemarker.FreemarkerApplication;
    3. import com.my.freemarker.entity.Student;
    4. import freemarker.template.Configuration;
    5. import freemarker.template.Template;
    6. import freemarker.template.TemplateException;
    7. import org.junit.jupiter.api.Test;
    8. import org.junit.runner.RunWith;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.boot.test.context.SpringBootTest;
    11. import org.springframework.test.context.junit4.SpringRunner;
    12. import java.io.FileWriter;
    13. import java.io.IOException;
    14. import java.util.*;
    15. @SpringBootTest(classes = FreemarkerApplication.class)
    16. @RunWith(SpringRunner.class)
    17. public class FreemarkerTest {
    18. @Autowired
    19. private Configuration configuration;
    20. @Test
    21. public void test() throws IOException, TemplateException {
    22. //freemarker模板对象,获取模板
    23. Template template = configuration.getTemplate("02-list.ftl");
    24. Map params = getData();
    25. template.process(params,new FileWriter("d:/headlinesPro/list.html"));
    26. }
    27. private Map getData() {
    28. Map map = new HashMap<>();
    29. //数据模型构建
    30. Student stu1 = new Student();
    31. stu1.setName("小强");
    32. stu1.setAge(19);
    33. stu1.setMoney(100F);
    34. stu1.setBirthday(new Date());
    35. Student stu2 = new Student();
    36. stu2.setName("小红");
    37. stu2.setAge(20);
    38. stu2.setMoney(1000F);
    39. stu2.setBirthday(new Date());
    40. //将两个对象放入List
    41. List list = new ArrayList<>();
    42. list.add(stu1);
    43. list.add(stu2);
    44. //向map中存放list数据
    45. map.put("stus",list);
    46. //创建mao数据
    47. HashMap stuMap = new HashMap<>();
    48. stuMap.put("stu1",stu1);
    49. stuMap.put("stu2",stu2);
    50. //向Map中存放Map数据
    51. map.put("stuMap",stuMap);
    52. return map;
    53. }
    54. }

    7.3:🎃结果展示

    e12d5644cf4645fb86b8dca4b76b8d62.png

     可以看到成功生成html文件,打开文件:

    51f2e0431eb44fcfb1eb85b389d5a704.png

  • 相关阅读:
    PDF如何转word文档
    Linux-笔记 samba实现映射网络驱动器到Win 10
    利用快速排序的思想寻找第k小的元素
    HALCON边缘检测
    抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会
    从maven开始你的spring开发
    asp.net校园二手交易平台系统VS开发sqlserver数据库web结构c#编程计算机网页
    图像增强技术与OpenCV实现
    vue3学习(十一)--- v-model
    CSP模拟53联测15 D. 子序列
  • 原文地址:https://blog.csdn.net/weixin_45750572/article/details/125822174