freemaker入门demo

一 写一个简单的入门demo##

1.创建一个mavenProject-jar######

在pom.xml中引入依赖

 <dependencies>
 		<dependency>
		<groupId>org.freemarker</groupId>
		<artifactId>freemarker</artifactId>
		<version>2.3.23</version>
	</dependency>  
 
 </dependencies>
2.设置静态模板,放入src/main/resources,后缀名一般使用"ftl"######
<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	
	<body>
		${name},你好,${message}
	</body>
</html>
3.设置数据源.src/main/java/com/mydemo/freeMakerDemo######
package com.mydemo.freeMakerDemo;


import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;


import freemarker.template.Configuration;
import freemarker.template.Template;


public class Test {
	public static void main(String[] args) throws Exception {
		/**
		 * 1.创建配置对象
		 * 需要注意的是:
		 * 		new Configuration需要传入参数,参数为freeMaker版本号
		 * 		Configuration有静态方法getVersion()获取版本号
		 */
		Configuration configuration = new Configuration(Configuration.getVersion());
		
		/**
		 * 2.设置模板所在目录
		 * 需要注意的是:
		 * 		setDirectoryForTemplateLoading中的参数是一个File
		 * 		File的参数精确到文件夹
		 * 		与之相反的是后面的输出流对象则是一个文件
		 */
		configuration.setDirectoryForTemplateLoading(new File("E:\\develop\\eclipse1.7\\freemaker-Demo\\src\\main\\resources"));
		
		/**
		 * 3.设置字符集
		 * 非必要,与步骤2位置可以互换
		 * 需要注意的是:
		 *      workspace的字符集也必须更换到utf-8,否则生成的静态页面会有乱码
		 */
		configuration.setDefaultEncoding("utf-8");
		
		/**
		 * 4.获取模板对象,参数String,值随意
		 */
		Template template = configuration.getTemplate("test.ftl"); 
		
		/**
		 * 5.设置数据源
		 * 需要注意的是:
		 * 		数据源可以是pojo,也可以是Map,但Map更加灵活
		 * 		并且,模板中如果有标记,则数据源中必须有对应的数据,否则报错
		 */
		Map<String,String> map = new HashMap<String, String>();
		map.put("name", "张三");
		map.put("message", "欢迎使用freemaker");
		
		/**
		 * 6.设置输出位置,以IO流的形式输出,jutidao文件
		 */
		Writer writer = new FileWriter("E:\\developTemps\\test.html");
		
		/**
		 * 输出
		 */
		template.process(map, writer);
		
		/**
		 * 关闭流
		 */
		writer.close();
	}
}

二 指令

语法:<#指令名 参数>

1.注释######

静态模板代码


<html>
<head>
	<meta charset="utf-8">
	<title>FreemarkeDemo</title>
</head>
<body>
	<#--这是freemark的注释-->
	<!-- 这是html的注释,两者的区别是这个注释会出现在生成的模板中,并且f12能看到,freemaker的注释指令在生成的页面中不显示-->
	${name},你好,${message}

</body>

</html>

生成的静态页

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		张三,你好,欢迎使用freemaker
	</body>
</html>
2.assign指令######

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!-- assign指令写在静态模板中,作用为制定数据源,assign指定的数据源在java代码的数据源中可以不定义 -->
		<!-- 定义简单数据类型 -->
		<#assign linkMan="张三"><br>
		${linkMan}
		
		<hr>
		<!-- 定义简单对象类型 -->
		<#assign people={"name":"张三","address":"成都xxxxx","phone":"182xxxxxxxx"}>
		${people.name}<br>
		${people.address}<br>
		${people.phone}<br>
	</body>
</html>

生成的静态页

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!-- assign指令写在静态模板中,作用为制定数据源,assign指定的数据源在java代码的数据源中可以不定义 -->
		<!-- 定义简单数据类型 -->
		<br>
		张三
		
		<hr>
		<!-- 定义简单对象类型 -->
		张三<br>
		成都xxxxx<br>
		182xxxxxxxx<br>
	</body>
</html>
3.include指令######

静态模板代码

– test.ftl

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!-- include指令可以包含另一个页面 -->
		<#include "head.ftl">
		<br>
		<#-- 指令 assign-->
		<#assign linkMan="张三">
		${linkMan}
	</body>
</html>

head.ftl

<strong>欢迎使用freemark</h1>

生成的静态页面

<html>
	<head>
		<meta charset="utf-8">
		<title>效果图</title>
	</head>
	<body>
		<!-- include指令可以包含另一个页面 -->
		<strong>欢迎使用freemark</strong>
		<br>		
		张三
	</body>
</html>
4.if指令######

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!-- success == true -->
		<#assign success1=true>
		<#if success1=true>
			通过
		<#else>
			未通过
		</#if>
		<hr>
		<!--success == false-->
		<#assign success2=false>
		<#if success2=true>
			通过
		<#else>
			未通过
		</#if>
	</body>
</html>

生成页面代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!-- success == true -->
					通过
		<hr>
		<!--success == false-->
			未通过
	</body>
</html>
5.list指令######

数据源(java)代码

