出家如初,成佛有余

Freemarker ObjectWrapper使用测试

Posted in Uncategorized by chuanliang on 2008/05/24

    先学习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);
       &nbs
p;    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} <br>
    –>
</#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;
    }
}

 

No Responses Yet

Subscribe to comments with RSS.

  1. carin said, on 2008/08/04 at 22:54

    這對我現在要做的十分有幫助!!
    就是搞不定這 ObjectWrapper….
    有範例真好~~謝謝!

  2. woxiangbo said, on 2009/08/10 at 02:38

    # 那这个应该怎么写、?我正好碰到这个问题了

    QQ:273040644
    真诚的向楼主学习请教


发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: