一个问题引发的思考
来看场景 1
我有一个 java 的 Map 变量, 希望在 ftl 文件中被 list 循环迭代显示到页面, 示例如下
java代码片段 1
Map<String, String> javaMap = new HashMap<String, String>();
javaMap.put(“a”, “A”);
javaMap.put(“b”, “B”);
ftl代码片段 1
<#list javaMap.keySet() as ke>
<p>${ke}=${javaMap[ke]}</p>
</#list>
渲染出的ftl代码
<p>a=A</p>
<p>b=B</p>
ftl代码片段 2
<#list javaMap?keys as ke>
<p>${ke}=${javaMap[ke]}</p>
</#list>
渲染出的ftl代码
模板渲染错误, 在${javaMap[ke]}地方渲染发生错误
ftl代码片段 3
<#list javaMap?keys as ke>
${ke};
</#list>
渲染出的ftl代码
hashCode;keyOne;getClass;get;values;toString;keyTwo;clone;keySet;containsValue;notifyAll;clear;size;empty;entrySet;isEmpty;class;put;putAll;remove;containsKey;equals;wait;notify;
在看场景 2
java代码片段 2
String javaString = “{'a':'A','b':'B'}”;
ftl代码片段 4
<#assign ftlBeanObj = javaString?eval>
验证 , 对象会是Map特性的对象吗
<#list ftlBeanObj.keySet() as ke>
<p>${ke}=${ftlBeanObj[ke]}</p>
</#list>
验证 -结果如下,渲染出的html代码
模板渲染错误, 在 ftlBeanObj.keySet() 地方渲染发生错误, 没找到这个方法
ftl代码片段 5
<#assign ftlBeanObj = javaString?eval>
验证 , 对象会是JSON特性的对象吗
<#list ftlBeanObj?keys as ke>
<p>${ke}=${ftlBeanObj[ke]}</p>
</#list>
验证 -结果如下,渲染出的html代码
<p>a=A</p>
<p>b=B</p>
分析, 在前文环境中
javaMap是一个java的对象,
若想正确的遍历其内存储的键值对, 需要使用对象自身方法 Map.keySet() 方法来遍历
若使用ftl专属语法 ?keys, 将会把 javaMap 对象这个HashMap类自身的java.method当作对象的属性, 在这里被遍历出来
javaString?eval 这个ftl专属语法将构建一个ftl专属的 DefaultObjectWrapper 对象,
此时需要使用 ?keys 语法,才能正确的遍历出其内部的实际键值对
这里构建出来的对象不具有Map性质
思考
有文章提到 javaMap 的这种遍历现象是因为 ftl 将 java Object 转为 BeansWrapper 对象了, 而不是转为 DefaultObjectWrapper 对象
原文如下
However, some really old FreeMarker integrations use a strange configuration, where the public Map methods (like getClass) appear as keys. That happens as they are using a pure BeansWrapper (instead of DefaultObjectWrapper) whose simpleMapWrapper property was left on false. You should avoid such a setup, as it mixes the methods with real Map entries.
要想使用 javaMap.keySet() 方式遍历键值对, 需要调整 ftl 的初始配置(ps: 本人还未尝试,不确定配置改动是否能正常得到后文提到的结果
在配置文件中加入如下配置:
<prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop>
在 OFBiz 中这个配置的初始化如下, 这里是 BeansWrapper 对象
//import freemarker.ext.beans.BeansWrapper;
//import freemarker.ext.beans.BeansWrapperBuilder;
//import freemarker.template.Configuration;
//import freemarker.template.Version;
Version version = Configuration.VERSION_2_3_24;
Configuration newConfig = new Configuration(version);
BeansWrapper wrapper = new BeansWrapperBuilder(version).build();
newConfig.setObjectWrapper(wrapper);
若如 OFBiz 中这种配置, 确实会如前文 javaMap.keySet() 遍历正常; javaMap?keys 遍历出错;
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
在 Moqui 中这个配置的初始化如下, 这里是 BeansWrapper 对象
[org.moqui.impl.context.renderer.FtlTemplateRenderer#makeFtlConfiguration]
//
Version FTL_VERSION = Configuration.VERSION_2_3_25;
Configuration newConfig = new MoquiConfiguration(FTL_VERSION, ecfi);
BeansWrapper defaultWrapper = new BeansWrapperBuilder(FTL_VERSION).build();
newConfig.setObjectWrapper(defaultWrapper);
若如 Moqui 中这种配置, 也会如前文 javaMap.keySet() 遍历正常; javaMap?keys 遍历出错;
参考链接
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
相关推荐
最新版OFBiz,apache-ofbiz-16.11.05,apache-ofbiz-16.11.05
Apache-Ofbiz-16-全量数据库873张表sql文件
小谈ofbiz学习,发展历史,学习体验和心得,以及ofbiz与其他框架的不同之处
Apache OFBiz E-Business Solutions.pdf 一千多页,OFBiz 9.04
OFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.doc
不用解压ofbiz-entry-zh-cn.zip 直接把zip修改为doc 即可。 ofbiz-entry-zh-cn.doc 博文链接:https://jiasudu.iteye.com/blog/157892
使用官方资源中的ant命令自动生成,无任何修改。有兴趣的朋友可以自己生成,ant命令是:docs-all,该命令生成帮助文档时会获取操作系统语言设置,要生成英文文档请先将操作系统语言改为英语,要生成中文文档需要在...
Ofbiz 官网上的OFBiz Tutorial - A Beginners Development Guide中的案例practice,其中内容有些是老版本的,与新版本(13版)并不兼容,尤其是Ajax部分已经有较大差异。同时有一部分操作和源代码没有在教程中说明...
apache-ofbiz-16.11.02.zip,ofbiz菜鸟笔记,Apache+OFBiz+开发初学者指南.chm
OFBiz教程-初学者开发指南,适合初学者,解决初学者学习ofbiz入门问题
ofbiz权限非常介绍,ofbiz进阶之权限介绍!
OFBiz实践,百货购,挺好的东西,分享给大伙,欢迎下载
Apache OFBiz 是用于企业流程自动化的开源产品,包括 ERP(企业资源规划)、CRM(客户关系管理)、电子商务/电子商务、SCM(供应链管理)、MRP(制造资源规划)、MMS / EAM(维护管理系统/企业资产管理)的框架组件...
ofbiz-birt.pdfofbiz-birt.pdfofbiz-birt.pdfofbiz-birt.pdfofbiz-birt.pdfofbiz-birt.pdfofbiz-birt.pdfofbiz-birt.pdf
apache-ofbiz-13.07.02.zip
ofbiz 的源代码和工程,这个是9版本的。
Ofbiz-minilang标签示例