FreeMarker2.3 笔记

FreeMarker2.3

  FreeMarker笔记 收藏
FreeMarker2.3

 

一    介绍... 2

二            HelloWorld. 3

1       java应用程序中... 3

1.1         aa.ftl---------模板文件... 3

1.2         FreeMarkerTest调用模板及使用方法... 3

1.3         FreeMarkerTest.java----------调用freeMarker的测试程序... 4

2       web应用程序... 7

1.1         web与java应用程序的区别在于: 7

1.2         完整代码... 7

3       读XML数据源----- java应用程序中... 9

三    语法... 10

1       常用... 10

1.1         ${ varName!" value"}---------指定缺省值... 10

1.2         <#-- aaaaaaaa --> 注释... 10

1.3         条件语句 <#if condition><#elseif condition><#else></#if>. 10

1.4         变量定义 <#assign varName=value>. 11

1.5         <#local var = value> 在 macro 或者 function 中定义局部变量并初始化... 11

1.6         <#global var = value > 定义全局变量并初始化... 11

1.7         序列 [item1,item2,item3,…] 11

1.8         list-----遍历指令... 11

1.9         条件分支 <#switch 条件> <#case "值n" > <#default></#switch>. 12

1.10       key:value, key2:value2 ...} 直接定义一个hash表... 12

1.11       macro-----宏... 12

1.12       <#nested>-----FreeMarker个性十足的指令... 13

1.13       function-------函数... 14

1.14       内部函数调用---------由问号、函数名与实参构成... 14

四    常用函数... 15

1       字符串... 15

1.1         取子串--substirng. 15

1.2         第一个字母大写-------cap_first 15

1.3         第一个字母不大写-----uncap_first 15

1.4         以空格间格的字符串,第一个字母大写--------capitalize. 15

1.5         日期、时间函数---------date, time, datetime. 15

1.6         html-----把字符串转成html传输的格式... 16

1.7         index_of--------求字串在原串中的位置... 16

1.8         j_string--------把空格替换成左斜线... 16

1.9         js_string--------把左斜线换成 空格... 16

1.10       其他字符串函数... 16

2       数字... 16

1.1         带常见单位的数字... 16

1.2         格式化数字... 16

1.3         其他函数round, floor, ceiling. 17

3       日期... 17

 

 

一     介绍
FreeMarker是一个文本文件模板。

文本文件中,设定特定字符串,FreeMarker会把用户指定的数据,按规定替代这些字符串,从而产生新的文件,或流数据。

例:有文本文件-------a.ftl 如下:

你好!${userName}

  用户把“张三”数据放入FreeMarker中,FreeMarker将会产生新的文件,其内容会变成:

你好!张三!

 

作用:

  非常 精致强悍,可生成网页、生成java文件、.net文件,总之任何格式的文本文件。

  当然,模板文件要按这些格式书写!

 

说明:

(1)   FreeMarker的数据源:
  --------来自xml文件,或

-------- 用Map作为基本的存储单元;且必须是树结构。

                                                 

(2)   官方网址
    FreeMarker是开源的;官方网址
http://freemarker.org/

 

二    HelloWorld
 

 

1      java应用程序中
1.1  aa.ftl---------模板文件
<html>

    <head>

        <title>Welcome!</title>       

        <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">

    </head>

    <body>

        <h1>Welcome ${user}!</h1>

    </body>

</html>

 

说明:

${user}-----是freemarker指令。意思用 user所存数据对它进行替换。

 user所存数据-----放在数据源中。

Freemarker----是模板,程序,数据相分离。

 

1.2  FreeMarkerTest调用模板及使用方法
下面是加载模板文件

 

Configuration cfg = new Configuration(); 

cfg.setEncoding(Locale.getDefault(),"UTF-8");

 

// 指定模板文件的数据源,这里是一个文件目录。   

cfg.setDirectoryForTemplateLoading(  new File("d:\\aaa")   );  

