此文章是观看视频学习的,只是一点点基础还不太深

视频地址: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的更多相关文章

  1. 2DToolkit官方文档中文版打地鼠教程(一):初始设置

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...

  2. CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总

    CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总 开始 总的来说,OpenGL应用开发者会遇到为如下三种数据创建Vertex Buffer Object的情形: ...

  3. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  4. linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】

    如果在ubuntu 下面 使用xampp这个集成开发环境,却忘记mysql密码. 注:刚安装好的xampp的Mysql初始密码是空... 找回密码的步骤如下: 1.停止mysql服务器 sudo /o ...

  5. python基础之初始python

    初始python之基础一 一.Python 介绍 1.python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发 ...

  6. openfire 初始密码

    openfire 初始密码 mssql2014 进入数据库,找到 ofUser 表 ,将密码字段对应的密文替换为下面的内容,则密码就是 admin ecbd03623cd819c48718db1b27 ...

  7. Bash 什么时候会给 HOME 赋初始值

    今天无意发现下面这个表现: $  env -i bash -c cd bash: line 0: cd: HOME not set $ env -i bash -c 'echo $HOME' 这表明了 ...

  8. Holt-Winters原理和初始值的确定

      关于模型 (来自以下PPT,从第4页开始)   关于初始值: 以下文档给出了三个模型的初始值计算的思路. 大致思路如下,建立一个p阶移动平均模型,估计出参数即为初始值,具体的根据三种不同的模型,有 ...

  9. 关于int,integer初始值问题

随机推荐

  1. Phpstorm 2018及2017.3.2激活码(DataGrip WebStorm 激活码)

    PhpStrom的下载地址:https://www.jetbrains.com/phpstorm/ 2018适应 最新版PhpStorm 2018正式版改进了PHP 7支持,改进代码完成功能. 直接用 ...

  2. Installing Ruby 2.2 on Centos7

    准备做redis-cluster,需要ruby2.2环境 开整环境:Centos7.2最小安装yum源:阿里的base和epel源 ********************************** ...

  3. Gym 101194C / UVALive 7899 - Mr. Panda and Strips - [set][2016 EC-Final Problem C]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  4. Java图片合并

    /** * 纵向合并图片,ossObject.getObjectContent()返回InputStream对象 */ private BufferedImage mergeImage(List< ...

  5. 如何将本地大文件通过终端上传到linux服务器

    第一种方式:  SecureCRT下   上传文件只需在shell终端仿真器中输入命令“rz”,即可从弹出的对话框中选择本地磁盘上的文件,利用Zmodem上传到服务器当前路径下.   下载文件只需在s ...

  6. 【托业】【新东方托业全真模拟】TEST09~10-----P5~6

    at no time 绝不,从不 takeover 收购 startup n.启动; 新兴公司(尤指新兴网络公司); 新兴公司,新开张的企业; specific具体的,特定的:factual 事实的, ...

  7. 【Linux】-NO.87.Assembly.1.滴水逆向.1.001-【介绍】-

    1.0.0 Summary Tittle:[Linux]-NO.87.Assembly.1.滴水逆向.1.001-[基础]- Style:Java Series:Log4j Since:2017-04 ...

  8. jenkins配置工程目录-启动case

    1.我们在python里面编辑的脚本可以正常跑,但是在cmd里面跑就不行了,找不到自己定义的方法模块,这个时候我们要搞个环境变量 name  :   PYTHONPATH   val : 工程目录路劲 ...

  9. 正则表达式(re模块)

    s='hello world' print(s.find('llo')) #找到llo ret=s.replace('ll','xx') #用xx代替ll print(ret) print(s.spl ...

  10. sublime lincense for linux

    sublime lincense for linux Sublime Text 3.x (after Build 3133) —– BEGIN LICENSE —–TwitterInc200 User ...