初始FreeMake

时间:2023-03-08 23:13:55
初始FreeMake

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

视频地址:http://www.icoolxue.com/play/5773

源码:码云:https://gitee.com/wmjGood/FreeMaker

FreeMarker.语言概述

Frellarker是一一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。

Freellarker.被设计用来生成HTIlL Web页面,特别是基于MVC模式的应用程字。

虽然EreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由Frellarker生成页面,通过模板显示准备的数据

初始FreeMake

  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)

初始FreeMake

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

初始FreeMake

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();
}
}
}
}
}

结果:初始FreeMake

数据类型

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

初始FreeMake

指令

if语句(在a.ftl文件中)

你好啊,${user} ,今天好冷啊
<#--在模板中单双引号都可以-->
<#if user=="wmj">
wmj!
</#if>

if else指令

初始FreeMake

分数:${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>

结果:初始FreeMake

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}

结果:初始FreeMake

宏指令有没有返回值??????

宏指的是<#macro>,函数指的是<#function>,都允许设置参数,内部可以包含流程控制语句。

区别如下:

  • 宏内部的Html代码会直接显示在页面上,更适合用来封装一些页面组件,宏不允许有返回值,如果设置返回值,将直接报错。
  • 函数用来写一些仅用于计算的代码块,内部即便写了Html代码,页面也是不会显示的,函数可以有返回值。

链接:

https://blog.****.net/chen413203144/article/details/78279153

<#function Add a b>
<#--函数就算写了其它页面代码也不会显示-->
<font>asdadadad</font>
<#assign sum = a+b>
<#return sum/>
</#function>
${Add(1, 2)}