`

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>

分享到:
评论

相关推荐

    struts2综合笔记

    - 在 `web.xml` 中添加 Struts2 核心过滤器配置,参考 `struts-2.3.15.3-all\struts-2.3.15.3\apps\struts2-blank\WEB-INF\web.xml`。 #### 四、Struts2 目录结构 - **apps**: 包含基于 Struts2 的示例应用。 - *...

    struts2 学习重点笔记

    **2.3 控制器(Controller)** - **实现技术**:Servlet、Action。 - **功能**: - 接受用户提交的请求。 - 调用模型的方法。 - 选择一个视图进行显示。 - Struts2 还提供了标签库和 OGNL 表达式语言用于视图层的...

    传智播客struts2全程学习笔记

    - `freemarker-2.3.x.jar`:Struts2的UI标签的模板使用FreeMarker编写。 - `commons-logging-1.x.x.jar`:ASF出品的日志包,Struts2框架使用这个日志包来支持Log4J和JDK1.4+的日志记录。 - `commons-fileupload-...

    Java Springboot入门自学笔记

    本入门自学笔记将带你一步步了解并掌握Spring Boot的核心概念和实践技巧。 ### 01 SpringBoot简介 #### 1.1 Spring Boot 的优势 - **简化的起步**:Spring Boot 提供了起步依赖(starter),可以通过添加相应的Maven...

    Struts2的结构和编写过程笔记

    - `freemarker-2.3.x.jar`: Struts2的所有UI标记的模板引擎。 - `commons-logging-1.0.x.jar`: 日志接口封装。 - `commons-fileupload-1.2.1.jar`: 文件上传支持。 4. **配置过滤器**:编辑`/Webroot/WEB-INF/web...

    springmvc课堂笔记

    - **实现**:根据应用需求选择不同的视图技术(如JSP、Freemarker、Thymeleaf等)。 #### 三、SpringMVC入门案例 本节通过一个简单的商品列表查询案例来详细介绍SpringMVC的基本使用。 ##### 3.1 案例需求 - **...

    spring5mvc第一天【大纲笔记】.zip

    本大纲笔记将带你逐步深入理解SpringMVC的核心概念和使用方法。 一、SpringMVC 入门 1.1 引入SpringMVC 首先,我们需要在项目中引入SpringMVC的依赖,这通常通过在Maven或Gradle的配置文件中添加相应的依赖项来完成...

    Struts2学习笔记与心得

    - Struts2支持多种类型的Result,包括JSP、FreeMarker、Velocity等模板引擎。此外,还支持JSON、XML等数据格式的返回,满足不同的应用场景需求。 #### 四、总结 综上所述,Struts2相比Struts1在架构设计、AOP支持、...

    黑马程序员_struts2框架2016版视频_struts2_day01笔记

    课程中使用的是**struts-2.3.15.3-all.zip**版本的学习资料。其中包含了一些关键的组成部分: - **apps**:提供了示例应用程序,方便快速导入所需的jar包和配置文件。 - **lib**:包含了开发Struts2所需的所有jar包...

    (完整word版)springmvc第一天课堂笔记.doc

    - 模板技术:Spring MVC不强制使用特定的视图技术,而Struts2常与JSP或FreeMarker结合。 ### 7. Spring MVC的高级应用 - **参数绑定(集合类型)**:支持List、Set等集合类型的参数绑定。 - **数据回显**:在表单...

    struts2笔记

    - **freemarker**: 视图渲染引擎。 - **velocity**: 另一个视图渲染引擎。 ##### 2.3 配置Struts2 - **3.3.1 生成struts.xml配置文件**:这是Struts2的核心配置文件,用于定义Action、拦截器等组件。例如,在项目的...

    struts2入门学习源码

    `struts-2.3.15.3`很可能是Struts2的特定版本库,包含所有必要的JAR文件和文档,可供开发者进行开发和调试。最后,`struts2`目录可能包含了一些示例代码或项目,供学习者实践和理解Struts2的实际应用。 通过深入...

Global site tag (gtag.js) - Google Analytics