小白学习freemark的过程(代码全贴+详细介绍)
来源:互联网 发布:java体系结构 编辑:程序博客网 时间:2024/06/15 15:18
介绍
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>
使用条件判断,效果展示
![](http://my.csdn.net/uploads/201208/22/1345614463_8947.jpg)
文件内容 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的过程(代码全贴+详细介绍)
- 小白学习freemark的过程(代码全贴+详细介绍)
- Freemark的介绍
- freemark学习(二):freemark的数据类型(1)
- struts2+freemark 学习代码之一
- freemark学习
- freemark学习
- freemark 学习
- Freemark学习
- 最全的ajax详细介绍,ajax全
- freeMark全解
- freeMark全解
- git学习,详细的过程
- 介绍ARM的启动过程详细说明
- 《MapReduce:详细介绍Shuffle的执行过程》
- 关于Zxing的详细使用过程介绍
- MapReduce:详细介绍Shuffle的执行过程
- MapReduce:详细介绍Shuffle的执行过程
- java 文件下载且解决中文乱码
- 对python的比较评价
- 5种流行的Linux发行版:你更喜欢哪一个呢?
- 计算机编码相关
- 字符串类改进版(加入了运算符重载)
- 小白学习freemark的过程(代码全贴+详细介绍)
- oracle数据类型
- hostname
- 微软提供的一些实用小工具集
- zf异常处理机制
- linux 内核与用户空间通信之netlink使用方法
- 游戏共享模式的参考
- 鸡尾酒排序Linux下c 实现
- Javascript框架之DataTables