Freemarker简介:
FreeMarker 是一款模板引擎: 即一种基于模板、用来生成输出文本(任何来自于 HTML
格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包(类库)
模板
+
数据模型
=
输出
FreeMarker 不是 Web 开发的应用程序框架。它是一个适用于 Web 应用程序框架中的组件,但是 FreeMarker 引擎本身并不知道 HTTP 协议或 Java Servlet 的存在。 它仅仅来生成文本内容。
Freemark就一个视图层技术,用来展现数据页面,类似的技术有themleaf、Velocity、facelets
添加jar包:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.26-incubating</version>
</dependency>
示例:
public class Test {
public static void main(String[] args) throws TemplateException, IOException {
// 1 创建配置
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("G:\\UsianWork\\freemark\\freemarkqs\\template"));
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 2 获取或创建模板
Template temp = cfg.getTemplate("test.ftl");
// 3 创建数据模型
Map root = new HashMap();
root.put("user", "Big Joe");
Map latest = new HashMap();
root.put("latestProduct", latest);
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
// 4 将模板和数据模型合并
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${user}
${latestProduct.url}
${latestProduct.name}
</body>
</html>
模板
最简单的模板是普通 HTML 文件(或者是其他任何文本文件—FreeMarker 本身不属于
HTML)。 当客户端访问页面时, FreeMarker 要发送 HTML 代码至客户端浏览器端显示。 如果想要页面动起来,就要在 HTML 中放置能被 FreeMarker 所解析的特殊部分。
- ${…}: FreeMarker 将会输出真实的值来替换花括号内的表达式,这样的表达式被称为
interpolations 插值
- FTL tags 标签( FreeMarker 模板的语言标签): FTL 标签和 HTML 标签有一点相似,但是它们是 FreeMarker 的指令而且是不会直接输出出来的东西
- Comments 注释: FreeMarker 的注释和 HTML 的注释相似,但是它用<#--和-->来分隔的
- directives 指令: 就是所指的 FTL 标签。这些指令在 HTML 的标签(如<table>和</table>) 和 HTML 元素(如 table 元素) 中的关系是相同的。
指令
if 指令
list 指令
include 指令
指令嵌套
处理不存在的变量
- 为空的变量一个默认值
- 判断变量是否为空
数值和类型
数值
类型
支持的类型有:
标量:
- 字符串
- 数字
- 布尔值
- 日期
容器:
- 哈希表
- 序列(数组)
- 集
子程序:
- 方法和函数
- 用户自定义指令
- 其它/很少使用:
- 节
运算符号:
比较运算符号:
- 测试两个值相等使用=(或者采用 Java 和 C 语言中的==,二者是完全等同的。)
- 测试两个值不等使用!=。例子中假设 user 是”Big Joe”。
逻辑操作
逻辑或:
||逻辑与:
&&逻辑非
: !
内置函数:
使用内建函数的语法和访问哈希表子变量的语法很像, 除了使用?号来代替点,其他的都一样。 例如得到字符串的大写形式:
user?upper_case。
。
字符串使用的内建函数:
html: 字符串中所有的特殊 HTML 字符都需要用实体引用来代替(比如<代
替<)。
cap_first:字符串的第一个字母变为大写形式
lower_case:字符串的小写形式
upper_case:字符串的大写形式
trim:去掉字符串首尾的空格
序列使用的内建函数:
size:序列中元素的个数
数字使用的内建函数:
int:数字的整数部分(比如-1.9?int 就是-1)
Freemark与Springmvc整合:
添加jar包:
Springmvc配置文件:
<!-- Freemarker配置 -->
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/template/" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="number_format">0.##########</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
</bean>
<!--视图解释器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix">
<value>.ftl</value>
</property>
<property name="contentType" value="text/html;charset=UTF-8"></property>
</bean>
工程目录结构:
生成静态页面
Controller
HtmlController类
/**
* 生成html到文件中
* @param model
* @return
*/
@RequestMapping("/genHtml")
public String index(Model model){
Configuration config = freeMarkerConfigurer.getConfiguration();
try(FileWriter fw = new FileWriter("D:\\goods.html")) {
Template template = config.getTemplate("goods.ftl");
Map<String, Object> root = new HashMap<>();
root.put("name", "Apple电脑");
root.put("price", 155.6);
template.process(root,fw );
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
User user = new User(1,"admin", new Date());
model.addAttribute("user", user);
return "main";
}
Ftl模板页面
goods.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
商品名:${name}<br/>
价格:${price}
</body>
</html>