您的位置:首页 > 编程语言

小白学习freemark的过程(代码全贴+详细介绍)

2012-08-22 13:02 363 查看
介绍

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写  FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序

环境

学习工具:Myeclipse8.5

在开发工具见好项目,如果要用freemark必须要导入包-----freemarker-2.3.16.jar(版本自己定,可以直接到网上搜,如果用下过struts,在它的lib下面也有这个包)

先给小白看一个最简单的程序,如果是高手请别喷,现在俺也是小白(运行TestFreemark.java文件中的test01方法,由于项目持续更新,小白可以只运行test01方法例子)





目录结构,这个大家注意一下ftl目录在哪个位置就可以了

文件内容 TestFreemark.java

package com.freemark;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;

import com.freemark.model.Article;
import com.freemark.model.Channel;
import com.freemark.model.Student;
import com.freemark.model.User;
public class TestFreemark {
FreemarkerUtil fu = null;
Map<String, Object> root = null;

@Before
public void setUp(){
fu = new FreemarkerUtil();
root = new HashMap<String, Object>();
}

@Test
public void test01() {
root.put("username", "张三");
fu.print("01.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("01.ftl", root, "ggyy.html");//写到D盘file目录下面
fu.filePrint("02.ftl", root, "ggyy.html");//写到D盘file目录下面
}

@Test
public void test03(){
root.put("user", new User(1, "张三", 19));
fu.print("03.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("03.ftl", root, "03.html");//写到D盘file目录下面
}
@Test
public void test04(){
List<User> users = Arrays.asList(new User(1, "张三", 16),new User(2, "李四", 18),new User(3, "王武", 24),new User(4, "小二", 12));
root.put("users", users);
fu.print("04.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("04.ftl", root, "04.html");//写到D盘file目录下面
}
@Test
public void test05(){
List<User> users = Arrays.asList(new User(1, "张三", 16),new User(2, "李四", 18),new User(3, "王武", 24),new User(4, "小二", 12));
root.put("users", users);
root.put("username", "管理员");
fu.print("05.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("05.ftl", root, "05.html");//写到D盘file目录下面
}
@Test
public void test06(){
//现在group没有复制为空,freemark不会自动对空值做处理,必须在模版进行设置(${user.group!"无值"})
root.put("user", new User(1, "张三", 19));
fu.print("06.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("06.ftl", root, "06.html");//写到D盘file目录下面
}
@Test
public void test07(){
//<#assign username="张三" >基本数据类型操作   使用assign自定义变量、变量的转型、date类型处理
root.put("now", new Date());
fu.print("07.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("07.ftl", root, "07.html");//写到D盘file目录下面
}
@Test
public void test08(){
//序列表和hash表
fu.print("08.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("08.ftl", root, "08.html");//写到D盘file目录下面
}
@Test
public void test09(){
//自定义指令macro、nested的用法
fu.print("09.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("09.ftl", root, "09.html");//写到D盘file目录下面
}
@Test
public void test10(){
/*变量分四种:
* 1、数据模型中的变量;
* 2、数据模版中的变量;
* 3、局部变量;local
* 4、循环变量
*/
root.put("username", "张三");//数据模型中的变量
fu.print("10.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("10.ftl", root, "10.html");//写到D盘file目录下面
}
@Test
public void test11(){
/*include导入的模版可以覆盖主模版的变量
*
* 变量分四种:
* 1、数据模型中的变量;
* 2、数据模版中的变量;
* 3、局部变量;local
* 4、循环变量
*/
root.put("username", "王武");//数据模型中的变量
root.put("password", "123456");//数据模型中的变量
fu.print("11.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("11.ftl", root, "11.html");//写到D盘file目录下面
}
@Test
public void test12(){
List<User> users = Arrays.asList(new User(1,"张三",22),
new User(2,"李四",33),
new User(3,"王五",44));
root.put("users",users);
List<Student> stus = Arrays.asList(new Student("123123", "地点"),new Student("11111","方法"));
root.put("stus", stus);
fu.print("12.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("12.ftl", root, "12.html");//写到D盘file目录下面
}
@Test
public void test13(){
fu.print("13.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("13.ftl", root, "13.html");//写到D盘file目录下面
}
@Test
public void test14(){
Map<String, List<Article>> arts = null;
arts = new HashMap<String, List<Article>>();
List<Article> list1 = null;
list1 = new ArrayList<Article>();
list1.add(new Article("中",new Channel(1,"多对多1")));
list1.add(new Article("中华",new Channel(1,"多对多2")));
list1.add(new Article("中华共",new Channel(1,"多对多3")));
list1.add(new Article("中华共和",new Channel(1,"多对多4")));
list1.add(new Article("中华共和国",new Channel(1,"多对多5")));
list1.add(new Article("中华共和国万",new Channel(1,"多对多6")));
list1.add(new Article("中华共和国万岁",new Channel(1,"多对多7")));
list1.add(new Article("中华共和国万岁8",new Channel(1,"多对多8")));
arts.put("1", list1);
list1 = new ArrayList<Article>();
list1.add(new Article("中",new Channel(1,"多对多1")));
list1.add(new Article("中华",new Channel(1,"多对多2")));
list1.add(new Article("中华共",new Channel(1,"多对多3")));
list1.add(new Article("中华共和",new Channel(1,"多对多5")));
list1.add(new Article("中华共和国",new Channel(1,"多对多6")));
list1.add(new Article("中华共和国万",new Channel(1,"多对多7")));
list1.add(new Article("中华共和国万岁",new Channel(1,"多对多8")));
list1.add(new Article("中华共和国万岁中",new Channel(1,"多对多8")));
list1.add(new Article("中华共和国万岁中央",new Channel(1,"多对多8")));
list1.add(new Article("中华共和国万岁中央人",new Channel(1,"多对多8")));
list1.add(new Article("中华共和国万岁中央人民",new Channel(1,"多对多8")));
list1.add(new Article("中华共和国万岁中央人民政",new Channel(1,"多对多8")));
list1.add(new Article("中华共和国万岁中央人民政府",new Channel(1,"多对多8")));
list1.add(new Article("中华共和国万岁中央人民政府8",new Channel(1,"多对多8")));
arts.put("2", list1);
root.put("arts", arts);
fu.print("14.ftl", root);//调用控制台打印输出,在控制台打印
fu.filePrint("14.ftl", root, "14.html");//写到D盘file目录下面
}
}
注意:这里我用的了junit,选中方法名右击运行即可,你们也可以使用main方法运行,如果使用junit可以直接把junit包导入项目,myeclispe自带可以直接导入,就不在这里详细介绍

文件内容 FreemarkerUtil.java

package com.freemark;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.freemark.model.User;
import freemarker.template.*;
public class FreemarkerUtil {
public Template getTemplate(String name){
try {
Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(this.getClass(),"/ftl");
Template temp = cfg.getTemplate(name);
System.out.println("获取Template完成");
return temp;
} catch (IOException e) {
e.printStackTrace();
System.out.println("获取Template失败");
}
return null;
}

public void print(String name,Map<String, Object> root){
try {
Template temp = this.getTemplate(name);
temp.process(root, new PrintWriter(System.out));
System.out.println("打印控制台");
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public void filePrint(String nameFtl,Map<String, Object> root,String fileName){
FileWriter out = null;
try {
out = new FileWriter(new File("D://file//"+fileName));//写入D盘目录下,地址可以自己定
Template temp = this.getTemplate(nameFtl);
temp.process(root, out);
System.out.println("输出流");
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}

}


文件内容 FreemarkerUtil.java

package com.freemark.model;
public class Article {
private String title;
private Channel channel;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Channel getChannel() {
return channel;
}
public void setChannel(Channel channel) {
this.channel = channel;
}
public Article() {
}
public Article(String title, Channel channel) {
super();
this.title = title;
this.channel = channel;
}
}

文件内容 Channel.java

package com.freemark.model;
public class Channel {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Channel() {
super();
// TODO Auto-generated constructor stub
}
public Channel(int id, String name) {
super();
this.id = id;
this.name = name;
}
}

文件内容 FreemarkerUtil.java

package com.freemark.model;

public class Group {
private String name;

public Group() {
super();
}

public Group(String name) {
super();
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

文件内容 Student.java

package com.freemark.model;
public class Student {
private String no;
private String name;
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String no, String name) {
super();
this.no = no;
this.name = name;
}
}

文件内容 User.java

package com.freemark.model;
public class User {
private int id;
private String name;
private int age;
private Group group;

public User() {
super();
}
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}

public User(int id, String name, int age, Group group) {
super();
this.id = id;
this.name = name;
this.age = age;
this.group = group;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}


文件内容 01.ftl



你好:${username}


文件内容 02.ftl 显示一个参数

<html>
<head>
<title>小白学习FreeMark</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>

<body>
你好:<h1>${username}</h1>
</body>
</html>


文件内容 03.ftl 显示对象,通过if判断年龄

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<h1>${user.id}  -------------  ${user.name}  --------------  ${user.age}</h1>
<#if user.age lt 12>
${user.name}还是一个小孩
<#elseif user.age lt 18>
${user.name}快成年了
<#else>
${user.name}已经成年
</#if>
</BODY>
</HTML>

使用条件判断,效果展示



文件内容 04.ftl 显示list集合

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#list users as user>
<h1>${user.id}  -------------  ${user.name}  --------------  ${user.age}</h1>
</#list>
</BODY>
</HTML>

文件内容 05.ftl include引用top页面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#include "top.ftl">
<hr/>
<#list users as user>
<h1>${user.id}  -------------  ${user.name}  --------------  ${user.age}</h1>
</#list>
</BODY>
</HTML>

文件内容 06.ftl 数据为空设置

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<h1>${user.id}  -------------  ${user.name}  --------------  ${user.group!"无值"}</h1>
<#--${user.group.name!"无值"}这样写freemark只会判断name是否为空,不会判断group 所以会报错 -->
${(user.group.name)!"无值"}<#--加上括号则会判断user、group、name是否为空,惊叹号后面可以不谢“无值”将是什么都不显示 -->

${(a.b)!"不存在的对象处理"}

<#if (a.b)??><#--在if中可以使用??判断是否为空 -->
不为空
<#else>
为空
</#if>

<#if (user.name)??>
不为空${(user.name)!}
<#else>
为空
</#if>
</BODY>
</HTML>
注意:${(user.group.name)!"无值"} 处理空值最好加上括号

文件内容 07.ftl 使用assign自定义变量、变量的转型、date类型处理

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#--自定义变量 如果声明变量名相同,会直接覆盖不会报错 -->
<#assign username="张三" >
${username!}
<#--不使用引号则是数值类型 -->
<#assign num=10 >
${num+11}
<#--使用引号则是字符串类型 -->
<#assign str="10" >
${str+11}

<#--往字符串插值这两种想过是一样的 -->
${"hello"+username}
${"hello${username}"}

<#--不能输出字符串以为类型,例如boolean型就会报错,必须转成字符串行才能输出。转换格式:XXX?string -->
<#assign boo=true >
<#--${boo} -->
${boo?string}
${(a.b)???string}
<#--还可以 -->
${(a.b)???string("真","假")}

<#--时间类型也必须要转换才能输入 -->
${now?string("yyyy-MM-dd HH:mm:ss:sss")}

<#--字符串类型转换成date类型转换日期 -->
<#assign bir="2012-08-22 12:22:33"?date("yyyy-MM-dd HH:mm")>
${bir}
<#--字符串类型转换成datetime类型转换日期和时间 -->
<#assign bir="2012-08-22 12:22:33"?datetime("yyyy-MM-dd HH:mm")>
${bir}
<#--转换html代码,这样可以直接将html代码显示到页面 -->
${"<br/>"?html}

<#--left_pad函数用法,主要是为了填充 -->
[${"abced"?left_pad(3)}]
[${"abced"?left_pad(10,"--")}]

<#--相关用法 四舍五入和取整 -->
${1.4?string(0)}
${1.5?string(0)}
${1.4?int}
${1.5?int}

</BODY>
</HTML>

文件内容 08.ftl 序列表和hash表

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#--显示序列所有序列元素 -->
<#assign nums=[1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1] >
<#list nums as num>
${num}
</#list>

<#--1..100 还可以这样表示,一下定义不能使用[],不然会报错 -->
<#assign nums=1..100 ><#--或者这样-->
<#list 1..100 as num >
${num}
</#list>
<br/>
<#assign num1=nums[0..10] >
<#list num1 as num >
${num}
</#list>

<#--使用map集合 -->
<#assign maps = {"1":"张三","2":"李四","3":"王武","4":"俅俅"}>
${maps["1"]}${maps["2"]}${maps["3"]}${maps["4"]}
<#--便利map集合 -->
<#assign keys = maps?keys>
<#list keys as key>
${key}---${maps[key]}
</#list>
<#-- ${maps."1"} 不能这样遍历map,除非第一个key不是整数类型,像下面一样-->
<#assign users = {"username":"张三","password":"123","sex":"22"}>
${users.username}
</BODY>
</HTML>


文件内容 09.ftl 自定义指令macro、nested的用法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#macro hello>
我听见你的声音,有中特别的感觉
</#macro>
<@hello /><#--直接调用 -->
<#list 1..5 as num>
<@hello />
</#list>

<#--对于hello1这个指令来说,hello1后面的都是参数,一个是num,一个是ok -->
<#macro hello1 num ok>
<#list 1..num as n>
<h1>Hello${ok}${n}</h1>
</#list>
</#macro>
<@hello1 num=3 ok="World"/><#--这里必须传入参数,不然会报错 -->
<#macro hello2 num=3 ok="World">
<#list 1..num as n>
<h1>Hello${ok}${n}</h1>
</#list>
</#macro>
<@hello2/><#--如果在声明的时候初始化值,调用就可以不用赋值,当然也可以赋值 -->

<#macro test>
<#--nested会输出指令中的内容-->
<#nested>
<#nested>
</#macro>
<@test>
<h1>你好吗!</h1>
</@test>
<#macro test1>
<#--nested可以带参输出,注意指令后面是分号,参数用逗号隔开-->
<#nested 11 22/>
<#nested 33 44/>
</#macro>
<@test1;x,y>
<h1>你好吗!--------${x}-----------${y}</h1>
</@test1>

</BODY>
</HTML>

文件内容 10.ftl 自定义指令macro、nested的用法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
${username}    <br/>
<#--数据模版中的变量-->
<#assign username="李四">
<#--此时模版中的变量和模型中的变量一致不是覆盖,而是隐藏,优先在模版变量中找,如果没有再到模型中变量找 -->
${username}    <br/>
<#--如果要访问模型中与模版中名称一致的变量使用.globals-->
${.globals.username} <br/>

<#--如果你在调用之间显示,则还是李四,当调用之后则覆盖成都是王武 -->
<#macro test>
<#assign username = "王武">
${username}    <br/>
</#macro>
${username}    <br/>
<@test/>
${username}    <br/>

<#--充上面例子可以看出,这样中存在风险,不建议这样做,一般使用local -->
<#assign username1 = "王武1">
<#macro test>
<#local username1 = "王武"><#--使用local可以声明局部变量,所以在macro建议使用local声明变量-->
${username1}    <br/>
</#macro>
<@test/>
${username1}    <br/>
<#--循环变量username出循环就会回复以前的值 -->
<#list 1..3 as username>
${username}    <br/>
</#list>
${username}    <br/>
</BODY>
</HTML>

文件内容 11.ftl 自定义指令macro、nested的用法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#--include导入的模版可以覆盖主模版的变量 -->
${username} <br/>
<#include "inc/inc1.ftl">
${username} <br/>
<#include "inc/inc2.ftl">
${username} <br/>

<#--import则不会覆盖,如果要访问可以通过别人点出变量名 -->
<#import "inc/inc3.ftl" as inc1/>
<#import "inc/inc3.ftl" as inc2/>
${inc1.password} <br/>
${password} <br/>

<#assign age=22 in inc2/><#--其中inc2一定要使用import声明过,不声明会报错 -->
<#--${age}会报错,必须通过名称空间访问-->
${inc2.age}<br/>

<#--如果访问inc3.ftl中的macro需要使用@符号 -->
<@inc1.test/>
</BODY>
</HTML>

文件内容 12.ftl 自定义指令macro、nested的用法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#import "/inc/select.ftl" as my/>
省份:<@my.select id="address" value="上海" datas=["请选择","广东","江苏","山东","四川","台湾","浙江","辽宁","河南","湖北","福建","河北","湖南","上海","香港","北京","黑龙江","天津","重庆","江西","山西","安徽","陕西","海南","云南","甘肃","内蒙古","贵州","新疆","西藏","青海","广西","澳门","宁夏","吉林"]/>
性别:<@my.select id="sex" datas=["请选择性别","男","女"] value="男"/>
<@my.select id="username" datas=users key="id" text="name" headkey="-1" headtext="请选择用户"/>
<@my.select id="stu" datas=stus key="no" text="name" headkey="-1" headtext="请选择学生"/>
<@my.select id="sex" datas={"0":"男","1":"女"} value="1"/>
</BODY>
</HTML>

文件内容 13.ftl 自定义指令macro、nested的用法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#import "/inc/pager.ftl" as my/>
<@my.pager url="#" totalPage=20 curPage=16 class="pagers" showPageNum=7/>
<br/>
<@my.pager url="#" totalPage=20 curPage=18 class="pagers" showPageNum=7/>
</BODY>
</HTML>

文件内容 14.ftl 自定义指令macro、nested的用法

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<#macro showArt cid titleNum>
<#nested>
<#local articles=arts[cid]>
<#list articles as art>
<li>
<span>
<a href="#">
<#if (art.title?length>=titleNum)>
${art.title[0..titleNum-1]}...
<#else>
${art.title}
</#if>
</a>
</span>
</li>
</#list>
</#macro>

<@showArt cid="1" titleNum=7>
<h1>模版1</h1>
</@showArt>
<@showArt cid="2" titleNum=10>
<h1>模版2</h1>
</@showArt>
</BODY>
</HTML>

文件内容 inc/inc1.ftl 模版中调用到的文件

<#assign username="张三" >

文件内容 inc/inc2.ftl 模版中调用到的文件

<#assign username="李四" >

文件内容 inc/inc3.ftl 模版中调用到的文件

<#assign password="password" >
<#macro test>
Hello World!
</#macro>

文件内容 inc/pager.ftl 模版中调用到的文件

<#macro pager url totalPage curPage=1 class="" showPageNum=7>
<#local halfPage=(showPageNum/2)?int/>
totalPage=${totalPage}
curPage=${curPage}
showPageNum=${showPageNum}<br/>
<#if (halfPage>=curPage)>
<@showPage start=1 end=curPage url=url class=class curPage=curPage/>
<@showPage start=curPage+1 end=showPageNum curPage=curPage url=url class=class/>
<#else>
<@showPage start=curPage-halfPage end=curPage url=url class=class curPage=curPage/>
<#if (curPage+halfPage>totalPage)>
<#local endPage=totalPage/>
<#else>
<#local endPage=curPage+halfPage/>
</#if>
<@showPage start=curPage+1 end=endPage url=url class=class curPage=curPage/>
</#if>
</#macro>

<#macro showPage start end curPage url class>
<#list start..end as page>
<#if curPage==page>
[${page}]
<#else>
<a href="${url}" class="${class}">${page}</a>
</#if>
</#list>
</#macro>

文件内容 inc/select.ftl 模版中调用到的文件

<#macro select id datas value="" key="" text="" headkey="" headtext="">
<select id="${id}" name="${id}">
<#if headkey!="">
<option value="${headkey}">${headtext}</option>
</#if>
<#if datas?is_hash_ex>
<#local keys=datas?keys/>
<#list keys as key>
<#if key==value>
<option value="${key}" selected>${datas[key]}</option>
<#else>
<option value="${key}">${datas[key]}</option>
</#if>
</#list>
<#else>
<#list datas as data>
<#if key!="">
<#if value==data[key]?string>
<option value="${data[key]}" selected>${data[text]}</option>
<#else>
<option value="${data[key]}">${data[text]}</option>
</#if>
<#else>
<#if value==data>
<option value="${data}" selected>${data}</option>
<#else>
<option value="${data}">${data}</option>
</#if>
</#if>
</#list>
</#if>
</select>
<br/>
</#macro>

文件内容 inc/top.ftl 模版中调用到的文件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>小白学习FreeMark</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
<h1>欢迎${username}登陆到系统!</h1>
</BODY>
</HTML>


…………………………………………………………

未完结,还在更新中。。。

…………………………………………………………
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: