什么是模版?

实际上用程序语言编写的程序就是模板。 FTL (代表FreeMarker模板语言)。 这是为编写模板设计的非常简单的编程语言。

模板(FTL编程)是由如下部分混合而成的:

  • 文本:文本会照着原样来输出。

  • 插值:这部分的输出会被计算的值来替换。插值由 ${ 和 } 所分隔 (或者 #{ 和 },这种风格已经不建议再使用了)。

  • FTL标签:FTL标签和HTML标签很相似,但是它们却是给 FreeMarker 的指示, 而且不会打印在输出内容中。

  • 注释:注释和HTML的注释也很相似,但它们是由 <#-- 和 -->来分隔的。注释会被 FreeMarker 直接忽略,更不会在输出内容中显示。

我们来看一个具体的模板:

<html>
<head>
    <title>Book List</title>
</head>
<body>
<h1>${title}</h1>
<p>书籍列表:</p>
<#-- 打印书籍列表 -->
<table>
    <tr>
        <th>名称</th>
        <th>价格</th>
    </tr>
    <#list books as book>
        <tr>
            <td>${book.name}</td>
            <td>${book.price}</td>
        </tr>
    </#list>
</table>
</body>
</html>

FTL 是区分大小写的。 list 是指令的名称而 List 就不是。类似地 ${name} 和 ${Name} 或 ${NAME} 也是不同的。比如:

<h1>${title}</h1>
<#-- 不等同 -->
<h1>${TITLE}</h1>
<h1>${Title}</h1>

FTL 标签不可以在其他 FTL 标签和插值中使用。比如,这样做是错误的:

<#if <#include 'foo'>='bar'>...</#if>
${ <#if user='name'>...</#if> }

注释可以放在 FTL 标签和插值中。比如:

<html>
<head>
    <title>Book List</title>
</head>
<body>
<h1>${title}</h1>
<p>书籍列表:</p>
<table>
    <tr>
        <th>名称</th>
        <th>价格</th>
    </tr>
    <#list books as book <#-- 打印书籍列表 -->>
        <tr>
            <td>${book.name <#-- 书名 -->}</td>
            <td>${book.price <#-- 书价格 --> }</td>
        </tr>
    </#list>
</table>
</body>
</html>

实例

模版代码如下:

<html>
<head>
    <title>Book List</title>
</head>
<body>
<h1>${title}</h1>
<p>书籍列表:</p>
<table>
    <tr>
        <th>名称</th>
        <th>价格</th>
    </tr>
    <#list books as book <#-- 打印书籍列表 -->>
        <tr>
            <td>${book.name <#-- 书名 -->}</td>
            <td>${book.price <#-- 书价格 --> }</td>
        </tr>
    </#list>
</table>
</body>
</html>

Java 代码:

package com.hxstrive.freemarker.demo1;

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

import java.io.File;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.*;

public class Demo4 {

    public static void main(String[] args) throws Exception {
        // 1. 配置 FreeMarker
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
        cfg.setClassForTemplateLoading(Demo4.class, "/templates/");
        cfg.setDefaultEncoding("UTF-8");
        cfg.setLocale(Locale.CHINESE);
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

        // 2. 准备模版数据
        Map<String, Object> input = new HashMap<String, Object>();
        List<Map<String,Object>> bookList = new ArrayList<Map<String,Object>>();
        input.put("books", bookList);
        input.put("title", "编程书籍推荐");

        Map<String,Object> javaBook = new HashMap<String, Object>();
        javaBook.put("name", "Java高级编程");
        javaBook.put("price", 67.5f);
        bookList.add(javaBook);

        Map<String,Object> linuxBook = new HashMap<String, Object>();
        linuxBook.put("name", "Linux入门到精通");
        linuxBook.put("price", 36.8f);
        bookList.add(linuxBook);

        Map<String,Object> cssBook = new HashMap<String, Object>();
        cssBook.put("name", "CSS的艺术");
        cssBook.put("price", 44.5f);
        bookList.add(cssBook);

        Template template = cfg.getTemplate("template4.ftl");
        Writer consoleWriter = new OutputStreamWriter(System.out);
        template.process(input, consoleWriter);

        // 将输出结果保存到文件中
        Writer fileWriter = new FileWriter(new File("output.html"));
        try {
            template.process(input, fileWriter);
        } finally {
            fileWriter.close();
        }
    }

}

输出结果:

<html>
<head>
    <title>Book List</title>
</head>
<body>
<h1>编程书籍推荐</h1>
<p>书籍列表:</p>
<table>
    <tr>
        <th>名称</th>
        <th>价格</th>
    </tr>
        <tr>
            <td>Java高级编程</td>
            <td>67.5</td>
        </tr>
        <tr>
            <td>Linux入门到精通</td>
            <td>36.8</td>
        </tr>
        <tr>
            <td>CSS的艺术</td>
            <td>44.5</td>
        </tr>
</table>
</body>
</html>
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号