FreeMarker笔记 前言&第1章 入门
简介
简介
FreeMarker是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于HTML格式的文本用来自动生成源代码)的通用工具。它是为Java程序员提供的一个开发包或者说是类库。它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。
特点
功能
基础
概要、关键字
建议
前言
FreeMarker是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于HTML格式的文本用来自动生成源代码)的通用工具。它是为Java程序员提供的一个开发包或者说是类库。它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。
FreeMarker的设计实际上是被用来生成HTML网页,尤其是通过基于实现了MVC(Model View Controller,模型-视图-控制器)模式的Servlet应用程序。使用MVC模式的动态网页的构思使得你可以将前端设计者(编写HTML)从程序员中分离出来。所有人各司其职,发挥其擅长的一面。网页设计师可以改写页面的显示效果而不受程序员编译代码的影响,因为应用程序的逻辑(Java程序)和页面设计(FreeMarker模板)已经分开了。页面模板代码不会受到复杂的程序代码影响。这种分离的思想即便对一个程序员和页面设计师是同一个人的项目来说都是非常有用的,因为分离使得代码保持简洁而且便于维护。
FreeMarker不是Web应用框架。它是Web应用框架中的一个适用的组件。
第1章 入门
1.2 模板+数据模型=输出
1.3 数据模型一览
1.4 模板一览
1.4.1 简介
FTL tags标签:FreeMarker模板的语言标签。一般以符合#开头,用户自定义的FTL标签使用@代替#。
Comments注释:FreeMarker的注释和HTML的注释相似,但是它用<#--和-->来分隔。
directives指令:就是所指的FTL标签。
1.4.2 指令示例
1.4.2.1 if指令
假设你只想向你的老板Big Joe(而不是其他人)问好,就可以这样做:
<h1>
Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
</h1>
使用<#else>标签:
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#else>
Pythons are not cheaper than elephants today.
</#if>
如果变量本身就是布尔值,可以直接作为if的条件;
<#if animals.python.protected>
Warniing! Pythons are protected animals!
</#if>
实例
/FreeMarker-hello-web/src/main/java/org/yejq/fre/model/Animal.java
public class Animal {
private String name;
private double price;
private boolean protect;
。。。
}
/FreeMarker-hello-web/src/main/java/org/yejq/fre/service/Exercises.java
public void testIf(Model model){
model.addAttribute("user", "Big Joe");
Map<String, Animal> animals = new HashMap<String, Animal>();
animals.put("python", new Animal("python", 300, true));
animals.put("elephant", new Animal("elephant", 400, false));
model.addAttribute("animals", animals);
}
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/if.ftl
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>If指令</title>
</head>
<body>
<h1>Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if></h1>
<p>
<#--大于号两边要加括号括起来,否则会以为是结束标签 -->
<#if (animals.python.price > animals.elephant.price)>
python.price > elephant.price
<#else>
python.price <= elephant.price
</#if>
</p>
<p>
<#if animals.python.protect>
python.protect = true;
</#if>
</p>
</body>
</html>
测试: http://localhost/test/2/if/testIf
1.4.2.2 list指令
当需求遍历集合的内容时,list指令是非常好用的。
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
实例
/FreeMarker-hello-web/src/main/java/org/yejq/fre/service/Exercises.java
public void testList(Model model){
List<Animal> animals = new ArrayList<Animal>();
animals.add(new Animal("python", 300, true));
animals.add(new Animal("elephant", 400, false));
model.addAttribute("animals", animals);
}
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/list.ftl
<h3>list指令</h3>
<table border=1>
<#list animals as animal>
<tr>
<#-- boolean类型要设置默认输出值,否则报错 -->
<td>${animal.name}, ${animal.price}, ${animal.protect?c}</td>
</tr>
</#list>
</table>
测试:
http://localhost/test/2/list/testList
1.4.2.3 include指令
在当前模板中插入其他文件的内容。
copyright_footer.html:
<hr>
<i>
Copyright (c) 2000<a href="http://www.xxx.com">Acmee Inc</a>,
<br>
All Rights Reserved.
</i>
当需要copyright时,引入
<#include "/copyright_footer.html">
实例
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/copyright.html
<hr>
<i>
Copyright (c) 2000<a href="http://www.xqsoso.com">Acmee Inc</a>,
<br>
All Rights Reserved.中文测试
</i>
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/include.ftl
<h3>include指令</h3>
<#include "copyright.html">
测试:http://localhost/test/2/include/null
1.4.2.4 联合使用指令
指令可以嵌套使用;
1.4.2.5 处理不存在的变量
<h1>Welcome ${user!"Anonymous"}!</h1>
通过在变量名后边跟一个!和默认值。
<h1>Welcome ${user!"Anonymous"}!</h1>
可以使用??询问freemarker一个变量是否存在,将它和if指令合并,那么如果user变量不存在的话将会忽略整个问候代码段;
<#if user??><h1>Welcome ${user}!</h1></#if>
对于多级访问的变量,比如animals.python.price,书写代码:animals.python.price!0,仅当animals.python存在且最后一个子变量price可能不存在(这种情况下我们假设价格是0)。如果animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,可以这样来书写代码(animals.python.price)!0。这种情况下当animals或python不存在时表达式的结果仍然是0。对于??也是同样用来的处理这种逻辑的,animals.python.price??对比(animals.python.price)??来看;
实例
/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/null.ftl
<h3>处理不存在的变量</h3>
<p>welcome, ${user!"anonymous"}</p>
<p>检测user是否存在,<#if user??>Welcome, ${user}</#if></p>
<#--不加括号会报错: nested exception is freemarker.core.InvalidReferenceException: The following has evaluated to null or missing-->
<p>多级访问, ${(animals.python.price)!0}</p>
测试: http://localhost/test/2/null/null
参考资料
书
- B1 :《FreeMarker中文版文档.pdf》
- B2 :
项目
- P1:
F:\360\Learn\FreeMarker\workspace\FreeMarker-hello-java\,https://github.com/yejq/FreeMarker-hello-java.git。 - P2:
F:\360\Learn\freemarker\workspace\FreeMarker-hello-web\, https://github.com/yejq/FreeMarker-hello-web.git。
FreeMarker笔记 前言&第1章 入门的更多相关文章
- 一、FreeMarker 模版开发指南 第一章 入门
所有资料来自 南磊 翻译的官方文档,我弄简单了,适合自己以后拿出来翻看. 章节内容如下: 简介 模板+数据模型=输出 数据模型一览 模板一览 一.模板 + 数据模型 = 输出 输出结果: &l ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...
- jQuery学习笔记(一):入门
jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操 ...
- 《深入理解Spark:核心思想与源码分析》(前言及第1章)
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回
<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回
- 《深入Java虚拟机学习笔记》- 第16章 控制流
<深入Java虚拟机学习笔记>- 第16章 控制流
- 《深入Java虚拟机学习笔记》- 第17章 异常
<深入Java虚拟机学习笔记>- 第17章 异常
- 《深入Java虚拟机学习笔记》- 第13章 逻辑运算
<深入Java虚拟机学习笔记>- 第13章 浮点运算
随机推荐
- oracle11g 修改字符集 修改为ZHS16GBK
1.cmd下,cd到oracle数据库软件的服务器端 如:D:\app\Administrator\product\11.2.0\dbhome_1\BIN 2.输入set ORACLE_SID=你想进 ...
- js dom
JavaScript的DOM操作 1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方 ...
- 《Java编程那点事儿》读书笔记(七)——多线程
1.继承Thread类 通过编写新的类继承Thread类可以实现多线程,其中线程的代码必须书写在run方法内部或者在run方法内部进行调用. public class NewThread extend ...
- Java I/O操作学习笔记
书上写的有点乱,所以就自己总结了一下,主要参考:http://www.cnblogs.com/qianbi/p/3378466.html 1.从文件读出和写入: import java.io.*; i ...
- iMpACT中的Xilinx Prom烧录
2014-01-06 19:56:37 在http://bbs.21ic.com/icview-361925-1-1.html中有比较详细的介绍. 下面的转自:http://xilinx.eetren ...
- 【CCS仿真】用matlab把CCS保存的32位16进制的数据转换为十进制的数
2013-12-04 16:37:28 使用fscanf函数即可完成. 例如,CCS保存的.dat文件Copy_of_forward_i_f.dat如下: 1651 1 81008800 0 4000 ...
- BZOJ 1415 聪聪和可可(概率DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1415 题意:一个无向图,一个猫.一只老鼠.在任意时刻猫知道老鼠在哪个顶点上.每次移动猫先 ...
- MongoDB 学习笔记(二) 高级查询
1.条件运算符 2.$all 匹配所有 3.$exists 判断字段是否存在 4.NUll 值处理 5.$mod 取模处理 6.$ne 不等于 7. $in 包含,与sql用法相同 8. $nin 不 ...
- 图解phpstorm常用快捷键
CTRL+N 查找类 CTRL+SHIFT+N 全局搜索文件 ,优先文件名匹配的文件 CIRL+B 找变量的来源,跳到变量申明处 (CTRL+ 鼠标单击 也可以) CTRL+G 定位行,跳转行 CTR ...
- iOS9 class dump header
获取系统私有API,网上有很多资料总结了一下就三种方式: 使用class-dump可以提取系统私有API列表 使用class-dump+DumpFrameworks.pl,这个可以一次性提取所有系统F ...