FreeMarker的介绍和快速入门

作者: 右耳菌 | 来源:发表于2022-05-02 00:27 被阅读0次

    一、了解FreeMarker

    1. 什么是FreeMarker

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

    2. FreeMarker的工作机制
    FreeMarker的工作机制
    3. FreeMarker的官方文档
    4. FreeMarker的特点
    • 彻底的分离表现层和业务逻辑
    • 性能好,提高了开发效率
    • 使得开发过程中的人员分工更加明确
    • 学习成本低
    • 支持表达式、宏定义(类似JSP标签)

    二、FreeMarker的基本语法

    1. 数据类型
    • 标量:标量是最基本,最简单的数值类型
    内容 说明
    字符串 表示简单的文本
    数字 整数和非整数是不区分的,只有单一的数字类型
    布尔值 布尔值代表了逻辑上的对或错(是或否)
    日期/时间(日期,时间或日期时间) 日期变量可以存储和日期/时间相关的数据
    • 容器:这些值存在的目的是为了包含其他变量
    内容 说明
    哈希表 类似于Java中的HashMap,不记录内部元素的顺序,仅仅通过名称来访问数据
    序列 类似于Java中的集合List,可以通过下标进行访问,从0开始
    集合 从模板设计者角度来看,集合是有限制的序列,不能获取集合的大小,也不能通过索引取出集合中的子变量,但是它们仍然可以通过list指令来遍历
    • 子程序
    内容
    方法和函数
    用户自定义指令
    2. 算术运算符
    • 数字运算
    运算符 例子
    + 10+3= 13
    - 10-3=7
    * 10*3=30
    / 10/3=3.333
    % 10 %3=1
    • 字符串运算
      1.可以使用${..}在文本部分插入表达式的值,例如:${"Hello ${user}!"}
      2.可以使用+操作符获得同样的结果:${"Hello " +user+ "!"}
      3.${..}只能用于文本部分,下面的代码是错误的:<#if ${isBig}>Wow!</#if>应该写成:<#if isBig>Wow!</#if>
      4.假设user的值为“zhangsan”:${user[O]]${user[4]}结果是:zg$[user[1..4]}结果是:hang

    • 在线测试网站
      https://try.freemarker.apache.org/

      freemarker在线测试网站
    3. 逻辑、比较运算符
    • 逻辑运算符
    符号 说明
    && 逻辑与
    || 逻辑或
    ! 逻辑非
    • 比较运算符
    符号 说明
    >(gt) 大于号,推荐使用gt
    <(It) 小于号,推荐使用lt
    >= (gte) 大于等于,推荐使用gte
    <= (lte) 小于等于,推荐使用lte
    == 等于
    != 不等于

    1、只能比较数字和日期,不能比较字符串,返回为布尔类型不能直接输出
    2、由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x >y)>

    4. 空值运算符
    • ?? :判断是否为空
      这将检查对象的属性是否不为null:<#if object.attribute??></#if>
      这将检查对象或属性是否不为null:<#if (object.attribute)??></#if>
    • ! :指定缺失变量的默认值,如果不指定则默认值是空字符串、长度为0的序列或者长度为0的Map对象
      ${aaa!}:如果aaa变量没定义,不报错,默认没有任何输出
      ${aa!"-}:如果aaa变量没定义,为空的话,就默认设置该表达式的值为横杠,这里不会为aaa变量赋值 ${(user.name)!"默认值"}:如果user或name为null,就输出默认值。
      $[user.name!"默认值"}:如果user为null会报错,如果name为null,就输出默认值
    5. 模板中的代码片段
    • ${...}: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为interpolation(插值),FreeMarker中的运算也是在该大括号中进行;
    • 注释:注释和HTML的注释也很相似,但是它们使用<#-- and -->来标识。不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中),因为FreeMarker会跳过它们。
    • FTL标签(FreeMarker Template Language):FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。这些标签的名字以#开头。(用户自定义的FTL标签则需要使用@来代替#)
    6. 基本指令

    可以直接点击以下指令查看以下指令的例子

    • 中文解析
    • 英文文档

    三、FreeMarker的快速入门

    • 什么是页面静态化
    • 静态网页:
      a、静态网页的内容稳定,页面加载速度快。
      b、静态网页的没有数据库支持,在网站制作和维护方面的工作量较大。
      c、静态网页的交互性差,有很大的局限性。
    • 动态网页:
      a、交互性好。
      b、动态网页的信息都需要从数据库中读取,每打开一个一面就需要去获取一次数据库,如果访问人数很多,也就会对服务器增加很大的荷载,从而影响这个网站的运行速度。
    • 页面静态化适用场景
    • 高并发、要求用户相应速度快
    • 适用于大规模且数据变化不太频繁的页面
    • 步骤
    1. 构建一个maven项目(使用默认模板)
    2. 导入FreeMarker的依赖(打开maven仓库去选择使用人数最多的版本)
    <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.31</version>
    </dependency>
    
    1. 在maven项目的resource目录卞构建一个templates的目录
    2. 在templates目录下构建一个welcome的ftl文件并且书写简单的模板内容
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8"/>
        <title>Insert title here</title>
    </head>
    <body>
    Hello,${name}
    </body>
    </html>
    
    1. 在src下新建一个package,并且书写加载ftl并且转换其他文件的类
      step1、构建配置类
      step2、设置模板存放路径
      step3、构建数据模型
      step4、加载模板文件
      step5、生成Writer输出流
      step6、输出文件
      step7、关流
    package freemarker;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    
    import java.io.*;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Author 
     */
    public class FreeMarker2Html {
        //设置ftl的存放路径
        private static final String TEMPLATE_PATH = "src\\main\\resources\\templates";
        //设置生成文件的路径
        private static final String CLASS_PATH = "src\\main\\resources\\templates";
    
       public static void main(String[] args) {
         // step1 创建freeMarker配置实例
          Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
          configuration.setDefaultEncoding("utf‐8");
          Writer out = null;
         try {
              // step2 获取模版路径
              configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));
              // step3 创建数据模型
              Map<String, Object> dataMap = new HashMap<String, Object>();
              dataMap.put("name", "张三");
              // step4 加载模版文件
              Template template = configuration.getTemplate("welcome.ftl");
              // step5 生成数据
              File docFile = new File(CLASS_PATH + "\\" + "welcome.html");
              out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
              // step6 输出文件
              template.process(dataMap, out);
              System.out.println("文件创建成功 !");
          } catch (Exception e) {
              e.printStackTrace();
          } finally {
              try {
                  if (null != out) {
                      out.close();
                  }
              } catch (Exception e2) {
                  e2.printStackTrace();
              }
          }
       }
    }
    
    • 此外还可以转换成JAVA代码,如将下面hello.ftl 转换成 HelloFreeMarker

    模板的代码

    package ${classPath};
    public class ${className} {
        public static void main(String[] args) {
            System.out.println("${helloWorld}");
        }
    }
    

    生成的代码

    package templates;
    public class HelloFreeMarker {
        public static void main(String[] args) {
            System.out.println("通过简单的 <代码自动生产程序> 演示 FreeMarker的HelloWorld!");
        }
    }
    

    转换的代码

    package freemarker;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    
    import java.io.*;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Author 
     */
    public class FreeMarker2Java {
        //设置ftl的存放路径
        private static final String TEMPLATE_PATH = "src\\main\\resources\\templates";
        //设置生成文件的路径
        private static final String CLASS_PATH = "src\\main\\java\\templates";
    
       public static void main(String[] args) {
         // step1 创建freeMarker配置实例
          Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
          configuration.setDefaultEncoding("utf‐8");
          Writer out = null;
          try {
              // step2 获取模版路径
              configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));
              // step3 创建数据模型
              Map<String, Object> dataMap = new HashMap<String, Object>();
              dataMap.put("classPath", "templates");
              dataMap.put("className", "HelloFremarker");
              dataMap.put("helloWorld", "通过简单的 <代码自动生产程序> 演示 FreeMarker的HelloWorld!");
              // step4 加载模版文件
              Template template = configuration.getTemplate("hello.ftl");
              // step5 生成数据
              File docFile = new File(CLASS_PATH + "\\" + "HelloFremarker.java");
              out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
              // step6 输出文件
              template.process(dataMap, out);
              System.out.println("文件创建成功 !");
          } catch (Exception e) {
              e.printStackTrace();
          } finally {
              try {
                  if (null != out) {
                      out.close();
                  }
              } catch (Exception e2) {
                  e2.printStackTrace();
              }
          }
       }
    }
    

    如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

    相关文章

      网友评论

        本文标题:FreeMarker的介绍和快速入门

        本文链接:https://www.haomeiwen.com/subject/hncmyrtx.html