`
yunhaifeiwu
  • 浏览: 162354 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

<<FreeMarker---------用xml作数据源>>例

阅读更多
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]
分享到:
评论
4 楼 sdnasky 2009-08-08  
请问freemarker怎么使用xpath 语法怎么用? 写个简单的例子最好,谢谢啦。
3 楼 yunhaifeiwu 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;
 
     



2 楼 yunhaifeiwu 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> 
 
1 楼 xupengfei666 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属性的值应该如何去做?希望给指点下谢谢了!

相关推荐

    SSM三大框架的整合(技术学习).docx

    -- 数据源配置 --&gt; &lt;bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"&gt; &lt;property name="driverClassName" value="com.mysql.jdbc.Driver"/&gt; &lt;property name="url" value="jdbc:mysql://...

    SpringMVC课堂笔记

    &lt;param-value&gt;/WEB-INF/springmvc-servlet.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;springmvc&lt;/servlet-name&gt; &lt;url-pattern&gt;/&lt;/...

    开发框架搭建

    为了确保应用程序能够正确地连接到数据库,需要在`applicationContext.xml`中配置数据源: ```xml &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt; &lt;property name=...

    高级Java人才培训专家-02-Freemarker.pptx

    &lt;artifactId&gt;spring-boot-starter-freemarker&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; &lt;/dependency&gt; ...

    Freemarker 应用文档

    - **XML 遍历指令**:2.3 版本新增了 `&lt;#recurse&gt;` 和 `&lt;#visit&gt;` 指令,用于递归遍历 XML 树。 - **直观的 XML 访问**:提供直观的方式在模板中访问 XML 对象模型。 #### 三、Freemarker 与 Struts 结合的应用 ...

    Xml做数据源模板显示新闻的源码.rar

    总结来说,这个源码示例主要展示了如何使用XML作为数据源,结合Java的XML解析技术和FreeMarker模板引擎,实现一个新闻显示系统。这涵盖了XML解析、数据模型构建、模板引擎使用等多个关键知识点,对于理解和开发类似...

    spring boot + mybatis xml + jsp

    这个配置文件可以定义数据源、事务管理器等信息。例如: ```xml &lt;?xml version="1.0" encoding="UTF-8" ?&gt; &lt;!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ...

    SpringSpringMVCMyBatis整合.docx

    在`applicationContext.xml`中配置数据源(DataSource),例如使用Druid作为数据源。 3. **配置SqlSessionFactory**: - 创建`SqlSessionFactoryBean`实例。 - 设置数据源、Mapper XML文件的位置等属性。 - ...

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    - **spring-mybatis.xml**:Spring和MyBatis的相关配置,包括数据源、事务管理器等。 - **spring-mvc.xml**:SpringMVC的相关配置,包括视图解析器、拦截器等。 - **jdbc.properties**:数据库连接相关的配置信息。 ...

    基于ssm框架,idea实现增删改查

    同时,还需创建MyBatis的`mybatis-config.xml`配置文件,以及`sqlMapConfig.xml`,用来配置数据源和Mapper扫描路径。 接着,设计数据库模型。创建一个实体类,比如`Paper`,它将映射到数据库中的表。同时,编写对应...

    FreeMarker中文文档.pdf下载

    FreeMarker是一个开放源代码的模板引擎,它能够将数据模型与表现层分离,使开发人员能够更加专注于业务逻辑的实现,而让前端工程师或设计师专注于界面的设计。这种模式有助于提高开发效率,并且使得维护变得更加容易...

    FreeMarKer+jsp使用(Struts2+Servlet).

    FreeMarker 是一个强大的模板引擎,主要用于将数据模型与模板结合,生成各种文本输出,包括但不限于HTML、XML、RTF和Java源代码等。它的核心理念是分离表现层(视图)和业务逻辑层(模型),使得开发者能够专注于...

    freemarker实现一行两列算法

    2. **遍历列表**:使用Freemarker的`&lt;#list&gt;`标签遍历数据列表。 3. **插入行**:根据当前元素的位置(索引),决定是否需要添加新的`&lt;tr&gt;`标签。 4. **插入单元格**:为每个列表元素添加`&lt;td&gt;`标签。 5. **处理最后...

    freemarker命令简介

    Freemarker 是一个用 Java 编写的模板引擎,它基于模板来生成文本输出。这些模板可以是任何格式的纯文本文件,例如:HTML、XML、Java 源代码等。Freemarker 通过指令、内置方法等提供了一套强大的功能集合,使得...

    Developing a Spring Framework MVC application step-by-step

    &lt;param-value&gt;/WEB-INF/spring/appServlet/servlet-context.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;...

    intellij maven springmvc demo

    在实际开发中,你可能还需要配置数据源、AOP、拦截器等,以及引入其他第三方库,如MyBatis、Hibernate等,以实现更复杂的功能。在不断地实践中,你将对SpringMVC有更深入的理解,并能构建出功能丰富的Web应用。

    02掌握使用STS或者IDEA创建SpringBoot项目.md

    `pom.xml`是Maven项目的配置文件,它管理项目的依赖关系和其他构建元数据。以下是pom.xml文件的基本结构: ```xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;project xmlns=...

    ssh整合超详细步骤.txt

    在`hibernate.cfg.xml`文件中定义数据源和映射文件路径等: ```xml &lt;hibernate-configuration&gt; &lt;session-factory&gt; &lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; ...

    SpringBoot整合多数据源

    在现代的Web应用开发中,SpringBoot框架因其...以上内容详细介绍了SpringBoot整合多数据源的实践方法,以及解决Lombok报错问题和使用Freemarker、Undertow、JSP的相关配置。希望对你在SpringBoot开发过程中有所帮助。

Global site tag (gtag.js) - Google Analytics