美文网首页Amazing Arch
06.Freemarker【->静态页面/代码生成器】

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

作者: 哈哈大圣 | 来源:发表于2019-03-20 22:52 被阅读66次

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

    相关文章

      网友评论

        本文标题:06.Freemarker【->静态页面/代码生成器】

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