4
回答
JFinal+freemarker的疑惑
开发十年,就只剩下这套Java开发体系了   

我这边有一个项目,用了JFinal3.3 + freemarker。
做优化时发现一个现象,已经做了简单的Demo实例:

Controller的方法中:

LinkedHashMap zhmap = new LinkedHashMap();
zhmap.put("zh01", "s01");
zhmap.put("zh02", "s02");

setAttr("zhmap", zhmap);

renderFreeMarker("s.ftl");

FTL:

<#list zhmap?keys as k>
key: ${k!} <br/>
</#list>

页面输出:

key: getClass
key: getOrDefault
key: computeIfAbsent
key: values
key: replace
key: zh02
key: replaceAll
key: remove
key: containsValue
key: put
key: empty
key: compute
key: hashCode
key: zh01
key: putAll
key: get
key: merge
key: class
key: keySet
key: entrySet
key: forEach
key: containsKey
key: isEmpty
key: clear
key: computeIfPresent
key: size
key: equals
key: clone
key: toString
key: putIfAbsent
-------------- 页面输出结束 ---------------------

理论上,只应该输出Map中的Key呀(zh01, zh02),但实际上把Map的对象的类成员名称都输出了。KEY输出的顺序也不是预期的。

@jfinal

 

<无标签>
举报
云淡风轻0415
发帖于6个月前 4回/268阅

这个是 freemarker 的一个 bug,jfinal 是不会干预 freemarker 功能上的行为的。 以前有几个人碰到过,具体解决办法有点忘了,或许升级下 freemarker 的 jar 包就可以了

既然是 jfinal 3.3,用 jfinal 自带的模板引擎对 map 迭代要爽得多:

#for(x : map)
   #(x.key)
   #(x.value)
#end

 

引用来自“JFinal”的评论

这个是 freemarker 的一个 bug,jfinal 是不会干预 freemarker 功能上的行为的。 以前有几个人碰到过,具体解决办法有点忘了,或许升级下 freemarker 的 jar 包就可以了

既然是 jfinal 3.3,用 jfinal 自带的模板引擎对 map 迭代要爽得多:

#for(x : map)
   #(x.key)
   #(x.value)
#end

 

老项目了,升级了一下JFinal Jar,但项目中那么多的FTL,还真没精力搞。

是这个BeanWrapper干的。

configuration.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER);

如果换成其它两种Wrapper,就可以正常使用“?keys”。

configuration.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);
// 或
configuration.setObjectWrapper(ObjectWrapper.SIMPLE_WRAPPER);

 

--- 共有 4 条评论 ---
JFinal 回复 @云淡风轻0415 : 不出所料 5个月前 回复
云淡风轻0415FTL支持的语法与Wrapper有关,看来项目开始开发后,最好不更换ObjectWrapper 5个月前 回复
云淡风轻0415 回复 @JFinal : 试了一下,这些Wrapper的区别太大,大量FTL都在疯狂报错!!!于是停止了这个疯狂的想法。 然后使用其它办法达成目标了。 5个月前 回复
JFinal换掉这个 BeanWrapper 会不会引发新的问题? 6个月前 回复
顶部