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章 浮点运算
随机推荐
- Java:装饰设计模式
装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能, 并提供加强功能,那么自定义的该类就称为装饰类. 装饰类通常通过构造方法接收被装饰的对象,并基于被装饰的对 ...
- eclipse中maven项目部署到tomcat
其实maven项目部署到tomcat的方式很多,我从一开始的打war包到tomcat/webapps目录,到使用tomcat-maven插件,到直接使用servers部署,一路来走过很多弯路. 下面就 ...
- 大型web系统架构详解
(如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 动态应用,是相对于网站静态内 ...
- gitlab的搭建和linux客户端的连接
一.安装 1.新建 /etc/yum.repos.d/gitlab-ce.repo,添加以下内容 1 2 3 4 5 6 7 [gitlab-ce] name=gitlab-ce baseurl=ht ...
- Oracle —— 函数 length() 和 lengthb() 的区别
先看看几个例子: select length('Oracle') from dual 结果:6 select lengthb('Oracle') from dual 结果:6 select lengt ...
- Codis使用教程
1. Codis集群的搭建与使用 http://www.cnblogs.com/xuanzhi201111/p/4425194.html https://github.com/CodisLabs/co ...
- hibernate工具类HibernateUtil详解
1.为什么要用hibernateUtil这个类,先看这段代码: //加载配置文件信息默认为hiberna.cfg.xml,如果不是的话那么就在config()方法里面去解析他 Con ...
- URAL1355. Bald Spot Revisited
1355 其实就是求质因子的个数 这样肯定是最多的 注意一下 除到最后不是1的情况 #include <iostream> #include<cstdio> #include& ...
- 连接Access数据库查询语句
--在使用之前注意将“生成”里的“配置管理器”的“配置平台”改成X86 private void button1_Click(object sender, EventArgs e)//查询 { Ole ...
- HDU 1513 Palindrome
题目就是给一个字符串问最少插入多少个字符能让原字符串变为回文字符串. 算法: 用原串的长度减去原串与翻转后的串的最大公共字串的长度,就是所求答案. //#define LOCAL #include & ...