实际上用程序语言编写的程序就是模板。 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>