Beetl模板的一个BUG 在配合Groovy的时候发现的.
@闲.大赋 上周在用groovy配合nutz写测试代码时发现一个Bug 直接上代码
Configuration cfg = Configuration.defaultConfiguration(); ResourceLoader resourceLoader = new FileResourceLoader("e:\"); GroupTemplate gt = new GroupTemplate(resourceLoader, cfg); //循环模拟nutz的BeetlView的输出逻辑,一般情况下第1次正常 后面的报错 for (int i = 0; i < 5; i++) { Template t = gt.getTemplate("test.html"); Map map=new LinkedHashMap();//groovy 默认的MAP是这个.HashMap就没有问题.. List ls=new ArrayList(); ls.add(new Point(1,2)); ls.add(new Point(2,3)); map.put("ls", ls); map.put("p",new Point(4,5)); t.binding("obj",map); t.renderTo(System.out); }test.html
${obj.p.x} <% for (point in obj.ls){%> ${point.x} <%}%>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
beetl2 的api文档我将在正式版推出的时候推出,请关注
嗯,提交了 https://github.com/nutzam/nutz/issues/660
需要补全文档
原来是这样子..文档上没有的东西,除了看源码剩下就是问Wendal了..m(-_-m)~
整个模板的变量都在obj里,因为nutz的action方法把返回的对象放到obj里,需要返回多个变量的时候我都是用map的. @wendal有什么好的建议没有??
@Wendal
回复
我怎么觉得就有binding(Map obj) 就可以了
回复
看了一下 有个bind(name,value,dynamic)接口貌似和direct dynamic varName 重复了..二选一的话我也觉得只保留bind(Map)就行..
感谢即时的回复 第2,3种比较靠谱,第一种方法不太适合nutz.. 再详细问一下 第2,3中方法 哪种性能损失更大?
错误原因是因为binding的时候,map里的类型其实是动态的,Beetl的引擎默认认为类型是一致的。目前看来,有三种方式解决:
1 分别赋值,t.binding("ls",ls);t.binding("p",p);
2 采用类型申明,表示它是动态的,比如在模板里,采用如下俩种方式
directive dynamic obj;
%>
3 采用普通引擎 就是配置ENGINE=org.beetl.core.engine.DefaultTemplateEngine