【转载】Freemarker ObjectWrapper使用测试

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通过word生成doc模板(xml模板),list的遍历 1、下载freemarker的jar包导入到项目中; 2、通过word文档生成doc模板(xml模板): 新建word文档,编辑内容(变量使用${propertyName}的方式),然后另存为xml文件,xml模板便完成。 另存为xml模板。 如果要使用遍历list的话,需要使用到标签: <#list listName as entityName> 存放遍历的内容,遍历的变量值是:${entityName.name} </#list> 标签存放的位... 阅读详情

相关推荐

freemarker-online-tester:Apache FreeMarker在线测试仪

FreeMarker在线测试仪 什么是FreeMarker在线测试仪 这是一个网页,可通过一些简单的数据模型快速尝试模板片段。 这对于学习模板语言特别方便。 对于此工具的已部署版本,您可以访问 。 开发说明 将存储库克隆到本地目录 从克隆的目录中运行./gradlew build (使用JDK 8) 如果要使用IDEA运行它,请运行./gradlew cleanidea idea ; 这将为您生成IDEA项目。 要运行该服务: 从命令行:构建shadowJar (不是jar ),然后发出java -jar build/libs/freemarker-online-<VERSION>.jar server src/main/resources/freemarker-online.yml 在IDE中:使用参数server src/main/resources/freemarker-o

FreeMarker2.3.10―Programmer's Guide(中文版)

前言 一、快速入门 1.1、创建配置实例 1.2、创建数据模型(Data Model) 1.3、获取模版(template) 1.4、把模版与数据模型合并 1.5、完整的代码 二、数据模型(Data Model) 2.1、基础类型 2.2、Scalar 类型(单值对应的Data Model) 2.3、容器类型 2.4、方法变量 2.5、转换器变量 2.6、节点变量 ...

松篁 295

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了两相交错并联Boost电路的Simulink仿真模型,属于电力电子变换器领域的核心技术研究。该模型基于Simulink平台构建,重点在于通过多相交错并联结构提升Boost电路的输出稳定性与转换效率,有效降低输入电流纹波,适用于中高功率电力变换场合。文档系统阐述了电路的工作原理、闭环控制策略设计、软启动机制实现以及关键参数的优化方法,充分展现了多相并联技术在改善动态响应、提高功率密度方面的优势。同时,提供了完整的仿真建模流程和技术路线,涵盖主电路搭建、控制器设计、系统调试与性能分析等环节,并配套提供仿真文件、设计报告及参考文献等丰富资料,便于学习者深入理解与实践复现。; 适合人群:具备电力电子技术基础知识、熟悉Simulink仿真环境,正在从事新能源发电、电动汽车、工业电源系统等相关领域研究的硕士博士研究生、科研人员及电气工程方向的工程技术人员。; 使用场景及目标:①用于深入理解多相交错并联Boost电路的拓扑结构与工作机理;②支撑科研项目中的高效DC-DC变换器性能验证与优化设计;③为实际电源产品开发提供理论依据和仿真原型;④作为高校课程设计或实验教学的参考案例,提升学生的工程仿真与系统分析能力。; 阅读建议:建议结合文档中提及的其他相关变换器模型(如LLC谐振变换器、PFC电路、Buck变换器等)进行横向对比学习,深入掌握不同拓扑的控制策略差异与适用场景,并充分利用所提供的网盘资源下载完整仿真模型,动手调试参数、观察波形,从而深化对多相并联控制、电流均流、闭环稳定性等关键技术的理解,全面提升电力电子系统的仿真与设计能力。

FreeMarker ObjectWrapper 包装 Java 8 LocalDate/LocalTime/LocalDateTime 数据模型

FreeMarker ObjectWrapper 包装 Java 8 LocalDate/LocalTime/LocalDateTime 数据模型

Geek Feleon 1912

Tesseract OCR识别不准?手把手教你用PyAutoGUI提升自动点击脚本的准确率

本文针对Tesseract OCR在屏幕自动化中识别不准的问题,提供了一套完整的优化方案。通过PyAutoGUI精准截图、结合PIL和OpenCV进行图像预处理(如灰度化、对比度增强、自适应二值化),并调优Tesseract参数(如PSM模式、白名单),显著提升文本识别准确率。文章还介绍了结合模板匹配、构建容错循环等进阶技巧,帮助开发者打造高可靠性的自动点击脚本。

