右耳菌-邓小白的Java架构师的修炼之路

FreeMarker的介绍和快速入门

2022-05-02  本文已影响0人  右耳菌

一、了解FreeMarker

1. 什么是FreeMarker

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

2. FreeMarker的工作机制
FreeMarker的工作机制
3. FreeMarker的官方文档
4. FreeMarker的特点

二、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
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. 模板中的代码片段
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();
          }
      }
   }
}

模板的代码

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();
          }
      }
   }
}

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

上一篇下一篇

猜你喜欢

热点阅读