FreeMarker 模板引擎技术

  FreeMarker技术


1.1  模板引擎技术


Freemarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点:
(1)Freemarker 适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。
(2)虽然Freemarker 具有一些编程的能力,但通常由Java程序准备要显示的数据,由Freemarker 生成页面,通过模板显示准备的数据 。
(3)Freemarker 不是一个Web应用框架,而适合作为Web应用框架一个组件。

(4)Freemarker 与容器无关,因为它并不知道HTTP或Servlet。
(5)Freemarker 更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。
(6)Freemarker 是免费的 。


数据模型+模版=输出




1.2 FreeMaker基本语法


1、FreeMarker标记

FreeMarker标记的设计非常精炼,只有三种:


1) $ : ${expression} FreeMarker会在输出时用实际值进行替代
        例如:${stockNum?default(‘’)}
2) # :标准的FTL标记。大部分FreeMarker指令都以#开始,可以明显地与html标记区分, 
<#if user = "BigJoe">our beloved leader</#if>。
同时,FTL文件的注释包含在<#--和-->(而不是<!--和-->)之间  
3) @作为用户定义指令使用宏变量时,使用@替代FTL标记中的#。后面将详细介绍宏 


2标准的FTL标记指令
1) if, else, elseif
2) switch, case, default, break
3) list, break
4) include
5) Import
6) assign
7) macro, nested, return

下面是我个人敲的一些例子:

1.创建一个 关于macro(宏) 的 FreeMarker实例:

package freeMarker;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
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.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class TestMacro {
	public static void main(String[] args) throws IOException, TemplateException {
		//配置ftl的查找目录
		Configuration cfg = new Configuration();
		
		cfg.setDirectoryForTemplateLoading(
		        new File("template"));
		//设置数据的抓取模式
		cfg.setObjectWrapper(new DefaultObjectWrapper());
		Map root = new HashMap();
		
		List list = new ArrayList();
		User user = new User();
		user.setId("1");
		user.setName("zs");
		list.add(user);
		User user1 = new User();
		user1.setId("2");
		user1.setName("ls");
		list.add(user1);
		root.put("userlist", list);
		
	Template temp = cfg.getTemplate("macro.ftl");
		
		
		//生成html  输出到目标
		Writer out = new OutputStreamWriter(System.out);
		temp.process(root, out);
		out.flush();
	}
}

ftl模板如下:


<#macro mymacro p1 p2>
我的结果是:${p1+p2}
</#macro>

<@mymacro p1=10 p2=198 />
<@mymacro p1=99 p2=1 />

<#assign str='  hellow my name is cxy'>
 str的长度 :${str?length}
 打印 str :--${str}--
 去 空格 :--${str?trim}--
 转换大写:--${str?upper_case}--
 转小写:--${str?lower_case}--
 --${userlist?size}--
 截取 四舍五入:--${1.65959?float}--
 
 <#assign aaa=45>
 <#if aaa?exists>
 ${aaa}
 </#if>

输出结果如下:

我的结果是:208
我的结果是:100

 str的长度 :25
 打印 str :--  hellow my name is qgc  --
 去 空格 :--hellow my name is qgc--
 转换大写:--  HELLOW MY NAME IS QGC  --
 转小写:--  hellow my name is qgc  --
 --2--
 截取 四舍五入:--1.66--
 
 45

2.创建一个 关于 的 FreeMarker实例:


package freeMarker;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
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.DefaultObjectWrapper;
import freemarker.template.Template;

public class TestFreeMarker {
	public static void main(String[] args) throws Exception {
		//配置ftl的查找目录
		Configuration cfg = new Configuration();
		
		cfg.setDirectoryForTemplateLoading(
		        new File("template"));
		//设置数据的抓取模式
		cfg.setObjectWrapper(new DefaultObjectWrapper());
		
		Map latest = new HashMap();
		//构建数据
		latest.put("url", "products/greenmouse.html");
		latest.put("name", "green mouse");
		
		Map root = new HashMap();
		root.put("user", "Big Joe");
		root.put("latestProduct", latest);
		
		
		root.put("sex",0);
		
		String [] str = new String[]{"1","2","3"};
		root.put("arr", str);
		
		
		List list = new ArrayList();
		User user = new User();
		user.setId("1");
		user.setName("zs");
		list.add(user);
		User user1 = new User();
		user1.setId("2");
		user1.setName("ls");
		list.add(user1);
		root.put("userlist", list);
		
		String [] ste = new String[]{"1","2","3","4","5","6"};
		root.put("aee", ste);
		//实例化模板对象
		Template temp = cfg.getTemplate("helloworld.ftl");
		
		FileOutputStream fos = new FileOutputStream("c:\\html\\hello.html");
		
		//生成html  输出到目标
		Writer out = new OutputStreamWriter(fos);
		temp.process(root, out);
		out.flush();

	}
}

ftl模板如下:

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>Welcome ${user}!</h1>
  <p>Our latest product:
  <a href="${latestProduct.url}">${latestProduct.name}</a>

if :

 我的性别是: ${sex}
  	 if 输出:
  <#if sex =0>
  	男
  	<#else>
  	女
  </#if>
  <br/>

switch:

 switch 输出:
  <#switch 5>
  	<#case 5>
  	this 5
  	<#break>
  	<#case 6>
  	this 6
  	<#break>
  </#switch>
  <br/>

list :

<#--list--> 循环
	list 输出 数组:
  	<#list arr as item>
  		${item} 
  	</#list>
  	list输出list:
  	<#list userlist as tem>
  		${tem.id}------${tem.name}
  	</#list>
  	<br/>

list 判断基偶:

<#list aee as tee>
  		<#--终止循环  break-->
  		<#if tee_index==2>
  		<#break>
  		</#if>
  		<#if (tee_index+1)%2==0>
  		<font color=green>${tee}---${tee_index+1}</font><br/>
  		<#else>
  		<font color=red>${tee}---${tee_index+1}</font>
  		</#if>
  	</#list>


结尾:

</body>
</html>  


include 和 import 的区别:


include 调用同名变量 会覆盖
[html]  view plain  copy
  1. <#include "include.ftl">  
  2. <#include "include2.ftl">  
  3. ${age}  

import 可以设置别名,分别调用
[html]  view plain  copy
  1. <#import "include.ftl" as c1>  
  2. <#import "include2.ftl" as c2>  
  3. ${c2.age} ${c1.age}  


macro 的使用


宏可以自定义函数
[plain]  view plain  copy
  1. <#macro mymacro p1 p2>  
  2. ${p1+p2}  
  3. </#macro>  
  4. <@mymacro p1=234 p2=234 />  



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值