一个问题引发的思考
来看场景 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-16-全量数据库873张表.rar"包含了Apache Ofbiz 16版本的全量数据库结构,包括873个数据表的SQL脚本。这些脚本用于创建和初始化数据库,对于理解和开发基于Ofbiz的应用程序至关重要。 1. **...
最新版OFBiz,apache-ofbiz-16.11.05,apache-ofbiz-16.11.05
首先,你需要在`hot-deploy`目录下创建一个名为`practice`的子目录,并在其中创建`ofbiz-component.xml`文件。该文件定义了组件的名称、资源加载器类型以及其他相关信息。例如: ```xml <ofbiz-component name=...
### OFBiz 入门操作手册知识点详解 #### 一、OFBiz简介与背景 - **OFBiz**(Open For Business)是一款开源的企业级电子商务框架,主要用于构建和部署各种类型的业务应用,包括电子商务、供应链管理等。 - **目标...
在Ofbiz中,“组件”是组织代码的基本单元,每个组件都有自己的功能领域,如订单管理、产品目录或库存控制。`component-load.xml`文件是加载这些组件的关键配置文件,它定义了组件的元数据,包括服务、实体模型、...
首先,我们要理解`component-load.xml`文件在OFBiz中的角色。这是一个关键的配置文件,用于定义OFBiz组件的加载顺序和配置信息。在OFBiz框架中,组件是可重用的、自包含的功能单元,如产品管理、订单处理等。`...
`component-load.xml`是OFBiz中的一个重要配置文件,它定义了OFBiz启动时加载的组件及其顺序。组件是OFBiz中的基本组织单元,包含服务、实体模型、页面、工作流等。通过修改此文件,你可以控制哪些组件在特定环境中...
登录级别的权限控制定义在每个组件的`ofbiz-component.xml`文件中,用于限定用户访问该组件所需的最低权限。例如,可以通过设置`base-permission`属性来指定用户至少需要具备哪些权限才能访问该组件。例如,一个组件...
OFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.docOFBiz-manual-zh.doc
3. **商业智能(Business Intelligence)**:通过数据分析和报告工具,提供企业决策支持。 4. **客户关系管理(CRM)**:管理与客户的交互,包括销售、市场营销和服务。 5. **电子商务(E-Commerce)**:构建在线...
本篇将聚焦于“Ofbiz12.04 进阶之三 第一个HelloWord的应用”,我们将深入探讨如何在OFBiz框架下创建并运行你的第一个应用。 首先,理解OFBiz的基本结构至关重要。OFBiz采用模块化设计,每个模块都有其特定的功能,...
使用官方资源中的ant命令自动生成,无任何修改。有兴趣的朋友可以自己生成,ant命令是:docs-all,该命令生成帮助文档时会获取操作系统语言设置,要生成英文文档请先将操作系统语言改为英语,要生成中文文档需要在...
apache-ofbiz-16.11.02.zip,ofbiz菜鸟笔记,Apache+OFBiz+开发初学者指南.chm
Ofbiz 官网上的OFBiz Tutorial - A Beginners Development Guide中的案例practice,其中内容有些是老版本的,与新版本(13版)并不兼容,尤其是Ajax部分已经有较大差异。同时有一部分操作和源代码没有在教程中说明...