网页静态化技术 Freemarker

目录

1. FTL 指令

1.1 assign 指令

(1)定义简单类型:

<#assign linkman="周先生">
联系人:${linkman}

(2)定义对象类型:

<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
电话:${info.mobile} 地址:${info.address}
1.2 include 指令

此指令用于模板文件的嵌套

  • 创建模板文件 head.ftl
<h1>信息网</h1>
  • 我们修改 test.ftl,在模板文件中使用 include 指令引入刚才我们建立的模板
<#include "head.ftl">
1.3 if 指令
    <#if flag=1>
            <div style="height: 100px;width:100px; background-color: blue;">
                蓝色方块
            </div>
        <#elseif flag=2>
            <div style="height: 100px;width:100px; background-color: red;">
                红色方块
            </div>
        <#else>
            <div style="height: 100px;width:100px; background-color: black;">
                黑色方块
            </div>
    </#if>
1.4 list 指令
  • list 集合
----商品价格表----<br>
<#list goodsList as goods>
${goods_index+1} 商品名称: ${goods.name} 价格:${goods.price}<br>
</#list>

如果想在循环中得到索引,使用循环变量*_index就可以得到, 如:goods_index

  • Map集合
<#assign score = {"语文":78,"数学":83,"Java":89} >  
<#list score?key as x>  
   ${x}--->${score[x]};  
</#list>   

2. 内建函数

2.1 获取集合大小
  • 我们使用 size 函数来实现,代码如下:
<!-- goodsList为商品列表集合-->
共 ${goodsList?size} 条记录
2.2 转换 JSON 字符串为对象
  • eval
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}
2.3 日期格式化
  • 代码中对变量赋值:
dataModel.put("today", new Date());
  • 在模板文件中加入
当前日期:${today?date} <br>
当前时间:${today?time} <br>
当前日期+时间:${today?datetime} <br>
日期格式化: ${today?string("yyyy 年 MM 月")}
  • 运行效果如下:
    运行效果
2.4 数字转换为字符串
  • 代码中对变量赋值:
map.put("point", 102920122);
  • 修改模板:
累计积分:${point}
  • 页面显示如下 :
    这里写图片描述
    我们会发现数字会以每三位一个分隔符显示,有些时候我们不需要这个分隔符,就需要将数字转换为字符串,使用内建函数 c
累计积分:${point?c}
  • 页面显示效果如下:
    这里写图片描述

3. 空值处理运算符

3.1 判断某变量是否存在: “??
  • 用法为: variable?? ,如果该变量存在,返回 true,否则返回 false
<#if aaa??>
    aaa 变量存在
<#else>
    aaa 变量不存在
</#if>
3.2 缺失变量默认值: “!

我们除了可以判断是否为空值,也可以使用!对 null 值做转换处理

  • 在模板文件中加入
${aaa!'defaultValue'}
  • 在代码中不对 aaa 赋值,也不会报错了 ,当 aaa 为 null 则返回!后边的内容defaultValue
  • ! 后面也可以什么都不写, 如果 aaa 为 null , 则返回空字符串 ""

4. 运算符

4.1 算数运算符
FreeMarker 表达式中完全支持算术运算,
FreeMarker 支持的算术运算符包括: + , - , * , / , %
4.2 逻辑运算符
逻辑运算符有如下几个:
逻辑与: &&
逻辑或: ||
逻辑非: !
逻辑运算符只能作用于布尔值,否则将产生错误
4.3 比较运算符
表达式中支持的比较运算符有如下几个:
1 =或者==:判断两个值是否相等.
2 !=:判断两个值是否不等.
3 >或者 gt:判断左边值是否大于右边值
4 >=或者 gte:判断左边值是否大于等于右边值
5 <或者 lt:判断左边值是否小于右边值
6 <=或者 lte:判断左边值是否小于等于右边值
  • 注意:
  • =!= 可以用于字符串,数值和日期来比较是否相等,但=!=两边必须是相同类型的值,否则会产生错误,而且 FreeMarker 是精确比较,"x","x ","X"是不等的.
  • 其它的运算符可以作用于数字和日期,但不能作用于字符串
  • 大部分的时候,使用 gt 等字母运算符代替>会有更好的效果,因为 FreeMarker 会把>解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>

5. Freemarker 工具类

用于生成生成静态页面

5.1 引入 maven 坐标
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>
5.2 创建配置文件
  • src/main/resource/properties 目录下创建 freemarker.properties 文件
# 模板所在的包路径 (相对路径)
templateRelativePath=/com/freemarker/ftl
# Html页面输出的包路径(绝对路径)
absolutePath=G:\\freemarker\\ftl-out
  • 注:
    在融入spring架构时要在 xml 配置文件中使用
    <context:property-placeholder location="classpath*:properties/*.properties" />
    加载freemarker.properties 文件, 用 @Value 注解注入 , 如下:
    @Value("${templateRelativePath}")
    private String templateRelativePath;
    @Value("${absolutePath}")
    private String absolutePath;
5.3 创建模板文件

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

5.4 freemarker工具类

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

import java.io.*;
import java.util.Map;

/**
 * freemarker工具类 : 用于生成生成静态页面
 */
public class FMUtils {

    // 模板所在的包路径(类路径下的相对路径)
    private String templateRelativePath;
    // Html页面输出的包路径(绝对路径)
    private String absolutePath;

    public FMUtils(String templateRelativePath, String absolutePath) {
        this.templateRelativePath = templateRelativePath;
        this.absolutePath = absolutePath;
    }

    /**
     * @param ftlName  :模板名字
     * @param fileName :生成的html的名字
     * @param map      :数据, 在freemarker模板中取数据都使用map
     */
    public void ouputFile(String ftlName, String fileName, Map<String, Object> map) throws Exception {

        // 创建fm的配置
        Configuration config = new Configuration(Configuration.getVersion());
        // 指定默认编码格式
        config.setDefaultEncoding("UTF-8");
        // 设置模板的包路径 /com/pyg/ftl
        config.setClassForTemplateLoading(this.getClass(), templateRelativePath);

        // 获得包的模板
        Template template = config.getTemplate(ftlName);
        // 创建输出文档对象
        File file = new File(absolutePath + "/" + fileName);

        // 定义输出流,注意的必须指定编码
        Writer out = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(file), "utf-8"));
        // 生成模板
        template.process(map, out);

    /*
        //同时把生成html页面上传到静态页面服务器
        //连接linux服务
        //参数 1: 服务器IP地址, 2: SSH服务端口, 3: 用户名, 4: 密码
        //建议参数放在配置文件中
        ChannelSftp channelSftp = SftpUtil.connect("192.168.12.11", 22, "root", "1111");
        //上传
        InputStream in = new FileInputStream(file);
        SftpUtil.upload("/data/images", in, fileName, channelSftp);
    */

        //关闭
        out.close();

    }

}
  • : 若需要同时把生成html页面上传到静态页面服务器, 则取消 /*...*/ 注释即可

猜你喜欢

转载自blog.csdn.net/qq_42806915/article/details/82225626