初始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初始值问题
随机推荐
- Android无法删除项目+导入项目报错
Android无法删除项目+导入项目报错 Android无法删除项目:关闭eclipse或关闭电脑,然后重启,继续删除就可以了 导入项目报错:右键–>配置–>中就可以看到了,更改一下就可以 ...
- LeetCode 1013 Partition Array Into Three Parts With Equal Sum 解题报告
题目要求 Given an array A of integers, return true if and only if we can partition the array into three ...
- TCP/IP的分层管理
网络基础TCP/IP 我们通常所使用的网络(包括互联网)均是在TCP/IP协议族的基础上运作的.HTTP属于它内部的一个子集 TCP/IP协议族按层次分为:应用层,传输层,网络层和数据链路层(更好的划 ...
- 15.4-uC/OS-III资源管理(二值信号量)
互斥信号量是 uC/OS 操作系统的一个内核对象, 与多值信号量非常相似,但它是二值的,只能是 0 或 1,所以也叫二值信号量, 主要用于保护资源. 1.如果想要使用互斥信号量,就必须事先使能互斥信号 ...
- 解决跨域问题-jsonp&cors
跨域的原因 浏览器的同源策略 同源策略是浏览器上为安全性考虑实施的非常重要的安全策略. 指的是从一个域上加载的脚本不允许访问另外一个域的文档属性. 举个例子:比如一个恶意网站的页面通过iframe嵌入 ...
- python进阶之 进程编程
1.进程 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内 ...
- 小程序自定义tabBar,动态控制tabBar
最近做项目的时候,突然来了个小特殊的需求,根据客户的类型来动态显示底部的tabBar菜单.当时我就有点小懵逼了,这个不是小程序自带的组件么?还要做成动态?这就有点尴尬了..... 不过也只是一时尴尬而 ...
- Python数据分析与挖掘常用模块
python在数据科学方面需要用到的库: a.Numpy:科学计算库.提供矩阵运算的库. b.Pandas:数据分析处理库 c.scipy:数值计算库.提供数值积分和常微分方程组求解算法.提供了一个非 ...
- 【UML】NO.70.EBook.9.UML.4.001-【PowerDesigner 16 从入门到精通】- 基础概念
1.0.0 Summary Tittle:[UML]NO.70.EBook.9.UML.4.001-[PowerDesigner 16 从入门到精通]- 基础概念 Style:DesignPatte ...
- sql 小技巧
declare @pids varchar(max)='' ),pid)+','+@pids from product where pname like '%red%' select @pids