【转载】Freemarker ObjectWrapper使用测试

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:35   1671   0
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;
}
}
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP