美文网首页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【->静态页面/代码生成器】

    Freemarker入门 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。Fre...

  • Django中模板变量的使用(十)

    一、网页中的动态页面和静态页面 1、静态页面:静态页面是网页的源代码都在页面中,不需要执行asp,php,jsp,...

  • 看到了这种web开发流程,码农瞬间成为程序员(二)

    六、静态网页与动态页面 静态网页:随着html代码的生成,页面的内容和显示效果就不会发生变化了,除非你修改页面代码...

  • php 实现页面静态化

    静态页面是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页。并且静态...

  • JS删除Cookie的特例

    删除Cookie时如果没有指定Path在静态页面下会不能删除 如下代码: 用在动态页面可以,用在html静态页面不...

  • 第一个爬虫

    [TOC] 目标 用scrapy写一个可以下载页面,解析静态页面的爬虫,加head,加链接生成器解析,可能用xpa...

  • arguements应用

    HTML 标签, 在页面上显示代码< 做尖括号 , > 右尖括号 JS arguements是传递给函...

  • 【Node.js】静态页面和简单的路由

    目录 返回一个静态页面 根据路由返回对应的页面 1、返回一个静态页面 文件目录如下所示 app.js代码 inde...

  • Python爬虫 豆瓣动态页面的爬取

    动态页面和静态页面可通过检查元素查看爬取的信息和查看源代码中的信息是否一致,一致则为静态页面,反则为动态页面。因为...

  • 十四、静态服务之Apache

    只能解析静态页面。 动态页面:只要和数据库进行连接的都属于动态页面,比如java写的代码,PHP的代码,pytho...

网友评论

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

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