初始FreeMake
此文章是观看视频学习的,只是一点点基础还不太深
视频地址:http://www.icoolxue.com/play/5773
源码:码云:https://gitee.com/wmjGood/FreeMaker
FreeMarker.语言概述
Frellarker是一一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。
Freellarker.被设计用来生成HTIlL Web页面,特别是基于MVC模式的应用程字。
虽然EreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由Frellarker生成页面,通过模板显示准备的数据

Freellarker不是一个Web应用框架,而适合作为Web应用框架一个组件。模型容器是个map集合
Freellarker.与容器无关,因为它并不知道HTTP或Servlet; Frellarker 同样可以应用于非Web应用程序环境。
FrelMarker.更适合作为Mode12框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。心
Frellarker是免费的
FreeMarker特性
通用目标
能够生成各种文本,HTML、XMLL RTF、Java 源代码等等易于嵌入到你的产品中,轻量级;不需要Servlet环境+
插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等+
你可以按你所需生成文本:保存到本地文件,作为Email发送;从Web应用程序发送它返回给Web浏览器。
强大的模板语言
所有常用的指令: indude、 ifelseif/else. 循环结构,在模板中创建和改变变量,
几乎在任何地方都可以使用复杂表达式来指定值,命名的宏,可以具有位置参数和嵌套内容。
名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突,
输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等,你可以定义自己的转换
通用数据模型
FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示。
你可以使用抽象(接口)方式表示对象(JavaBean. XML文档、SQL 查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰。
为Web准备
在模板语言中内建处理典型Web相关任务(如HTML转义)的结构。能够集成到Model2 Web应用框架中作为JSP的替代。支持JSP标记库
为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员
强大的XML处理能力
< #reaurse>和< #visit>指令(2.3版本)用于递归遍历XML树。在模板中精楚和直觉的访问XML对象模型。开源论坛IForum 就是使用了Freellarker 做为页面模板。
智能的国际化和本地化
字符集智能化(内部使用UNICODE)。数字格式本地化敏感山
日期和时间格式本地化敏感。
非US字符集可以用作标识(如变量名)。多种不同语言的相同模板
FreeMaker第一个案例
1.创建idea项目,导入pom节点(第一次很慢)
<!-- https://mvnrepository.com/artifact/com.quhaodian/freemaker -->
<dependency>
<groupId>com.quhaodian</groupId>
<artifactId>freemaker</artifactId>
<version>1.8.1</version>
</dependency>
2.在项目下创建名为“template”的目录,在目录下创建名为a.ftl(ftl:freemaker template)

在a.ftl文件中内容如下:

3.在src下创建测试类Demo
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException; import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map; public class Demo {
public static void main(String[] args) {
Writer writer=null;
try {
//创建freemaker实例
Configuration config=new Configuration();
//模板加载
config.setDirectoryForTemplateLoading(new File("templete"));
//创建数据模型
Map map=new HashMap();
//此处的user的名字要和a.ftl中的一致
map.put("user","wmj");
//加载模板文件
Template template=config.getTemplate("a.ftl");
//显示生成数据
writer=new OutputStreamWriter(System.out);
template.process(map,writer);
writer.flush(); } catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}finally {
if (writer!=null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
结果:
数据类型















指令
if语句(在a.ftl文件中)
你好啊,${user} ,今天好冷啊
<#--在模板中单双引号都可以-->
<#if user=="wmj">
wmj!
</#if>
if else指令

分数:${random}
<#-- > <是特殊字符 在html中用的是gt(>) lt(<) 这里也是 gte(大于等于) -->
<#if random gt 20>
好
<#else >
不好
</#if>
<#if random gt 90>
hao
<#elseif random gt 60 >
yiban
<#else>
cha
</#if>
list指令
List list=new ArrayList();
list.add(new Address("中国","上海"));
list.add(new Address("美国","纽约"));
list.add(new Address("日本","东京"));
map.put("list",list); <#--address变量名 变量名.属性-->
<#list list as address >
<span>${address.country}</span>
</#list>
include指令
在目录下创建readme.txt文件
<#include "readme.txt"/>
macore自定义指令
<#--自定义指令(宏指令) m1=方法名-->
<#macro m1>
<span>1</span>
<span>2</span>
</#macro>
<@m1></@m1> <#--调用m1指定 调用几次都可以-->
带参数的宏语句
<#--代参数-->
<#macro m2 a b c>
${a}
${b}
${c}
</#macro>
<#--不用管数据类型,会自动检测-->
<@m2 "小花" "小黑" "小白" />
nested指令
<#--nested(嵌入)指令-->
<#macro border>
<table border="4" cellspacing="0" cellpadding="4">
<tr>
<td>
<#nested ><#--表格内容-->
</td>
</tr>
</table>
</#macro> <@border>
dsadadasdas<#--表格内容-->
</@border>
结果:
assign指令(定义变量)
<#assign mail="2116743767qq.com" >
//获取值
邮箱:${mail}
import指令
在目录下创建b.ftl
<#macro name age>
<p>年龄 ${age}</p> </#macro>
<#--定义变量-->
<#assign mail="1212212.com"> 在a.ftl中
<#--引用b.ftl person变量名 -->
<#import "b.ftl" as person >
<@person.name age="12"/>
${person.mail} <#--改变b.ftl中的mail值-->
<#assign mail="5555" in person>
${person.mail}
结果:
宏指令有没有返回值??????
宏指的是<#macro>,函数指的是<#function>,都允许设置参数,内部可以包含流程控制语句。
区别如下:
- 宏内部的Html代码会直接显示在页面上,更适合用来封装一些页面组件,宏不允许有返回值,如果设置返回值,将直接报错。
- 函数用来写一些仅用于计算的代码块,内部即便写了Html代码,页面也是不会显示的,函数可以有返回值。
链接:
https://blog.csdn.net/chen413203144/article/details/78279153
<#function Add a b>
<#--函数就算写了其它页面代码也不会显示-->
<font>asdadadad</font>
<#assign sum = a+b>
<#return sum/>
</#function>
${Add(1, 2)}
初始FreeMake的更多相关文章
- 2DToolkit官方文档中文版打地鼠教程(一):初始设置
这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...
- CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总
CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总 开始 总的来说,OpenGL应用开发者会遇到为如下三种数据创建Vertex Buffer Object的情形: ...
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...
- linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】
如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 注:刚安装好的xampp的Mysql初始密码是空... 找回密码的步骤如下: 1.停止mysql服务器 sudo /o ...
- python基础之初始python
初始python之基础一 一.Python 介绍 1.python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发 ...
- openfire 初始密码
openfire 初始密码 mssql2014 进入数据库,找到 ofUser 表 ,将密码字段对应的密文替换为下面的内容,则密码就是 admin ecbd03623cd819c48718db1b27 ...
- Bash 什么时候会给 HOME 赋初始值
今天无意发现下面这个表现: $ env -i bash -c cd bash: line 0: cd: HOME not set $ env -i bash -c 'echo $HOME' 这表明了 ...
- Holt-Winters原理和初始值的确定
关于模型 (来自以下PPT,从第4页开始) 关于初始值: 以下文档给出了三个模型的初始值计算的思路. 大致思路如下,建立一个p阶移动平均模型,估计出参数即为初始值,具体的根据三种不同的模型,有 ...
- 关于int,integer初始值问题
随机推荐
- win10下Redis安装
环境:win64 1.因为Redis官方不支持Windows,所在只能在GitHub上下载,下载地址:https://github.com/ServiceStack/redis-windows/blo ...
- WordCount扩展
码云地址:https://gitee.com/xjtsh/ExpandedWordCount 功能实现: wc.exe -c file.c //返回文件 file.c 的字符数 wc.exe ...
- 洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)
题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集) 题目描述 如题,你需要维护这样的一个长度为 N 的数组, ...
- Linux是cat、tail、head查看文件任意几行的数据
Linux是cat.tail.head查看文件任意几行的数据 一.使用cat.tail.head组合 1.查看最后100行的数据 cat filename | tail -n 100 2.查看100到 ...
- 【JVM】-NO.115.JVM.1 -【JDK11 HashMap详解-4-伸展树、B树】
.Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 用stm32f10x建立新的工程重要步骤
stm32f10x系列新建空的工程主要原理: 1.添加启动文件 不同的芯片类型的启动文件的容量是不同的,选择适合该芯片的容量作为启动文件. 注意:启动文件是汇编语言编写的,所以文件的后缀名为.s 2. ...
- Hibernate查询操作
操作前需要创建好Hibernate项目,创建项目,可参考:http://www.cnblogs.com/zhaojinyan/p/9336174.html 一下的例子是从其他贴子粘过来的(知识无国界! ...
- 025-缓存Cache
如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差.而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能.这样无论有多少人访问 ...
- spring cloud zuul参数调优
zuul 内置参数 zuul.host.maxTotalConnections 适用于ApacheHttpClient,如果是okhttp无效.每个服务的http客户端连接池最大连接,默认是200. ...
- flask 使用Flask-Migrate迁移数据库(创建迁移环境、生成迁移脚本、更新数据库)
使用Flask-Migrate迁移数据库 在开发时,以删除表再重建的方式更新数据库简单直接,但明显的缺陷是会丢掉数据库中的所有数据.在生产环境下,没有人想把数据都删除掉,这时需要使用数据库迁移工具来完 ...