浏览 4105 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-29
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下。[size=medium] <?xml version="1.0" encoding="UTF-8"?> <root> <user> <name>张三1111</name> </user> <user> <name>李四hhhh</name> </user> </root> (2) FMTest.java -------应用freemarker的类 package jap1; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class FMTest { public static void main(String[] args) throws Exception { FMTest test=new FMTest(); test.getFile(); } @SuppressWarnings("empty-statement") public void getFile() throws IOException, TemplateException, SAXException, ParserConfigurationException{ //得FreeMarker配置对象 Configuration cfg = new Configuration(); cfg.setEncoding(Locale.getDefault(), "UTF-8"); cfg.setClassForTemplateLoading(this.getClass(),"/jap1"); //得FreeMarker的关键对象---------模板 Template temp = cfg.getTemplate("test.ftl"); //得FMTest类运行时/jap1/ddd.xml的输入流文件,以便FreeMarker读出来 //注意:FMTest运行时,ddd.xml在工程打包的包中。Java强烈要求只能读包内 //文件。如果要得到运行的绝对路径,再用可写的流打包,java会严重抗议! InputStream in =FMTest.class.getResourceAsStream("/jap1/ddd.xml"); //下面是FreeMarker的输入接口,这里与上面的in流建立关系, //以便读取ddd.xml文件 InputSource ins=new org.xml.sax.InputSource(in); Map root = new HashMap(); //特别注意此时的doc,这个符号将是,FreeMarker模板中取数的根!!!!! //这里读取xml文件,并处理成root对象 root.put("doc", freemarker.ext.dom.NodeModel.parse( ins)); //建立内存字符串流 java.io.StringWriter w =new StringWriter(); //模板开始按模板中的要求把用户输入的数据进行转换,并输出到字符串流中 temp.process(root, w); //字符串流输出到屏幕 System.out.println(w.toString()); } } (3) test.ftl --------模板文件 测试单个读数操作-----${doc.root.user[0].name} 列表测试: <#list doc.root.user as dd> ${dd.name} </#list> <#--recurse指令,按层读取整个xml节点,并循环调用处理这些节点的宏--> <#recurse doc><#--root是doc的子节点,这里将循环调用<#marco root>宏 --> 读doc <#macro root> 读root <#recurse><#--user是root的子节点,这里将循环调用<#marco user>宏 --> </#macro> <#macro user> 姓名:${.node.name};测试recurse指令,user </#macro> (4) 运行结果 测试单个读数操作-----张三1111 列表测试: 张三1111 李四hhhh 读root 姓名:张三1111;测试recurse指令,user 姓名:李四hhhh;测试recurse指令,user 读doc [/size] 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-07
<?xml version="1.0" encoding="UTF-8"?>
<applications> <applicate id="nettools"> <app name="软件下载"> <image>softdown.jpg</image> <url>#</url> </app> <app name="常用工具"> <image>usuallytools.jpg</image> <url>#</url> </app> <app name="补丁程序"> <image>patchcode.jpg</image> <url>#</url> </app> <app name="EOMS管理员联系方式"> <image>managerconnect.jpg</image> <url>#</url> </app> </applicate> </applications> 我这个文件用你的方法要是想得到applicate 支点上的id属性的值和app支点上的name属性的值应该如何去做?希望给指点下谢谢了! |
|
返回顶楼 | |
发表时间:2008-11-09
你的回复不会编辑啊?看得让人很累!以后这样的贴一路不回.
引用 <?xml version="1.0" encoding="UTF-8"?> <applications> <applicate id="nettools"> <app name="软件下载"> <image>softdown.jpg</image> <url>#</url> </app> <app name="常用工具"> <image>usuallytools.jpg</image> <url>#</url> </app> <app name="补丁程序"> <image>patchcode.jpg</image> <url>#</url> </app> <app name="EOMS管理员联系方式"> <image>managerconnect.jpg</image> <url>#</url> </app> </applicate> </applications> 如果你这里是这样用的 root.put("doc", freemarker.ext.dom.NodeModel.parse( ins)); 可以这样用,没调试,仅供参考 <#recurse doc> <#macro applications> <#recurse> </#macro> <#macro applicate > <#recurse> appNID:${.node.id}; </#macro> <#macro app> <#recurse> appName:${.node.name}; </#macro> |
|
返回顶楼 | |
发表时间:2008-11-09
最后修改:2008-11-09
现在调试了
ftl文件如下: <#recurse doc> <#macro applications> <#recurse> </#macro> <#macro applicate > applicateID:${.node.@id}; <#recurse> </#macro> <#macro app> appName:${.node.@name}; img:${.node.image}; </#macro> 为了方便,把xml文件再次转入于下面 <?xml version="1.0" encoding="UTF-8"?> <applications> <applicate id="nettools"> <app name="软件下载"> <image>softdown.jpg</image> <url>#</url> </app> <app name="常用工具"> <image>usuallytools.jpg</image> <url>#</url> </app> <app name="补丁程序"> <image>patchcode.jpg</image> <url>#</url> </app> <app name="EOMS管理员联系方式"> <image>managerconnect.jpg</image> <url>#</url> </app> </applicate> </applications> 结果: applicateID:nettools; appName:软件下载; img:softdown.jpg; appName:常用工具; img:usuallytools.jpg; appName:补丁程序; img:patchcode.jpg; appName:EOMS管理员联系方式; img:managerconnect.jpg; |
|
返回顶楼 | |
发表时间:2009-08-08
请问freemarker怎么使用xpath 语法怎么用? 写个简单的例子最好,谢谢啦。
|
|
返回顶楼 | |