Freemark的使用总结

1、关于list和map的取值以及if的使用

<#--pojo的取值-->
<h1>hello:${emp.name}---${emp.id}----${emp.age}</h1>

<#--以下显示了如何使用判断结构,注意在判断的标签中不用加入${}-->
<#if emp.age lt 18>
	${emp.name}是童工
<#elseif emp.age gt 60>
	${emp.name}应该退休了
<#else>
	${emp.name}好好工作
</#if>


<#--list的遍历-->
<#list emps as emp>
	${emp.id}-----${emp.name}---${emp.age}<br/>
</#list>

<#--map的遍历-->
<#--freemarker最为特殊的一个问题就是对于map而言,支持String类型作为key-->
<#assign user={"1":"老张","2":"小张"}/>
${user["1"]}

<#--map的遍历首先要获取key-->
<#assign keys=maps?keys/>
<#list keys as key>
	${key}---${maps["${key}"]}
</#list>
2、变量的定义,以及输出

      在Freemark中,${}只能输出字符串和数值型的变量。对于布尔和日期类型的变量。需要先使用?string()函数转换为字符串类型,在使用${}输出.

<#-- <#assign bianlang=value> 用来定义一个变量 -->
<#-- 定义了一个数值型变量-->
<#assign n=1/>
${n+1}

<#-- 定义了一个字符串型变量-->
<#assign s="1"/>
${s+1}

<#-- 定义了一个布尔型变量-->
<#--对于freemarker而言,只能用${}这种方式输出数字或者字符串,对于其他类型都无法输出-->
<#assign b=true/>

<#-- 布尔类型变量的输出-->
<#--${b}:是一个boolean类型,无法输出,需要将其转换为字符串才能输出-->
<#--将boolean转换为字符串-->
${b?string}
${b?string("yes","no")}

<#--${.now}显示当前的日期-->
${.now}
<#--输出日期类型,转换为字符串类型-->
${.now?string("[yyyy/MM/dd]")}

<#--时间的输出(转换为字符串输出)-->
<#assign d="2012-12-22 12:22:22"?date("yyyy-MM-dd HH:mm:ss")>
${d?string("yyyy/MM/dd HH:mm:ss")}
3、Freemark中的变量范围

      3.1当在模板中显示这个变量的时候,首先会找模板变量,如果模板变量不存在就会去数据模型中找。

<#--用来导入相应的数据,导入的路径依然是从模板所在的位置开始-->
<#include "/inc/top.ftl"/>
<#--以下定义是和root中的username有冲突,其实不是进行覆盖,而且用一个优先级比较高的对象将其隐藏了-->
<#assign username="小李"/>
<#--
	对于freemarker而言,有如下几种数据范围
	1、数据模型变量 -- root中的变量
	2、模板变量         -- 在模板文件中通过assign来定义
	3、局部变量
	4、循环变量
	当在模板中显示这个变量的时候,首先会找模板变量,如果模板变量不存在就会去数据模型中找
-->
<#--模板中存在,所以就直接显示-->
${username}
<#--.globals可以直接去数据模型中找变量-->
${.globals.username}

<#list emps as emp>
<#--循环变量仅仅只是在循环中有效,出了循环马上失效,不会影响模板变量-->
	${emp.name}
</#list>
    3.2 top.ftl的内容
<h1>hello:${username}</h1>
<hr/>

4、<#include >和<#import />指令的区别

<#--如果使用include来导入多个ftl文件,
            这些ftl文件中所定义的模板变量可能会完成覆盖,
            所以如果要引入相应的由ftl编写的函数等模块不建议使用include,而是用import来代替,
    include一般用于引入模板的公共部分在这些公共部分中不加入任何变量定义
-->
<#include "/inc/inc1.ftl"/>
<#include "/inc/inc2.ftl"/>

<#--使用import可以加入相应的名称空间,以下代码将inc1.ftl引入并且加入到了inc1的名称空间中-->
<#import "/inc/inc1.ftl" as inc1/>
<#import "/inc/inc2.ftl" as inc2/>
${inc1.username}---${inc2.username}
inc1.ftl的内容

<#assign username="老张"/>

inc2.ftl的内容

<#assign username="老李"/>

5、Freemark中空值的判断

     在freemarker中如果出现空值,不会什么都不显示,而是会报错,要求开发人员手动处理

<#--在freemarker中如果出现空值,不会什么都不显示,而是会报错,要求开发人员手动处理-->
${emp.id}---${emp.group!("没有group")}

<#--如果使用了对象导航,!仅仅只会判断最后一个是否为空,
          如果导航中的某个对象为空依然会报错, 所以在导航中最好使用括号将要判断的全部包含起来-->
<br/>
${(emp.group.name)!}
${(a.b.c)!("a.b.c没有定义")}

<#--(a.b)??表示判断a.b是否为空-->
<#if (a.b)??>
	不为空
<#else>
	a.b为空
</#if>

<#--判断是否为空,然后就变成了布尔类型。然后在转换为字符类型并且输出这个布尔类型-->
${(a.b)???string}

6、FreemarkerUtil工具类

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

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

public class FreemarkerUtil {
	private static FreemarkerUtil util;
	private static Configuration cfg;

	private FreemarkerUtil() {
	}

	@SuppressWarnings("deprecation")
	/**
	 * 获取FreemarkerUtil的单例
	 * @param pname freemark中的模板文件,存放的路径
	 * @return
	 */
	public static FreemarkerUtil getInstance(String pname) {
		if (util == null) {
			cfg = new Configuration();
			cfg.setClassForTemplateLoading(FreemarkerUtil.class, pname);
			util = new FreemarkerUtil();
		}
		return util;
	}

	private Template getTemplate(String fname) {
		try {
			return cfg.getTemplate(fname);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 通过标准输出流输出模板的结果
	 * 
	 * @param root
	 *            数据对象
	 * @param fname
	 *            模板文件的名称
	 */
	public void sprint(Map<String, Object> root, String fname) {
		try {
			getTemplate(fname).process(root, new PrintWriter(System.out));
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 基于文件的输出
	 * 
	 * @param root
	 *            要在freemark里面,显示的数据
	 * @param fname
	 *            生成的文件名称
	 * @param outpath
	 *            生成文件的输出路径
	 */
	public void fprint(Map<String, Object> root, String fname, String outpath) {
		try {
			getTemplate(fname).process(root, new FileWriter(outpath));
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
7、 源码下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值