freemarker总结
Freemarker
1.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 是免费的 。
数据模型+模版=输出
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();
root.put("user", "Big Joe");
root.put("sex", "1");
String[] str=new String[]{"1","2","3","4"};
root.put("str", str);
Map latest = new HashMap();
root.put("latestProduct", latest);
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
List list=new ArrayList();
User user=new User("1","zd");
User user1=new User("2","ls");
list.add(user);
list.add(user1);
root.put("userlist", list);
//实例化模板对象
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();
}
模板:
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
2.静态化
3.FTL标记指令
(1)if,else,ifelse
语法:<#if 条件>
....
<#elseif 条件>
...
<#else>
...
</#if>
注:判断条件类型一致
(2)switch,case,default,break
<#switch being.size>
<#case "small">
This will be processed if it is small
<#break>
<#case "medium">
This will be processed if it is medium
<#break>
<#case "large">
This will be processed if it is large
<#break>
<#default>
This will be processed if it is neither
</#switch>
(3)list,break(可以理解为for循环)
<#list 数组或集合 as 临时变量>
${临时变量}---${临时变量名_index}
</#list>
解释:(临时变量_index:获取当前的素引从0开始
临时变量_has_next:判断list集合是否换有值
Break:标记用于退出标记
)
(4)定义变量
<#assign 键=值>或<#assign 键>值</#assign>
(5)include指令
<#include “include.ftl”>
${age}
(6)import 指令
<#import “include.ftl” as 别名>
${别名.age}
include与import的区别:
include和import都是将一个页面包含另一个页面,
Include:引入两个是会覆盖
Import:引入两个是不会覆盖
(7)macro(宏)指令
<#macro mymacro p1 p2>
${p1+p2}
</#macro>
<@mymacro p1=14 p2=45 />
4.FTL内置处理函数:
例:${str?upper_case}
html-对字符串进行HTML编码
cap_first-使字符串第一个字母大写
lower_case-将字符串转换成小写
trim-去掉字符串前后的空白字符
length –取得字符串长度
js_string---包含的特殊字符(如回车、\”),转化成变量可以接收的值
size-获得序列中元素的数目
int-取得数字的整数部分
5.sequence 序列(对应java里的list、数组等非键值对的集合)与hash键值对的集合
<#list myid?keys as tmp>
${tmp}
</#list>
<#list ['a','b'] as tmp>
${tmp}
</#list>
数据结构:
Map latest=new HashMap();
latest.put("id_1", "10");
latest.put("id_2", "12");
latest.put("id_3", "3");
Map root = new HashMap();
root.put("myid", latest);
6.特殊字符串的显示
如果包含特殊字符需要转义,如下面的例子
${"It's \"quoted\" and this is a backslash: \\"}
${'It\'s "quoted" and this is a backslash: \\'}
输出结果
It's "quoted" and this is a backslash: \
It's "quoted" and this is a backslash: \
有一类特殊的字符串称为raw字符串,被认为是纯文本:
${r"${foo}"}
${r"C:\foo\bar"}
${foo}
C:\foo\bar
7.模板中的变量的使用范围及命名空间变更的使用范围:
plain(全局)变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换
局部变量:在macro中有效,使用local指令创建和替换
循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量
局部变量隐藏(而不是覆盖)同名的plain变量;
循环变量隐藏同名的局部变量和plain变量,