weixin_29093017的博客 544

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 415

freemarker 的ObjectWrapper Settings

为什么80%的码农都做不了架构师?>>> ...

weixin_34288121的博客 248

C#实战:5分钟搞定西门子S7-1200 PLC数据读写(S7netplus保姆级教程)

本文详细介绍了如何使用C#和S7netplus库快速实现与西门子S7-1200 PLC的数据读写。从环境准备、连接管理到数据读写高级技巧,提供了保姆级教程和实战方案,帮助开发者绕过常见陷阱,提升工业自动化项目的开发效率。

weixin_28432777的博客 283

freemarker的初步使用

首先在对应的工程目录下新建一个template文件夹,用于存放rj格式文件,新建一个index.rj和copyright.rj。 index.rj: ${me.mail} copyright.rj: Copyright (C) ${date} xuzengqiang. All rights reserved. 新建java代码: package com.xuzengq

风的专栏 813

TongWeb微服务部署实战:Nacos注册与网关路由的疑难解析

本文分享了将Spring Cloud微服务迁移至TongWeb应用服务器时,解决Nacos服务注册失败与Spring Cloud Gateway路由失效的实战经验。针对Nacos注册问题,通过实现ApplicationRunner接口并利用JMX获取容器端口,实现了手动注册;针对网关路由问题,建议将基于WebFlux的Gateway模块改为JAR包独立部署,以保障其原生运行环境。文章为在TongWeb上进行微服务部署提供了关键的问题排查思路与混合架构部署的最佳实践。

weixin_29209801的博客 240

关于UMI设备采集数据的模型训练方法

模仿学习如专家模型、VLA模型,ACT、DP、openpi等算法模型训练时,都是使用的机器人的绝对位姿或关节角;而UMI记录的轨迹是相对于UMI起始点的,可以理解为是相对于起点的绝对增量,对应到机器人中就是相对于末端TCP的增量。在用模型进行训练时,当然可以,但这样进行模型训练的话达不到跨本体的能力,因为模型本身还是学习的基于机器人base坐标系的绝对位姿关系,倘若用这种方式进行处理,则UMI可以理解为是一个遥操的方法,本质还是记录的机器人的state。在看了和。

boss-dog 421

Freemarker实例教程

一、什么是Freemarker?    Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为java程序员提供的一个开发包。到目前为止呢,freemarker使用越来越广泛,不光光只是它强大的生成技术,而且它能够与spring进行很好的集成。现在开始一层层揭开它的神秘面纱。。 二、Freemarker提供了哪些标签? list:该标签主要是进行

永恒の_☆ 8万+

2、欧洲期权的赫斯顿模型

本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。

tequila的博客 350

【FreeMarker】【程序开发】数据模型,对象包装

在简单的示例中,可以使用 java.lang 和 java.util 包下的类

王晓斌的专栏 2955

激光雷达点云异常现象详解:鬼影、高反膨胀与拖点

现象核心外观主要成因核心硬件对策核心算法对策鬼影位置错误,出现"复制"的物体镜面反射/光学元件间杂散光物理光阑、抗反射涂层多帧时序一致性检验、反射率逻辑判断膨胀尺寸变大,轮廓呈毛刺状信号饱和、像素/通道串扰可变增益控制、随机编码序列强度阈值滤波、几何轮廓拟合(剪裁)拖点边缘粘连,出现"阶梯"或"连线"光斑跨立边缘、双回波融合小光斑光学设计、多回波支持邻域深度突变检测、波形脉宽分析这些异常现象是当前激光雷达感知中的核心难点,通常需要硬件物理特性优化与上层感知算法。

Fun_LiDAR的博客 304

手把手教你学Simulink实例--基于Simulink的电力电子系统电池管理系统(BMS)设计与仿真实例

本文详细介绍了基于Simulink的电池管理系统(BMS)设计与仿真全过程。首先阐述了BMS在安全防护、寿命延长和性能优化方面的必要性,分析了新能源汽车、光伏储能等典型应用场景的技术指标要求。接着详细讲解了Thevenin等效电路和多电平电池模型构建方法,并给出SOC估算、故障诊断等核心算法的MATLAB实现代码。通过设计正常充放电、过充保护等多场景仿真测试,验证了系统在SOC跟踪精度(误差<1.5%)和故障响应速度(<10ms)方面的优异性能。文章还提出了参数优化方法和未来AI融合、数字孪生等发展方向,提

xiaoheshang_123的博客 379

FreeMarker开发-数据模型

  FreeMarker用于处理模板的数据模型是哈希表,也就是一个树状结构的name-value对。如下: (root)|+- string="string"|+- map| || +- map1 = "map1"| || +- map2 = "map2"|+- object| || +- field1= "field1"| || +- field2 = "field1" | |...

ddxxhh1000的博客 368

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

FreeMarker 基本配置(一)

freemarker 版本官网下载地址 http://freemarker.org/freemarkerdownload.html当前测试所用版本为:freemarker-2.3.23文件结构1. 模板文件:test02.ftl<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome ${user}!</h1> <p

韩世雷 程序员专栏 4168

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

4、freemarker程序开发

1、程序开发入门 1.1 创建配置实例 首先,你应该创建一个freemarker.template.Configuration的实例,然后调整它的设置。Configuration实例是存储FreeMarker应用级设置的核心部分。同时,它也处理创建和缓存预解析模板的工作。也许你只在应用(可能是servlet)生命周期的开始执行它一次: Configuration cfg = new

kaoa000的专栏——非淡泊无以明志,非宁静无以致远 7625

利用freemarker 静态化网页

1、介绍-FreeMarker是什么      模板引擎:一种基于模板的、用来生成输出文本的通用工具      基于Java的开发包和类库      2、介绍-FreeMarker能做什么      MVC框架中的View层组件      Html页面静态化     代码生成工具     CMS模板引擎   页面栏目动态定制 3、介绍-为什么要用FreeMa

ajun_studio的专栏 10万+

freemarker 解析对象的某元素_Freemarker常用技巧(三)

freemarker模板解析过程例如:一个freemarker表达式 ${hello} ,会被解析成三个部分,分别是${hello}前面和后面的body标签,在freemarker中被定义为TextBlock,中间的变量定义为DollarVariable。那么目前的结构也就是RootExpression = TextBlock DollarVariable TextBlock。解释器一进来将会对R...

weixin_39519741的博客 839

Freemarker使用注意事项

模板存放路径问题 //通过以下这种方式只能获取resources目录下的模板文件 FreeMarkerConfiguration.getConfiguration().getTemplate(templatePath); //通过以下方式,可以指定盘符的路径获取模板文件 fileTemplateLoader = new FileTemplateLoader(new File(tmpPath)); Configuration configuration = freeMarkerConfiguration

qq_37765808的博客 1147

【亲测免费】 Apache FreeMarker在线测试器使用手册

Apache FreeMarker在线测试器使用手册 项目介绍 Apache FreeMarker Online Tester 是一个便捷的在线工具,专门设计用于迅速测试FreeMarker模板片段。它允许用户在无需设置完整开发环境的情况下,通过简单的数据模型来学习和实验FreeMarker模板语言。此项目托管在GitHub上,地址为 https://github.com/apache/freem...

gitblog_00301的博客 1224

解决freemarker数组中的对象属性获取不到

freemarker生成模板接口有两种。意思就是说${list.Name}内容是空的,读取不到。数组内的属性名首字母大写或者包含驼峰的属性均会报错。使用Freemarker写入模板的时候,遍历List的时候发现对象中的首字母大写和带下划线的时候就会报错。freemarker写入模板时不认识list里面中的Java对象属性。

大爱仙尊 1900

【亲测免费】 自由模板的在线试炼场——FreeMarker Online Tester

自由模板的在线试炼场——FreeMarker Online Tester 在当今快速迭代的技术领域中,找到一款既能满足开发者即时测试需求,又能帮助他们深入学习和掌握模板语言工具的,实属不易。而今天,我要向大家隆重推荐的正是这样一款宝藏项目——FreeMarker Online Tester。 项目介绍 FreeMarker Online Tester 是一个专为快速试验模板片段而生的Web页面应用...

gitblog_00071的博客 1357

【精品】FreeMarker 语法详解

遍历对象 模板代码 <#--变量的定义、赋值、运算--> <#assign a = 50 /> ${a} ${a+50} <#assign d={"deptno":"1111","dname":"operation","loc":"newyork"}/> ${d.deptno} ${d.dname} ${d.loc} ${dept} ${dept.d...

哈 3708
上一篇: 【转载】FreeMarker2.3.10―Programmer'sGuide(中文版)
下一篇: 【转载】软件开发者面试百问
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值