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常用使用文档......................................................................
2. 数据模型设置:通过`ModelAndView`或`Map`将Java对象传递到视图,供Freemarker使用。 3. 视图解析:配置`ViewResolver`,例如`FreemarkerViewResolver`,确定模板路径和渲染逻辑。 四、Freemarker高级特性 1. ...
Freemarker是一个强大的开源模板...结合提供的"freemarker"压缩包,你可以进一步学习和实践这些概念,通过创建和测试模板来提升对Freemarker的理解和应用能力。记得在模板设计时保持清晰、简洁,确保易于维护和扩展。
FreeMarker在线测试仪 什么是FreeMarker在线测试仪 这是一个网页,可通过一些简单的数据模型快速尝试模板片段。 这对于学习模板语言特别方便。 对于此工具的已部署版本,您可以访问 。 开发说明 将存储库克隆到本地...
FreeMarker标签使用FreeMarker标签使用FreeMarker标签使用FreeMarker标签使用
Freemarker是一款强大的模板语言,常用于Web开发中的视图层渲染,特别是在Java环境中与Spring框架结合使用。它允许开发者将逻辑与展示分离,提高代码的可读性和维护性。在开发过程中,为了提高效率,我们可以使用...
赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...
FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件判断和循环。然而,这些默认标签可能无法满足所有复杂的场景,因此自定义标签就显得尤为必要。 自定义FreeMarker标签通常涉及...
FreeMarker 是一个用Java语言编写的模板引擎,它基于模板输出文本。FreeMarker 与 Web 容器无关,即在Web运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java ...
7. **与Spring Framework集成**:在Spring MVC中,Freemarker可以作为视图解析器使用,通过配置`FreeMarkerConfigurer`和`FreeMarkerViewResolver`,可以轻松地将Freemarker与Spring的控制器层结合。 8. **模板继承...
FreeMarker使用Macro实例,很好的学习资料。
1. **基本语法**:Freemarker使用简单的模板语言,主要包括变量表示(${})、控制结构(if/else、foreach)、条件表达式(?)和函数调用(例如,日期和时间的格式化)。 2. **模板设计模式**:如如何定义模板布局,...
本篇文章将深入探讨如何在Java中使用FreeMarker生成带有盖章的PDF合同文件。 首先,让我们了解FreeMarker的基本概念。FreeMarker是一个基于模板的语言,它与Java代码分离,允许开发者用简单的模板语法来表示数据。...
通过以上步骤,你可以在SpringBoot应用中成功集成并使用Freemarker模板引擎。这只是一个基础的介绍,实际开发中,你可以根据项目需求配置更多的Freemarker特性和功能,如缓存管理、日期格式化等,以满足复杂的应用...
标题中的“grails使用freemarker.rar”表明这是一个关于如何在Grails框架中应用FreeMarker模板引擎的资源包。FreeMarker是一个开源的、基于Java的模板引擎,它用于生成动态HTML或其他格式的文本,比如XML、PDF等。...
虽然Freemarker支持多种Java版本,但这个特别的`freemarker.jar`版本已经过测试,确保在Java 8环境下稳定工作。这意味着它可以利用Java 8的一些特性,比如lambda表达式和Stream API,来提高模板处理效率。 6. **与...
FreeMarker测试类
通过阅读《freemarker操作手册》提供的完整教程,你可以系统地学习到以上所有内容,并结合实践,熟练掌握Freemarker的使用技巧。无论是初学者还是经验丰富的开发者,这份手册都是深入理解和应用Freemarker不可或缺的...
### Freemarker 使用总结与详解 #### 一、Freemarker 概述 Freemarker 是一种用于生成动态页面的模板引擎。它不依赖任何 Web 容器,可以在任何 Java 应用程序中使用。Freemarker 的核心优势在于其简单易学且功能...