06.Freemarker【->静态页面/代码生成器】

Freemarker入门

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


Freemarker.png

以下演示以静态页面生成为例。

一、工程搭建

以一个简单的maven工程案例介绍Freemarker的使用

1). maven项目结构图


Freemarker项目结构图.png

2). 导入Freemarker坐标 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lingting</groupId>
    <artifactId>g_4_Freemarker</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.22</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

4). 其他准备

  1. 创建模板生成类 com.lingting.GenerateFromTemplate
  2. 创建生成文件夹 resources/pages
  3. 创建 模板文件 text.ftlhead.ftl

二、模板语法

  1. 模板文件test.ftl(模板文件中引入了head.ftl模板文件)
<html>
<#include "head.ftl">
<body>
    <#-- 模板注释,不会被生成 -->
    <!-- html注释,会被生成,不会被渲染 -->
    ${name},你好。${message}

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             以下语法写在此处

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

</body>
</html>
  1. test.ftl文件
<head>
    <meta charset="utf-8"/>
    <titile>Freemarker</titile>
</head>

模板文件中的四种元素

  1. 文本,直接输出的部分
  2. 注释,即<#--...-->格式不会输出
  3. 插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出
  4. FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。

1). FTL指令

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ 指令 @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

-- assign 指令:在页面上定义一个变量
<#assign linkman="邓女士">
联系人: ${linkman}

<#assign info={"mobile": "18199888899", "address": "大重庆"} >
电话:${info.mobile} 地址:${info.address}

-- include 指令:模板文件的嵌套: (见 head 头标签位置部分)

-- if 指令:在if判断中,可以使用 “=” ,也可以使用 “==”(推荐)
<#if success==true>
    if ~~~~~~~~~~~~~~~
<#else >
    else ~~~~~~~~~~~~~~
</#if>

<#if case == 1>
    case = 1 ~~~~~~~~~~~~~
<#elseif case=2>
    case == 2 ~~~~~~~~~~~~~
<#else>
    case == ? ~~~~~~~~~~~~~
</#if>

-- list 指令:遍历【列表集合】,如果需要索引,使用 `循环变量 + "_index"` 语法!
<#assign list=[{"name":"晓庆","postiton":"goddess"},{"name":"成","postiton":"loser"}]>
<#list list as people>
    ${people_index + 1}: ${people.name} -- ${people.postiton}
</#list>

2). 内建函数

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

-- 获取某个集合大小
共 ${list?size} 条记录

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

-- 日期格式化 (日期数据在 java 中准备)
当前日期:${today?date}
当前时间:${today?time}
当前日期+时间:${today?datetime}
日期格式化:${today?string("yyyy年MM月")}

-- 数字转化为字符串:数字打印会类似于 123,345,789 这种形式
累计积分:${point}
累计积分:${point?c}

3). 空值处理

如果不处理空值,很容易抛出异常,导致模板生成失败

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ 空值处理 @@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@模板中使用了变量,但是代码中没有对变量赋值,为了防止抛错,可以对空值进行处理

-- 判断某变量是否存在:“variable??” : 存在返回true; 否则返回false
<#if aaa??>
    aaa 存在
<#else >
    aaa 不存在
</#if>

-- 缺失变量默认值 “!” (默认值的类型必须对应) : 使用 “!” 对 null 值做转换处理
${text!'-'}
${aaa!'!'}

4). 运算符注意事项

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ 运算符 @@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %

-- 逻辑运算符运算布尔值:&& || !

-- 比较运算符
<#--
1  =或者== :判断两个值是否相等.
2  != :判断两个值是否不等.
3  >或者gt :判断左边值是否大于右边值
4  >=或者gte :判断左边值是否大于等于右边值
5  <或者lt :判断左边值是否小于右边值
6  <=或者lte :判断左边值是否小于等于右边值

注意:  =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,
否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作
用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,
因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>
-->

三、生成模板API

GenerateFromTemplate.java

package com.lingting;


import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.Date;

public class GenerateFromTemplate {

    public static void main(String[] args) throws Exception {

        // 1. 创建配置类, 设置指定版本
        Configuration configuration = new Configuration(Configuration.getVersion());

        // 2. 设置模板所在的目录,案例演示,就生成在工作空间的项目下
        configuration.setDirectoryForTemplateLoading(
                new File(System.getProperty("user.dir") + "\\g_4_Freemarker\\src\\main\\resources")
        );

        // 3. 设置字符集
        configuration.setDefaultEncoding("utf-8");

        // 4. 加载模板
        Template template = configuration.getTemplate("test.ftl");

        // 5. 创建数据模型,可以使用pojo ,推荐使用Map。扩展性更好
        // 如果数据添加的不全,在插入模板时会报错
        Map map = new HashMap();
        map.put("name", "晓庆");
        map.put("message", "你好美!");
        map.put("success", true);
        map.put("case", 3);
        map.put("today", new Date());
        map.put("point", 123456789);

        // 6. 创建Writer对象
        Writer out = new FileWriter(new File(
                System.getProperty("user.dir") + "\\g_4_Freemarker\\src\\main\\resources\\pages\\test.html"
        ));

        // 7. 输出
        template.process(map, out);

        // 8. 释放系统资源
        out.close();
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容