欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【转载】Freemarker ObjectWrapper使用测试

程序员文章站 2022-03-07 20:02:56
...
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