cfg.setObjectWrapper(new DefaultObjectWrapper()); //这条语句可省略

 

//加载文件,模板文件,输出文件都要保证用UTF-8-----解决乱码

Template template = cfg.getTemplate("aa.ftl");//加载模板文件

 

 

下面是使用方法

 

template.setEncoding("UTF-8");

 

File htmlFile = new File("t.html");

Writer out = new BufferedWriter(new OutputStreamWriter(

   new FileOutputStream(htmlFile), "UTF-8"));//输出文件

 

HashMap propMap = new HashMap();//定义Map树结构数据源

propMap.put("user", "张三");

 

template.process(propMap, out);

 

 

注意:加载文件,模板文件,输出文件都要保证用UTF-8-----解决乱码

 

Configuration. setEncoding//要在Configuration对象后就要加入

template.setEncoding("UTF-8")

OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8")

 

 

1.3   FreeMarkerTest.java----------调用freeMarker的测试程序
package jap1;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.HashMap;

import java.util.Locale;

 

import freemarker.template.Configuration;

import freemarker.template.Template;

public class FreeMarkerTest {

    public static void main(String[] args) throws IOException {

         FreeMarkerTest test = new FreeMarkerTest();

         test.getFile();

         test.getFile(Locale.CHINA);

    }

    private String basePath;

 

    public String getBasePath() {

        return basePath;

    }

 

    public void setBasePath(String basePath) {

        this.basePath = basePath;

    }

 

    public FreeMarkerTest(){

          basePath="";

 

    }

     public FreeMarkerTest(String basePath ){

         this.basePath=basePath;

    }

    public void getFile() throws IOException {

        Configuration cfg = new Configuration();//加载FreeMarker配置文件

        if (basePath.equals("")){

             //设本类运行时所在的路径为路劲

             cfg.setClassForTemplateLoading(this.getClass(),"/");

        } else{

             //设用户指定路径为基路径

             cfg.setDirectoryForTemplateLoading(new File(basePath));

        }

        cfg.setEncoding(Locale.getDefault(),"UTF-8");

        Template template;

        try {

            template = cfg.getTemplate("aa.ftl");

            template.setEncoding("UTF-8");

            File htmlFile = new File("t.html");

            Writer out = new BufferedWriter(new OutputStreamWriter(

                   new FileOutputStream(htmlFile), "UTF-8"));

            HashMap propMap = new HashMap();

            propMap.put("user", "张三");

            template.process(propMap, out);

            out.flush();

            out.close();

        } catch (Exception e) {

         e.printStackTrace();

        }

    }

 

    //FreeMarker国际化支持,