package cn.itcast.freemakerDemo;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class Test {
	public static void main(String[] args) throws Exception {
	    // 创建配置对象
		Configuration configuration = new Configuration(Configuration.getVersion());
		
		// 设置模板目录
		configuration.setDirectoryForTemplateLoading(new File("E:\\develop\\eclipse1.7\\freemaker-Demo\\src\\main\\resources"));
		
		// 指定字符集
		configuration.setDefaultEncoding("utf-8");

		// 获取模板对象
		Template template = configuration.getTemplate("test.ftl"); 
		
		// 设置数据源
		// 商品1
		Map<String,Object> goods1=new HashMap<String,Object>();
		goods1.put("name", "苹果");
		goods1.put("price", 5.8);
		// 商品2
		Map<String,Object> goods2=new HashMap<String,Object>();
		goods2.put("name", "香蕉");
		goods2.put("price", 2.5);
		// 商品3
		Map<String,Object> goods3=new HashMap<String,Object>();
		goods3.put("name", "橘子");
		goods3.put("price", 3.2);
		// 封装list
		List<Map<String,Object>> goodsList=new ArrayList<Map<String,Object>>();
		goodsList.add(goods1);
		goodsList.add(goods2);
		goodsList.add(goods3);
		
		// 封装map
		Map<String,List<Map<String,Object>>> map = new HashMap<String, List<Map<String,Object>>>();
		map.put("goodsList", goodsList);
		
		// 设置输出流
		Writer writer = new FileWriter("E:\\developTemps\\test.html");
		
		// 生成静态代码
		template.process(map, writer);
		
		// 关闭流
		writer.close();
	}
}

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<#list goodsList as goods>
			商品名称:${goods.name} || 商品价格:${goods.price}
			<br>			
		</#list>
	</body>
</html>

生成页面代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
			商品名称:苹果 || 商品价格:5.8
			<br>			
			商品名称:香蕉 || 商品价格:2.5
			<br>			
			商品名称:橘子 || 商品价格:3.2
			<br>			
	</body>
</html>

ps:获取列表下表:_index

	<#list goodsList as goods>
		商品名称:${goods.name} || 商品价格:${goods.price}
		<br>			
	</#list>

三 内置函数

语法:${对象?内置函数名}

1.获取集合长度 ?size

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<#list goodsList as goods>
			商品名称:${goods.name} || 商品价格:${goods.price}
			<br>			
		</#list>
		
		<br>
		本页面一共有<strong>${goodsList?size}</strong>条数据
	</body>
</html>

生成页面代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
			商品名称:苹果 || 商品价格:5.8
			<br>			
			商品名称:香蕉 || 商品价格:2.5
			<br>			
			商品名称:橘子 || 商品价格:3.2
			<br>			
		
		<br>
		本页面一共有<strong>3</strong>条数据
	</body>
</html>
2.将json字符串转换为json######

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>		
		<#assign people="{'name':'张三','address':'成都xxxxx','phone':'182xxxxxxxx'}">
		<#assign data=people?eval>
		姓名:${data.name}<br>
		地址:${data.address}<br>
		电话:${data.phone}<br>
	</body>
</html>

生成页面代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		姓名:张三<br>
		地址:成都xxxxx<br>
		电话:182xxxxxxxx<br>
	</body>
</html>
3.日期格式化

数据源(java)代码

map.put("time",new Date());

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		当前日期:${time?date}<br>
		当前时间:${time?time}<br>
		当前日期+时间:${time?datetime}<br>
		日期格式化:${time?string("yyyy年MM月dd日 HH时mm分ss秒")}
	</body>
</html>

生成页面代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>					
		当前日期:2018-3-3<br>
		当前时间:16:42:09<br>
		当前日期+时间:2018-3-3 16:42:09<br>
		日期格式化:2018年03月03日 16时42分09秒
	</body>
</html>
4.数字格式化(去掉数字的,) ?c######

ps:在freemaker中,数字超过三位会自动加逗号,去掉逗号需要使用${number?c}指令

数据源(java)代码

map.put("num",1312545)

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		${point?c}
	</body>
</html>

生成静态页面

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		12548524
	</body>
</html>

四 空值处理

在写模板时,有时候我们不知道某个变量是否会赋值,这时候我们需要对变量进行处理,以防止如果该变量为空造成的程序终止

静态模板代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!-- 方法一:使用if判断  ??为判断变量是否存在 -->
		<#if aaa??>
			变量存在
		<#else>
			变量不存在
		</#if>
		<hr>
		<!-- 方法二:${变量!""}  "这里面写如果变量不存在使用什么代替" -->
		${bbb!"变量不存在"}
	</body>
</html>

生成的静态页面

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!-- 方法一:使用if判断  ??为判断变量是否存在 -->
			变量不存在
		<hr>
		<!-- 方法二:  "这里面写如果变量不存在使用什么代替" -->
		变量不存在
	</body>
</html>

五 其他

1.关于<#if>判断中使用比较运算符报错的问题######

错误代码

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<#if number>100>
			大于100
		</#if>
	</body>
</html>

原因:freemaker将"<#if number>100>“分解为了”<#if number>" 和"100>"两部分,判断无法进行

解决办法:将"number>100"用括号包起来 或者使用"gt"(大于),“gte”(大等),“lt”(小于),“lte”(小等)代替

<html>
	<head>
		<meta charset="utf-8">
		<title>FreemarkeDemo</title>
	</head>
	<body>
		<!--方法一-->
		<#if (number>100)>
			大于100
		</#if>
		<hr>
		<!--方法二-->
		<#if numbergt 100>
			大于100
		</#if>
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值