jfinal 由freemarker 切换至jfinal模板 报错

java 代码中将一个LinkedHashMap对象返回到页面上

html代码中这样写

#if( downloadMap.keySet().size() > 0 )
#for(key : downloadMap.keySet())
#(key)
#end
#end


报错

com.jfinal.render.RenderException: com.jfinal.template.TemplateException: Class com.jfinal.template.expr.ast.MethodInfo can not access a member of class java.util.LinkedHashMap$LinkedKeySet with modifiers "public final"

评论区

JFinal

2018-03-26 15:09

jfinal enjoy 对 map 的迭代比 freemarker 方便多了:
#for( x : downloadMap)
#(x.key)
#(x.value)
#end

badouyuren

2018-03-26 15:13

@JFinal 嗯嗯,您说的这种我已经这样写了。
就是想说一下,当我这样写的时候
#for(key : downloadMap.keySet())
#(key)
#end
这样写报错,为什么不支持这种呢

JFinal

2018-03-26 15:19

@badouyuren 不是 jfinal 不支持,而是 jfinal 反射使用 java.util.LinkedHashMap$LinkedKeySet 这个内部类时 JDK 不允许,可能是有什么安全策略,具体还没研究过

用 java 代码调用 map.keySet() 是可以的,但是 enjoy 是先获取的 Method 对象,然后 method.invoke() 反射调用的这个 keySet() 方法,所以出了问题

这个问题归根结底是 JDK 不允许这么来调而引发的, enjoy 本身是支持这个功能的

另外,你还可以试试这个:
#for( x : map.entrySet())
#(x.getKey())
#(x.getValue())
#(x.key)
#(x.value)
#end

总之就是 Java 表达式规则

badouyuren

2018-03-26 15:28

@JFinal 嗯,知道了,多谢波总的答疑解惑。原来这样写,在freemarker中没报错。那看来我需要看一看freemarker的代码,了解一下为什么,对比对比。

JFinal

2018-03-26 15:30

@badouyuren 记得分享出来,或许可以改进 enjoy

badouyuren

2018-03-26 15:31

热门反馈

扫码入社