再次给Jfinal一点优化建议

bing_chuan 发布于 2013/08/16 16:17
阅读 1K+
收藏 1

用Jfianl做一个项目,不过遇到的麻烦事挺多的。可能是自己对jfinal还不是很熟悉。遇到不方便地方有

1:在使用oracle数据库,返回的JSON格式里面的KEY名称是大写的,我想统一小写这样看起来直观,有什么办法设一下是oracle数据库就自动转换小写。我现在是这样解决的,因为我使用fastJSON所以使用toLowerCase方法转换小写:

Page<Record> p=Db.paginate(getParaToInt("page"), getParaToInt("rows"), "select *", "from "+tableName,param);
  renderText(JsonKit.toJson(new DataGirdJson(p.getTotalRow(),p.getList()), 8).toLowerCase());

 

2:兼容IE的JSON做得不好,IE会自动下载,我觉得返回类型返回text类型就兼容多数浏览器了。我是这样解决的

renderText(JSON.toJSONString(obj));

 

3:oracle下面对Integer类型不支持出现转换异常,需要使用Number类进行转换,这样子如果这个框架一换数据库我觉得有点不雅观,最好是有一个配置设置是oracle的把bigdecimal类型自动转换Integer或者Long根据数据库类型自动转。

 

基本上是这样问题了吧,Jfinal确实很爽,如果能解决这些问题,那就更棒了。@Jfinal

加载中
1
iSea
iSea


第一点,@jfinal 更新log里好像提到过CaseInsensitiveContainerFactory,不知道是不是可以解决你的问题。

第二点,@jfinal 好像有个.forIE()解决问题。

第三点,没留意过相关问题。


0
Jieven
Jieven

小细节,自己加个壳子自己解决!

0
b
bing_chuan

引用来自“iSea”的答案


第一点,@jfinal 更新log里好像提到过CaseInsensitiveContainerFactory,不知道是不是可以解决你的问题。

第二点,@jfinal 好像有个.forIE()解决问题。

第三点,没留意过相关问题。


arp.setContainerFactory(new CaseInsensitiveContainerFactory());
这个早设了没用,如果你使用了不是JFinal自带的就不行了如

renderText(JsonKit.toJson(new DataGirdJson(p.getTotalRow(),p.getList()), 8).toLowerCase());

 

b
bing_chuan
回复 @iSea : 已经解决,确实加了true页面能正常了。
iSea
iSea
arp.setContainerFactory(new CaseInsensitiveContainerFactory(true)); 好像要写个true在里边吧
0
JFinal
JFinal

感谢楼主对 JFinal 的支持,楼主说的三个问题 JFinal 都有考虑:

1:arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));可以搞定。由于 Oracle默认会将字段名转成大写,所以 CaseInsensitiveContainerFactory也默认转成大写。

2:由于IE 不支持content type 为 application/json, 在 ajax 上传文件完成后返回 json时 IE 提示下载文件,所以这种情况只发生在ajax上传文件,此情况下使用render(new JsonRender(...).forIE())即可解决,其它情况下尽管使用renderJson系列方法。此问题本质是由IE不遵守w3c标准造成的。

3:JFinal ORM力求不改变 JDBC的行为,坚持极薄封装,如果附加一些转换行为,开发者需要多一层了解,JFinal 手册也需要有说明,所以还不如不处理得好。当然这个问题值得再深入考虑实际情况。

    JFinal 力求考虑每一个细节,作者有时回头看代码也可能不记得当时的考虑,要对目前的行为做改动需要回忆当时很深入的考虑。

JFinal
JFinal
回复 @bingsdd : Oralce 的 Integer 类型以前未发生过转换异常,调试一下用 Object obj = model.get(attr) 得到 obj 后看看 obj 的实际类型
b
bing_chuan
主要是想能提供插件的形容解决类型转换问题,我回去研究源码看看怎么能做到通用,企业应用有时牺牲一下性能还是愿意的。
b
bing_chuan
嗯嗯,主要是第三点这个我觉得很有必要花时间去兼容下。上面2点都没问题自己封装一下就能解决,第三个确实是心头的一个痛,软件框架核心做的是通用~
0
laizhiming
laizhiming

学习了

特别是评论

0
b
bing_chuan

引用来自“JFinal”的答案

感谢楼主对 JFinal 的支持,楼主说的三个问题 JFinal 都有考虑:

1:arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));可以搞定。由于 Oracle默认会将字段名转成大写,所以 CaseInsensitiveContainerFactory也默认转成大写。

2:由于IE 不支持content type 为 application/json, 在 ajax 上传文件完成后返回 json时 IE 提示下载文件,所以这种情况只发生在ajax上传文件,此情况下使用render(new JsonRender(...).forIE())即可解决,其它情况下尽管使用renderJson系列方法。此问题本质是由IE不遵守w3c标准造成的。

3:JFinal ORM力求不改变 JDBC的行为,坚持极薄封装,如果附加一些转换行为,开发者需要多一层了解,JFinal 手册也需要有说明,所以还不如不处理得好。当然这个问题值得再深入考虑实际情况。

    JFinal 力求考虑每一个细节,作者有时回头看代码也可能不记得当时的考虑,要对目前的行为做改动需要回忆当时很深入的考虑。

谢谢
0
大龄未婚男青年
大龄未婚男青年

现在DB 查询返回List<Record> result 时总觉得代码有点死板,只能通 RecordBuilder.build(rs); 返回,如果想在RecordBuilder.build(rs)时做点类型转换什么的时,不好扩展,是否可以在build 时觉点可以扩展的口呢

0
JFinal
JFinal

引用来自“大龄未婚男青年”的答案

现在DB 查询返回List<Record> result 时总觉得代码有点死板,只能通 RecordBuilder.build(rs); 返回,如果想在RecordBuilder.build(rs)时做点类型转换什么的时,不好扩展,是否可以在build 时觉点可以扩展的口呢

曾经考虑过,还没正式开始动那块代码
0
fir01
fir01
请问totalRow,这个值是怎么生成的? 能自己写抓totalRow,和pageSize的语句吗? 语句有点复杂,目前直接自动生成的sql抓的数据没去重
返回顶部
顶部