简介

简介

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

参考资料

  1. B1 :《FreeMarker中文版文档.pdf》

  2. B2 :

项目

  1. P1:F:\360\Learn\FreeMarker\workspace\FreeMarker-hello-java\https://github.com/yejq/FreeMarker-hello-java.git

  2. P2:F:\360\Learn\freemarker\workspace\FreeMarker-hello-web\https://github.com/yejq/FreeMarker-hello-web.git

FreeMarker笔记 前言&第1章 入门的更多相关文章

  1. 一、FreeMarker 模版开发指南 第一章 入门

    所有资料来自 南磊 翻译的官方文档,我弄简单了,适合自己以后拿出来翻看. 章节内容如下: 简介 模板+数据模型=输出 数据模型一览 模板一览 一.模板  +  数据模型  =  输出 输出结果: &l ...

  2. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  4. jQuery学习笔记(一):入门

      jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操 ...

  5. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  6. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  7. 《深入Java虚拟机学习笔记》- 第16章 控制流

    <深入Java虚拟机学习笔记>- 第16章 控制流

  8. 《深入Java虚拟机学习笔记》- 第17章 异常

    <深入Java虚拟机学习笔记>- 第17章 异常

  9. 《深入Java虚拟机学习笔记》- 第13章 逻辑运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

随机推荐

  1. log4j打印日志配置

    1.所需的jar包 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifa ...

  2. Two Sigma OA

    刚做了两道Two Sigma OA. 还是两道老题, Friend Cycle和Longest Chain. Friend Cycle可以用Union Find来做.优化的时候因为矩阵是沿对角线对称, ...

  3. 关闭Centos写磁盘功能

    一个Linux文件默认有3个时间.atime:对此文件的访问时间. ctime:此文件inode发生变化的时间. mtime:此文件的修改时间. 如果有多个小文件(比如Web服务器的页面上有多个小图片 ...

  4. C语言:几种字符输入函数的区别

    几种字符输入函数的区别: 1.getche()函数:用于从键盘读入一个字符并显示,然后直接执行下一条语   句. 2.getch()函数:用于从键盘中读入一个字符,但不显示在屏幕上,       然后 ...

  5. 解决JVM最大内存设置问题

    这里和大家讨论一下如何获得JVM最大内存,在命令行下用java-XmxXXXXM-version命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息. ...

  6. 在MAC中安装XMPP服务器

    一.安装MySQL 1.下载安装包

  7. .NET中使用OleDb读取Excel

    在.NET中可以用OleDb(Object linking and embeding DataBase)来访问Excel using System; using System.Data; using ...

  8. 转:Maven介绍(创建工程项目以及下载所需要的jar包)

    http://blog.csdn.net/guanghua2009/article/details/6644111 目前我还不太会用maven,慢慢学吧 目前就是用来下载自己要的jar包,先根据这篇转 ...

  9. C# const与static的理解

    C#  const与static的理解 static readonly与 const变量,作用是一样的,无论访问修饰符是不是public,还是其它(private. protected.interna ...

  10. hdu 3177

    题目大意:向体积为v的山洞中搬运n个物品,每个物品具有(a,b) 属性.其中a是停放体积,b是移动体积.输出这个山东是否能放下这n个物品 解题思路: 1)当前物品能否放进山洞取决于当前物品的的移动体积 ...