`
renjie120
  • 浏览: 237910 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D11bba82-ec4a-3d31-a3c0-c51130c62f1c
Java应用集锦
浏览量:22941
社区版块
存档分类
最新评论

freemarker的recurse示例代码

 
阅读更多

转载必须注明文章来源:renjie120.iteye.com

 

关于freemarker的recurse的用途,在百度和中文指南中,有很多的说明,都是千篇一律。

找了半天却没有找到关于如何具体对一个xml进行遍历解析的例子。

 

这里给出一个示例的例子:

xml文件:

 

<book>
	<title>spring &amp; struts2 &amp; hibernate</title>
	<chapter author="周润发" address="上海">
		<title>第一章</title>
		<para>1.1节</para>
		<para>1.2节</para>
	</chapter>
	<chapter author="刘德华" time="2013-1-1">
		<title>第二章</title>
		<para>2.1节</para>
		<para>2.2节</para>
		<para>2.3节</para>
	</chapter>
</book>

 

 

ftl文件:

 

<#compress>
<#recurse doc>  
<#macro book>	
    欢迎使用本书籍---------------<#recurse>
 </#macro> 
 <#macro title>	 
	标题 《<#recurse>》
 </#macro>
<#macro chapter>  
<#-- <#if .node.@address??> 地点:${.node.@address}</#if> -->
	----作者:${.node.@author}   <#if  .node.@time[0]?? >创作时间:${.node.@time}</#if>   <#if  .node.@address[0]?? >创作地点:${.node.@address}</#if>  <#recurse>
 </#macro> 
 
<#macro para>	
	细节: <#recurse>
</#macro>
 
 </#compress>

 

 

java代码:

 

public class XmlMarkerTest {
	public static void main(String[] agrgs) {
		Writer out = new OutputStreamWriter(System.out);
		new Generate("book.ftl", out) {
			public Object setData() {
				Map m = new HashMap();
				try {
					m.put("doc", freemarker.ext.dom.NodeModel.parse(new File(
							"D:\\My Documents\\GitHub\\dwz_money\\template\\data.xml")));
				} catch (Exception e) { 
					e.printStackTrace();
				}
				return m;
			}
		}.make();
		System.out.println("\n\n生成完毕");
	}
}

 

package common.codegenerate;

import java.io.File;
import java.io.IOException;
import java.io.Writer;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public abstract class Generate {
	String ftlname;
	Writer out;

	public Generate(String ftlname, Writer out) {
		this.ftlname = ftlname;
		this.out = out;
	}

	abstract Object setData();

	public void make() {
		try {
			Configuration cfg = new Configuration();
			File f = new File("template");
			cfg.setDirectoryForTemplateLoading(f);
			cfg.setObjectWrapper(new DefaultObjectWrapper());
			
			Template temp = cfg.getTemplate(ftlname);
			Object data = setData(); 
			temp.process(data, out);
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}
	}
}

 输出结果:

 

 

  欢迎使用本书籍---------------
标题 《spring & struts2 & hibernate》
标题 《第一章》
细节: 1.1节
细节: 1.2节
----作者:周润发 创作地点:上海
标题 《第一章》
细节: 1.1节
细节: 1.2节
----作者:刘德华 创作时间:2013-1-1
标题 《第二章》
细节: 2.1节
细节: 2.2节
细节: 2.3节

 

说明:对于recurse指令,会从根对象“doc”(因为java代码中设置的根对象时doc)开始进行网下逐层级的解析xml,首先第一层是“book”,第二层是“title”,“chapter”,第三层是“para”,“title”.

 

访问了一层的话,要访问后面的层次的话,必须再继续嵌套使用<#recurse>。

 

访问xml节点的属性,使用.@属性名。判断属性是否存在,使用方式见ftl中。

 

转载必须注明文章来源:renjie120.iteye.com

分享到:
评论

相关推荐

    freemarker概述

    在这个示例中,`${user}`、`${latestProduct.url}`和`${latestProduct.name}`都是FreeMarker的指令,它们将在最终输出时被对应的数据模型中的实际值替换。这样的设计允许设计师专注于页面布局和样式,而程序员则关注...

    freemarker中文手册.pdf

    - **定位与功能**:FreeMarker是一款基于模板的通用工具,旨在帮助开发者利用模板生成各类文本输出,包括但不限于HTML网页、XML文档、RTF文件及Java源代码等。 - **适用场景**:虽然最初设计用于生成HTML网页,尤其...

    freeMarker资料

    - **跨领域适用性**:虽然FreeMarker最初是为了生成HTML页面而设计的,但它同样可以用于生成其他类型的文本输出,如XML、RTF、Java源代码等。 ##### 特点 - **独立性**:FreeMarker与容器无关,即它不知道HTTP或...

    freemarker 中午手册

    以下是一个简单的示例,展示了如何使用 Freemarker 来生成包含动态数据的 HTML 页面: ```html &lt;title&gt;Welcome! &lt;h1&gt;Welcome ${user}! &lt;p&gt;Our latest product: ${latestProduct.url}"&gt;${latestProduct.name...

    freemarker中文手册文档.pdf

    #### 四、FreeMarker设计指南与示例 1. **快速入门**:在FreeMarker中,模板与数据模型相结合生成最终输出。设计者负责创建模板,而程序员负责生成数据模型。 - **模板示例**: ```html &lt;title&gt;Welcome! ...

    freemarker-2.3.19教程

    - **示例模板**: 下面是一个简单的 HTML 示例,其中包含了 FreeMarker 指令,用于展示用户信息和最新产品的链接。 ```html &lt;title&gt;Welcome! &lt;h1&gt;Welcome ${user}! &lt;p&gt;Our latest product: ${...

    FreeMarker中文API

    - 支持递归遍历XML树的`&lt;#recurse&gt;`和`&lt;#visit&gt;`指令。 - 提供直观的方式在模板中访问XML对象模型。 #### 三、FreeMarker设计指南 1. **快速入门** - **模板+数据模型=输出**: 在Web开发中,设计师负责创建...

    freemarker使用文档

    2.1 通过例子来学习:通过具体示例,学习如何在FreeMarker模板中处理XML。 2.2 形式化描述:对如何处理XML给出了形式化的定义。 三、声明的XML处理 3.1 基础内容:讲述了如何在FreeMarker中进行声明式的XML处理。 ...

    FreeMarker

    为了更好地理解FreeMarker的实际应用,这里给出一个简单的示例: 1. **项目搭建**:创建一个名为`testFreeMarker`的Java项目。 2. **引入依赖**:向项目中添加FreeMarker的jar包。 3. **创建模板**:在项目的`...

    FreeMarker中文参考手册

    - **1.5 将代码放在一起**:提供了完整的示例代码,演示如何将上述步骤整合到一个程序中。 ##### 第二章 数据模型 - **2.1 基本内容**:概述了数据模型的基础知识。 - **2.2 标量**:解释了标量类型的概念及其用途...

    freemarker教程

    在这个示例中,`${user}`和`${latestProduct.url}`以及`${latestProduct.name}`都是FreeMarker的指令,它们将在模板执行时被实际的数据值替换。这种方式使得设计人员可以专注于布局和外观设计,而开发人员则负责数据...

    freemarker

    - **高性能**:Freemarker是一个编译型模板引擎,生成的Java代码执行效率高。 6. **应用场景** - Web应用的视图层,如Spring MVC中的Thymeleaf。 - 电子邮件模板生成。 - 文档自动化,如报告生成。 总结起来,...

    freemarker帮助文档001

    此外,FreeMarker 还支持 XML 输出,允许用户通过 `&lt;#recurse&gt;` 和 `&lt;#visit&gt;` 指令来处理 XML 结构数据。 ### 四、FreeMarker的高级特性 1. **国际化支持:**FreeMarker 支持国际化,可以方便地切换不同语言版本...

    freemarker入门

    在这个示例中,`${user}`、`${latestProduct.url}` 和 `${latestProduct.name}` 是 Freemarker 的占位符,它们将在运行时被数据模型中的实际值所替换。 #### 三、数据模型详解 数据模型是 Freemarker 中非常重要的...

    Freemarker教程 中文版

    - **定位与功能**:FreeMarker是一款基于模板的文本生成工具,主要用于生成各类文本输出,如HTML、XML、RTF、Java源代码等。它由纯Java编写,因此可以轻松地集成到Java环境中。 - **适用场景**:尽管其设计初衷是...

    freemarker中文手册

    - 提供`&lt;#recurse&gt;`和`&lt;#visit&gt;`指令,用于递归遍历XML树。 - 提供直观的模板语言访问XML对象模型。 快速入门示例: FreeMarker的基本用法是将模板与数据模型结合生成输出。例如,HTML模板中包含变量`${user}`和`...

    freemarker中文手册文档.doc

    FreeMarker的快速入门示例展示了其基本工作原理:模板(如HTML)中包含特殊指令,当与数据模型结合后,FreeMarker会替换这些指令,生成最终的输出。例如,模板中 `${user}` 和 `${latestProduct.url}` 等占位符会被...

Global site tag (gtag.js) - Google Analytics