2017-03-02 20:29

@Terely 一般情况下,model 中也没有什么 null 值,如果设计表的时候不允许字段值为 null 的话,这种情况就更少,退一步讲,如果有 null 值,这也没什么错,所以一直以来也没有人反馈过这个问题

站在我个人的角度来说,是这么做的:
1:所有 model 用生成器生成了 getter 、setter,这样可以支持 json 的反向序列化
2:model 的 getter、setter 方法中不放任何逻辑,只是属性的读与写而已,保障了 JFinalJson 与 Fastjson 对其转换时的一致性
3:使用me.setJsonFactory(new MixedJsonFactory()),这样可以支持 Record 转 json
4:数据表的字段名直接使用驼峰命名,在 Record 转 json 时的属性名与 model 转 json 保持一致

通过上面的做法,在实践中并没有碰到过类似于 null 值的问题。如果万一碰到了并且很纠结,还可以使用 model.removeNullValueAttrs() 一次性去除所有 null 值属性

2017-03-02 20:14

@wendell620 非常之好,这个贴子我收藏一下,后面有人碰到问题贴个 url 就打完收枪,感谢你的分享

2017-03-02 17:02

JMap.put 的手误已经改正并上传了新版本的 jfinal 手册,建议下载新版本

2017-03-02 17:00

至于表达式有哪些类型,看一下手册

2017-03-02 17:00

不仅是 #if 指令,所有指令的括号中都是表达式,不能是别的东东

2017-03-02 16:59

#if 指令的括号里面,只能是表达式,而不能是指令,所以改成类似于这样:
#if(pos.positionsName == session.position.positionName)

2017-03-02 16:48

@longhnbc 考虑以传参的形式来传递样式、html 等数据,如果这样做不划算,或许没有必要去封装,因为可重用性是封装的重要原因,而可重用性是基于有东西被重复的假设

当所有的东西都是动态的,相当于没啥在重复,也就没有必要封装了

2017-03-02 16:17

@gaurder 用自定义指令、sharedMethod 、sharedObject 三种扩展方式都可以很容易去解决,参考一下 #date 指令的实现方式

2017-03-02 16:14

@Terely 感谢你在解决问题后再回来分享

2017-03-02 16:13

这类功能用一下 template function:
#define channel_list(parent_id, channel_type)
...
#end

用的时候调用一下:
#@channel_list(...)

2017-03-02 16:08

find(getSql("findPrettyGirl"), 16, 23) 这行代码是在 model 中使用的范例,只有一个参数,但另一个参数就是该 model 中存放属性值的那个 map

所以,Model.getSql(...) 虽然只有一个参数,但第二个参数其实是自身的属性 map,而 Db.getSql(...) 由于与 model、record 是脱离的,所以必须要提供第二个参数

JMap.create("age",18).put("weight",50); 这行代码是手误,链式调用需要将 put 改为 set 才可以,感谢你的反馈,现已对该错误进行了改正

jfinal 手册新添加的 sql 管理部分是在春节前通宵赶出来的,有一些内容缺失,也有手误,再次感谢你的反馈

2017-03-02 12:38

@lyh061619 感谢回复

有异常一定会在控制台输出的,而且页面也会输出 404 或 500 错误,sql 语句也可以通过配置来输出。将异常输出在页面会让黑客有可乘之机,黑客可以有计划的去制造异常,然后通过页面的异常分析并得到系统的漏洞

当然,提供这个输出异常到页面的功能,也可以让开发者通过配置在生产环境之下关闭,但也难保有时会忘了关闭或者其它的失误

2017-03-02 12:34

既然都已经转换成了 json 了,直接这样就好: renderJson(JSON.toJSON(opt));

2017-03-02 12:33

jfinal 3.0 已然没有去掉 order by 了,你试试

2017-03-02 12:30

tomcat 下部署有很多的坑要跨过去,参考一下我的这篇博客:https://my.oschina.net/jfinal/blog/353062

本社区也是部署在 tomcat 之下,也用了 me.addSharedFunction(...) 完全没问题