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; } }
|