TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
先学习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 :
Scalar Map value is:
</#list>
但如果Map的value是JavaBean对象(例如JavaBean为User,有userId和userName两个属性),如果需要在Freemarker模板文件中使用类似el表达式的方式获取JavaBean的属性值,也即:,此种情况下不能采用缺省的DEFAULT_WRAPPER,需要使用ObjectWrapper.BEANS_WRAPPER。
当然如果在Freemarker模板文件中不需要获取JavaBean对象的属性值,也即只需要获取对象本身:,则也可以不使用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:
Scalar Number:
Object is:
List使用样例-List元素为Scalar对象:
<#list scalarList as value0>
Scalar List值:
</#list>
List使用样例-List元素为User对象:
<#list userList as listUser>
List对象User Id值:
</#list>
Map使用样例-Map Values元素为Scalar :
<#list scalarMap?keys as mykey>
Scalar Map key is :
Scalar Map value is:
</#list>
Map使用样例-Map Values元素为User对象:
<#list userMap?keys as key1>
<#assign mapUser=”” >
User Object is :
<#�
以下方法有问题
User is : <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;
}
}
运行结果:
C:src>java FreeMarkerTest
log4j:WARN No appenders could be found for logger (freemarker.cache).
log4j:WARN Please initialize the log4j system properly.
Scalar String:Scalar String Test
Scalar Number:3
Object is:User@10ef90c
List使用样例-List元素为Scalar对象:
Scalar List值:red
Scalar List值:green
Scalar List值:blue
List使用样例-List元素为User对象:
List对象User Id值:1
List对象User Id值:2
List对象User Id值:3
List对象User Id值:4
List对象User Id值:5
List对象User Id值:6
Map使用样例-Map Values元素为Scalar :
Scalar Map key is :anotherString
Scalar Map value is:aaaaaaaa
Scalar Map key is :anotherNumber
Scalar Map value is:3.14
Map使用样例-Map Values元素为User对象:
User Object is :User@fe64b9
User Object is :User@186db54
User Object is :User@a97b0b
User Object is :User@cd2c3c
User Object is :User@13582d
User Object is :User@21b6d
C:src>
-->
源码下载:http://file.javaxxz.com/2014/11/4/000042078.zip |
|