小白学习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
文件内容 FreemarkerUtil.java
文件内容 FreemarkerUtil.java
文件内容 Channel.java
文件内容 FreemarkerUtil.java
文件内容 Student.java
文件内容 User.java
文件内容 01.ftl
文件内容 02.ftl 显示一个参数
文件内容 03.ftl 显示对象,通过if判断年龄
使用条件判断,效果展示
文件内容 04.ftl 显示list集合
文件内容 05.ftl include引用top页面
文件内容 06.ftl 数据为空设置
文件内容 07.ftl 使用assign自定义变量、变量的转型、date类型处理
文件内容 08.ftl 序列表和hash表
文件内容 09.ftl 自定义指令macro、nested的用法
文件内容 10.ftl 自定义指令macro、nested的用法
文件内容 11.ftl 自定义指令macro、nested的用法
文件内容 12.ftl 自定义指令macro、nested的用法
文件内容 13.ftl 自定义指令macro、nested的用法
文件内容 14.ftl 自定义指令macro、nested的用法
文件内容 inc/inc1.ftl 模版中调用到的文件
文件内容 inc/inc2.ftl 模版中调用到的文件
文件内容 inc/inc3.ftl 模版中调用到的文件
文件内容 inc/pager.ftl 模版中调用到的文件
文件内容 inc/select.ftl 模版中调用到的文件
文件内容 inc/top.ftl 模版中调用到的文件
…………………………………………………………
未完结,还在更新中。。。
…………………………………………………………
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>
…………………………………………………………
未完结,还在更新中。。。
…………………………………………………………
相关文章推荐
- 小白学习freemark的过程(代码全贴+详细介绍)
- 深度学习之卷积神经网络CNN及tensorflow代码实现示例详细介绍
- Spark学习 基础函数功能详细说明 附代码和执行过程 上机学习详细说明
- 深度学习之卷积神经网络CNN及tensorflow代码实现示例详细介绍(转载)
- [原创]java WEB学习笔记100:Spring学习---Spring Bean配置:SpEL详细介绍及代码演示
- 我的java/Springl框架入门学习过程(1):Spring的基本介绍
- Linux SLUB分配器之一(过程和整体代码介绍)
- Linux shell脚本基础学习详细介绍(完整版)
- 机器学习实战+统计学习方法之理解KNN(1.实战代码的详细走读和解析)
- Ruby学习过程中积累下来的测试代码(进阶)
- 代码的编译+链接过程的介绍
- tensorflow学习过程代码
- (转)Java 代码优化过程的实例介绍
- 详细介绍Linux shell脚本基础学习(一)
- HTTP错误代码详细介绍
- 关于PHP-Zend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。
- PHP代码审核的详细介绍
- Android应用程序的Activity启动过程简要介绍和学习计划 .
- HTTP错误代码详细介绍
- shiro 小白学习过程(1)