当前位置: 代码迷 >> Web前端 >> 小白学习freemark的进程(代码全贴+详细介绍)
  详细解决方案

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

热度:345   发布时间:2012-09-01 09:33:03.0
小白学习freemark的过程(代码全贴+详细介绍)

介绍

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.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.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(){
        //序列操作
        fu.print("08.ftl", root);//调用控制台打印输出,在控制台打印
        fu.filePrint("08.ftl", root, "08.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();
        }
    }
    
}


文件内容           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>












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

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

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