    public void getFile(Locale loc) {

        Configuration cfg = new Configuration();

        cfg.setClassForTemplateLoading(this.getClass(),"/");

        cfg.setEncoding(Locale.getDefault(),"UTF-8");

        Template template;

        try {

            template = cfg.getTemplate("aa.ftl",loc);

            template.setEncoding("UTF-8");

            String fileName="t_"+loc.getLanguage()+"_"

+loc.getCountry()+".html";

            File htmlFile = new File(fileName);

            Writer out = new BufferedWriter(new OutputStreamWriter(

                    new FileOutputStream(htmlFile), "UTF-8"));

            HashMap propMap = new HashMap();

            propMap.put("user", "张三");

            template.process(propMap, out);

             out.flush();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

}

 

2      web应用程序
1.1   web与java应用程序的区别在于:
(1)    配置类的路径指定:
有两种方式: (在web程序中)

  A 模板文件在web中。针对servlet.。

下例的表示模板文件位于WEB-INF的子文件a中。

configuration.setServletContextForTemplateLoading(

                getServletContext(), "WEB-INF/a");

 

  B 模板文件在class中。

    下像表示模板文件在src\java下。注:在netbeans6.5中调试。

configuration.setObjectWrapper(new DefaultObjectWrapper());

        configuration.setTemplateLoader(new ClassTemplateLoader(

                  NewServlet1.class, "/"));

 

(2)    文件输出
web文件用response对象输出文件。或用像StringWriter之类的对象输出 。

 

1.2  完整代码
(1)   模板文件---------test.ftl-----------位于web /web-inf/a
<body>

    sdad描述信息是 : ${message}

</body>

 

(2)   NewServlet1.java---------调用FreeMarker把模板输出到浏览器中。
import java.io.IOException;

import java.io.StringWriter;

import java.io.Writer;

import java.util.HashMap;

import java.util.Map;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;

import java.util.Locale;

import javax.servlet.http.HttpServlet;

 

public class NewServlet1 extends HttpServlet {

    private Configuration configuration;

    public NewServlet1() {

        super();

    }

 

    @Override

    public void destroy() {

        configuration = null;

    }

 

    @Override

    public void init() throws ServletException {

        configuration = new Configuration();

        configuration.setEncoding(Locale.getDefault(),"UTF-8");

        configuration.setServletContextForTemplateLoading(

                getServletContext(), "WEB-INF/a");

     

//        configuration.setObjectWrapper(new DefaultObjectWrapper());

//        configuration.setTemplateLoader(new ClassTemplateLoader(

//                  NewServlet1.class, "/"));

    }

 

 

    @Override

    protected void doGet(HttpServletRequest request,

          HttpServletResponse response)

                 throws ServletException, IOException {

       

        this.doPost(request, response);

    }

 

    @Override

    protected void doPost(HttpServletRequest request,

            HttpServletResponse response)

                throws ServletException, IOException {

       

        response.setContentType("text/html;charset=UTF-8");

        Map root = new HashMap();

        root.put("message", "Hello World!帅哥,靓女!");

        Template t = configuration.getTemplate("test.ftl");

 

        Writer out = response.getWriter();

        try {

            t.process(root, out);

            StringWriter stringWriter = new StringWriter();

            t.process(root, stringWriter);

            System.out.println(stringWriter.toString());

        } catch (TemplateException e) {

            throw new ServletException(

                    "Error while processing FreeMarker template", e);

        }

    }

 

}

 

注意:

1  configuration.setEncoding(Locale.getDefault(),"UTF-8");

要紧随configuration生成设置;否则,模板中的中文会成乱码。

 

2 response.setContentType("text/html;charset=UTF-8");

这句不设置;输进模板中的数据,将有可能是乱码。

 

 

3      读XML数据源----- java应用程序中
FreeMark2.3支持 XML;在程序中可直接把xml文件作为数据模型,按用户模板文件的要求,输出相应的文件(或流)给用户。

与前面相比,关键有:

  1 freemarker.ext.dom.NodeModel.parse这个方法将把xml文件处理成map树状结构的模型;该方法支持以File对象,读xml;也提供了一个流适配器,从面能用InsputStream流对象读xml文件。

  2 Map root = new HashMap();

    root.put("doc", freemarker.ext.dom.NodeModel.parse( ins));

    这里要注意:经处理后:”doc”,在数据模型中是根;而xml文件的根是它的子节点;

    在读数据时,要从doc开始,否则出错。当然,”doc”也可改成其他名字。

  3 增加了一个recurse指令。

    FreeMarker这样处理的xml结构的数据模型的:

    (1)  按层定义宏;宏名---就是节点名。(这是强行约定的)

    (2)  recurse----将循环调用处理子节点的宏

 

 

下面是在java应用程序中,应用freemarker的示例:

(1)   ddd.xml
注意:ddd.xml位于classpath下的jap1文件夹下,与下面的 FMtest.java的位置相同。在netbean开发环境中,位于 src\java\jsp1下。

<?xml version="1.0" encoding="UTF-8"?>

<root>

     <user>

         <name>张三1111</name>

     </user>

     <user>

         <name>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值