`

【转载】Freemarker ObjectWrapper使用测试

阅读更多
http://www.yeeach.com/2008/05/24/freemarker-objectwrapper%E4%BD%BF%E7%94%A8%E6%B5%8B%E8%AF%95/
Freemarker ObjectWrapper使用测试

先学习Freemarker Programmer Guide中对ObjectWrapper的说明: 

    FreeMarker 数据容器(root)可以放置任意的对象,而不一定就是实现了TemplateModel 接口的对象。这是为什么呢?!因为FreeMarker 提供的容器实例会在其内部把放置在其中的对象自动转换成实现了TemplateModel 接口的对象。比如说,
如果你放置一个String 对象在容器中, 它就会把String 对象在内部自动转换成SimpleScalar。
    至于何时发生转换,这是容器自身逻辑的问题。但是最晚也会在获取子变量的时候进行转换,因为获取子变量方法会返回TemplateModel 对象而不是Object 对象。例如,SimpleHash,SimpleSequence 和SimpleCollection 使用延迟转换策略(laziest
strategy);它们会在第一次获取子变量的时候把其他类型的对象转换成TemplateModel类型。
    至于什么类型的对象可以被转换,以及具体转换成何种类型,一方面容器自身可以处理,另一方面也可以把它委托给ObjectWrapper 实例去处理。ObjectWrapper 是一个接口具有一个方法TemplateModel wrap(java.lang.Object obj)。用户可以传递一个Object 对象,它就会返回一个与之对应的TemplateModel 对象,或者抛出异常。这些转换规则是写死在ObjectWrapper 实现里面的。
    FreeMarker 提供的ObjectWrapper 重要的实现有:
 ObjectWrapper.DEFAULT_WRAPPER :它可以把String 转换成SimpleScalar ,Number 转换成SimpleNumber,List 和array 转换成SimpleSequence,Map 转换成SimpleHash,Boolean 转换成TemplaeBooleanModel.TRUE/FALSE 等等。(对于其他的类型对象的转换就要调用BEANS_WRAPPER)
 ObjectWrapper.BEANS_WRAPPER:它可以使用反射访问任意JavaBean 的属性 

    对于Freemarker中如果使用HashMap(或SimpleHash)时候,如果HashMap的键值对(key,value)的value是普通的Scalar对象(String、Double等),此种情况下,对于ObjectWrapper可以直接使用DEFAULT_WRAPPER,在Freemarker模板文件中使用也相对简单,只需要采用如下方式即可:

<#list scalarMap?keys as mykey>
    Scalar Map key is :${mykey}
    Scalar Map value is:${scalarMap[mykey]}
</#list> 

    但如果Map的value是JavaBean对象(例如JavaBean为User,有userId和userName两个属性),如果需要在Freemarker模板文件中使用类似el表达式的方式获取JavaBean的属性值,也即:${testmap[key].userId},此种情况下不能采用缺省的DEFAULT_WRAPPER,需要使用ObjectWrapper.BEANS_WRAPPER。 

    当然如果在Freemarker模板文件中不需要获取JavaBean对象的属性值,也即只需要获取对象本身:${testmap[key]},则也可以不使用ObjectWrapper.BEANS_WRAPPER。


1、测试用例
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.SimpleHash;
import freemarker.template.SimpleSequence;
import freemarker.template.Template;
public class FreeMarkerTest {
    public static void main(String[] args){
        FreeMarkerTest test = new FreeMarkerTest();
        test.sayHelloWorld();
    }
    public void sayHelloWorld(){
        Configuration freemarkerCfg = new Configuration();
        freemarkerCfg.setClassForTemplateLoading(this.getClass(), “/”);
        freemarkerCfg.setEncoding(Locale.getDefault(), “GBK”);
        Template template;
        Locale.setDefault(Locale.SIMPLIFIED_CHINESE);
        try{
            template = freemarkerCfg.getTemplate(”HelloWorld.ftl”);
            template.setEncoding(”GBK”); 

            User user1=new User();
            user1.setUserId(”1″);
            user1.setUserName(”1″); 

            User user2=new User();
            user2.setUserId(”2″);
            user2.setUserName(”2″); 

            User user3=new User();
            user3.setUserId(”3″);
            user3.setUserName(”3″); 

            User user4=new User();
            user4.setUserId(”4″);
            user4.setUserName(”4″);
            User user5=new User();
            user5.setUserId(”5″);
            user5.setUserName(”5″);
            User user6=new User();
            user6.setUserId(”6″);
            user6.setUserName(”6″); 

            List scalarList = new ArrayList();
            scalarList.add(”red”);
            scalarList.add(”green”);
            scalarList.add(”blue”);
            SimpleHash root = new SimpleHash(ObjectWrapper.BEANS_WRAPPER);
            root.put(”scalarString”, “Scalar String Test”);
            root.put(”scalarNumber”, new Integer(3));
            root.put(”scalarObject”, new User(”33″,”33″));
            root.put(”scalarList”, scalarList);
            SimpleHash scalarMap=new SimpleHash(ObjectWrapper.BEANS_WRAPPER);    
            root.put(”scalarMap”, scalarMap);
            scalarMap.put(”anotherString”, “aaaaaaaa”);
            scalarMap.put(”anotherNumber”, new Double(3.14));
            SimpleSequence userList=new SimpleSequence(ObjectWrapper.BEANS_WRAPPER);
            root.put(”userList”, userList);
            userList.add(user1);
            userList.add(user2);
            userList.add(user3);
            userList.add(user4);            
            userList.add(user5);
            userList.add(user6);
            SimpleHash userMap=new SimpleHash(ObjectWrapper.BEANS_WRAPPER);        
            root.put(”userMap”, userMap);
            userMap.put(”1″, user1);
            userMap.put(”2″, user2);            
            userMap.put(”3″, user3);
            userMap.put(”4″, user4);
            userMap.put(”5″, user5);
            userMap.put(”6″, user6); 

            StringWriter writer = new StringWriter();
            template.process(root, writer);
            System.out.println(writer.toString());
        }catch(Exception e){
            e.printStackTrace();
        }}
}


2、HelloWorld.ftl
Scalar String:${scalarString}    
Scalar Number:${scalarNumber}
Object is:${scalarObject} 

List使用样例-List元素为Scalar对象: 

<#list scalarList as value0>
    Scalar List值:${value0} 
</#list> 

List使用样例-List元素为User对象: 

<#list userList as listUser>
    List对象User Id值:${listUser.userId} 
</#list> 

Map使用样例-Map Values元素为Scalar : 

<#list scalarMap?keys as mykey>
    Scalar Map key is :${mykey}
    Scalar Map value is:${scalarMap[mykey]}
</#list> 

Map使用样例-Map Values元素为User对象: 

<#list userMap?keys as key1>
    <#assign mapUser=”${userMap[key1]}” >
    User Object is :${mapUser}
    <#– 
    以下方法有问题 
    User is :${mapUser.userId} 
    –>
</#list>


3、User.java
public class User {
    private String userId;
    private String userName;
    public User(){
    }
    public User(String userId,String userName){
        this.userId = userId;
        this.userName = userName;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
} 

分享到:
评论

相关推荐

    freemarker常用使用文档

    freemarker常用使用文档......................................................................

    freemarker 教程 使用手册

    2. 数据模型设置:通过`ModelAndView`或`Map`将Java对象传递到视图,供Freemarker使用。 3. 视图解析:配置`ViewResolver`,例如`FreemarkerViewResolver`,确定模板路径和渲染逻辑。 四、Freemarker高级特性 1. ...

    freemarker模板使用

    Freemarker是一个强大的开源模板...结合提供的"freemarker"压缩包,你可以进一步学习和实践这些概念,通过创建和测试模板来提升对Freemarker的理解和应用能力。记得在模板设计时保持清晰、简洁,确保易于维护和扩展。

    freemarker-online-tester:Apache FreeMarker在线测试仪

    FreeMarker在线测试仪 什么是FreeMarker在线测试仪 这是一个网页,可通过一些简单的数据模型快速尝试模板片段。 这对于学习模板语言特别方便。 对于此工具的已部署版本,您可以访问 。 开发说明 将存储库克隆到本地...

    FreeMarker标签使用

    FreeMarker标签使用FreeMarker标签使用FreeMarker标签使用FreeMarker标签使用

    freemarker编辑插件

    Freemarker是一款强大的模板语言,常用于Web开发中的视图层渲染,特别是在Java环境中与Spring框架结合使用。它允许开发者将逻辑与展示分离,提高代码的可读性和维护性。在开发过程中,为了提高效率,我们可以使用...

    freemarker-2.3.31-API文档-中文版.zip

    赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...

    freemarker 自定义freeMarker标签

    FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件判断和循环。然而,这些默认标签可能无法满足所有复杂的场景,因此自定义标签就显得尤为必要。 自定义FreeMarker标签通常涉及...

    Freemarker使用指南_中文版文档

    FreeMarker 是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker 与 Web 容器无关,即在Web运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java ...

    freemarker.jar用于jdk1.8下使用

    7. **与Spring Framework集成**:在Spring MVC中,Freemarker可以作为视图解析器使用,通过配置`FreeMarkerConfigurer`和`FreeMarkerViewResolver`,可以轻松地将Freemarker与Spring的控制器层结合。 8. **模板继承...

    FreeMarker使用Macro实例

    FreeMarker使用Macro实例,很好的学习资料。

    Freemarker2.3.16_带简单教程

    1. **基本语法**:Freemarker使用简单的模板语言,主要包括变量表示(${})、控制结构(if/else、foreach)、条件表达式(?)和函数调用(例如,日期和时间的格式化)。 2. **模板设计模式**:如如何定义模板布局,...

    Java中使用 FreeMarker 生成pdf盖章合同文件

    本篇文章将深入探讨如何在Java中使用FreeMarker生成带有盖章的PDF合同文件。 首先,让我们了解FreeMarker的基本概念。FreeMarker是一个基于模板的语言,它与Java代码分离,允许开发者用简单的模板语法来表示数据。...

    springboot如何使用Freemarker模版引擎

    通过以上步骤,你可以在SpringBoot应用中成功集成并使用Freemarker模板引擎。这只是一个基础的介绍,实际开发中,你可以根据项目需求配置更多的Freemarker特性和功能,如缓存管理、日期格式化等,以满足复杂的应用...

    grails使用freemarker.rar

    标题中的“grails使用freemarker.rar”表明这是一个关于如何在Grails框架中应用FreeMarker模板引擎的资源包。FreeMarker是一个开源的、基于Java的模板引擎,它用于生成动态HTML或其他格式的文本,比如XML、PDF等。...

    jdk1.8下可以使用的freemarker.jar

    虽然Freemarker支持多种Java版本,但这个特别的`freemarker.jar`版本已经过测试,确保在Java 8环境下稳定工作。这意味着它可以利用Java 8的一些特性,比如lambda表达式和Stream API,来提高模板处理效率。 6. **与...

    刘宝宝FreeMarker测试类

    FreeMarker测试类

    freemarker操作手册-完整freemarker教程

    通过阅读《freemarker操作手册》提供的完整教程,你可以系统地学习到以上所有内容,并结合实践,熟练掌握Freemarker的使用技巧。无论是初学者还是经验丰富的开发者,这份手册都是深入理解和应用Freemarker不可或缺的...

    超强freemarker使用总结,有示例有讲解,可做快速查询手册!!

    ### Freemarker 使用总结与详解 #### 一、Freemarker 概述 Freemarker 是一种用于生成动态页面的模板引擎。它不依赖任何 Web 容器,可以在任何 Java 应用程序中使用。Freemarker 的核心优势在于其简单易学且功能...

Global site tag (gtag.js) - Google Analytics