FreeMarker技术
1.1 模板引擎技术
Freemarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点:
(1)Freemarker 适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。
(2)虽然Freemarker 具有一些编程的能力,但通常由Java程序准备要显示的数据,由Freemarker 生成页面,通过模板显示准备的数据 。
(3)Freemarker 不是一个Web应用框架,而适合作为Web应用框架一个组件。
(4)Freemarker 与容器无关,因为它并不知道HTTP或Servlet。
(5)Freemarker 更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。
(6)Freemarker 是免费的 。
数据模型+模版=输出
1.2 FreeMaker基本语法
1、FreeMarker标记
FreeMarker标记的设计非常精炼,只有三种:
1) $ : ${expression} FreeMarker会在输出时用实际值进行替代
例如:${stockNum?default(‘’)}
2) # :标准的FTL标记。大部分FreeMarker指令都以#开始,可以明显地与html标记区分,
<#if user = "BigJoe">our beloved leader</#if>。
同时,FTL文件的注释包含在<#--和-->(而不是<!--和-->)之间
3) @作为用户定义指令使用宏变量时,使用@替代FTL标记中的#。后面将详细介绍宏
2标准的FTL标记指令
1) if, else, elseif
2) switch, case, default, break
3) list, break
4) include
5) Import
6) assign
7) macro, nested, return
下面是我个人敲的一些例子:
1.创建一个 关于macro(宏) 的 FreeMarker实例:
package freeMarker;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class TestMacro {
public static void main(String[] args) throws IOException, TemplateException {
//配置ftl的查找目录
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(
new File("template"));
//设置数据的抓取模式
cfg.setObjectWrapper(new DefaultObjectWrapper());
Map root = new HashMap();
List list = new ArrayList();
User user = new User();
user.setId("1");
user.setName("zs");
list.add(user);
User user1 = new User();
user1.setId("2");
user1.setName("ls");
list.add(user1);
root.put("userlist", list);
Template temp = cfg.getTemplate("macro.ftl");
//生成html 输出到目标
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
}
}
ftl模板如下:
<#macro mymacro p1 p2>
我的结果是:${p1+p2}
</#macro>
<@mymacro p1=10 p2=198 />
<@mymacro p1=99 p2=1 />
<#assign str=' hellow my name is cxy'>
str的长度 :${str?length}
打印 str :--${str}--
去 空格 :--${str?trim}--
转换大写:--${str?upper_case}--
转小写:--${str?lower_case}--
--${userlist?size}--
截取 四舍五入:--${1.65959?float}--
<#assign aaa=45>
<#if aaa?exists>
${aaa}
</#if>
输出结果如下:
我的结果是:208
我的结果是:100
str的长度 :25
打印 str :-- hellow my name is qgc --
去 空格 :--hellow my name is qgc--
转换大写:-- HELLOW MY NAME IS QGC --
转小写:-- hellow my name is qgc --
--2--
截取 四舍五入:--1.66--
45
2.创建一个 关于 的 FreeMarker实例:
package freeMarker;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
public class TestFreeMarker {
public static void main(String[] args) throws Exception {
//配置ftl的查找目录
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(
new File("template"));
//设置数据的抓取模式
cfg.setObjectWrapper(new DefaultObjectWrapper());
Map latest = new HashMap();
//构建数据
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
Map root = new HashMap();
root.put("user", "Big Joe");
root.put("latestProduct", latest);
root.put("sex",0);
String [] str = new String[]{"1","2","3"};
root.put("arr", str);
List list = new ArrayList();
User user = new User();
user.setId("1");
user.setName("zs");
list.add(user);
User user1 = new User();
user1.setId("2");
user1.setName("ls");
list.add(user1);
root.put("userlist", list);
String [] ste = new String[]{"1","2","3","4","5","6"};
root.put("aee", ste);
//实例化模板对象
Template temp = cfg.getTemplate("helloworld.ftl");
FileOutputStream fos = new FileOutputStream("c:\\html\\hello.html");
//生成html 输出到目标
Writer out = new OutputStreamWriter(fos);
temp.process(root, out);
out.flush();
}
}
ftl模板如下:
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>
if :
我的性别是: ${sex}
if 输出:
<#if sex =0>
男
<#else>
女
</#if>
<br/>
switch:
switch 输出:
<#switch 5>
<#case 5>
this 5
<#break>
<#case 6>
this 6
<#break>
</#switch>
<br/>
list :
<#--list--> 循环
list 输出 数组:
<#list arr as item>
${item}
</#list>
list输出list:
<#list userlist as tem>
${tem.id}------${tem.name}
</#list>
<br/>
list 判断基偶:
<#list aee as tee>
<#--终止循环 break-->
<#if tee_index==2>
<#break>
</#if>
<#if (tee_index+1)%2==0>
<font color=green>${tee}---${tee_index+1}</font><br/>
<#else>
<font color=red>${tee}---${tee_index+1}</font>
</#if>
</#list>
</body>
</html>
include 和 import 的区别:
macro 的使用