jFinal model映射问题求解

xiaobaiwupen 发布于 2016/09/11 16:06
阅读 347
收藏 0

【领华为电脑包】容器化时代到来!跳转机分配问题终于“有救”了!>>>

@jfinal

你好,最近在用jfinal做小项目,发现一个问题不太明白麻烦解答一下。。。

在外部创建数据库字段,例如user_name,自动生成model中就会有userName的get/set

前端ftl中取值可以用user.user_name或者user.userName两种方式皆可。

但是如果利用控件提交,controller中通过getModel(User.class)方式来获取对象,如果页面中控件名称为user.user_name那没问题,但是如果控件名称为user.userName就会报错找不到userName属性,这是为什么呢?这样许多名称需要用下划线来命名,是不是跟java几乎约定俗成的驼峰命名方式有冲突呢?

加载中
0
JFinal
JFinal

     getModel 在获取数据时,是根据数据表中的字段名来的,而字段名为 "user_name" 这种带下划线的,所以 getModel需要使用 "user_name",。

     而 ftl 取值的时候,是调用的 model.getter 方法,getter 方法是遵守了驼峰命名的。楼主所说的flt 使用 user_name与userName 都可以,这个应该是不正确的,默认仍然是使用的 getter 方法

    解决方案是将 getModel 改为 getBean,页面仍然统一使用 "userName" 这种风格,因为 getBean 是根据 setter 方法来操作的,而非表字段名

   前面说的大前提是 jfinal 2.2 版本,此版本下才有 getBean 以及 model 可生成 getter、setter。终极解决方案是让数据表字段名也使用驼峰命名,这样就至始至终都不需要知道这件事了。jfinal 社区驼峰命名字段已经好几年了,非常之爽

x
xiaobaiwupen
flt 使用 user_name与userName 都可以这个是经过测试的,都能正常取到值啊。。调用get方法说明正确的是用驼峰方式取值,可是经过测试,下划线方式例如user.user_name也能取到正确的值 这是为什么呢?
0
x
xiaobaiwupen

引用来自“JFinal”的评论

     getModel 在获取数据时,是根据数据表中的字段名来的,而字段名为 "user_name" 这种带下划线的,所以 getModel需要使用 "user_name",。

     而 ftl 取值的时候,是调用的 model.getter 方法,getter 方法是遵守了驼峰命名的。楼主所说的flt 使用 user_name与userName 都可以,这个应该是不正确的,默认仍然是使用的 getter 方法

    解决方案是将 getModel 改为 getBean,页面仍然统一使用 "userName" 这种风格,因为 getBean 是根据 setter 方法来操作的,而非表字段名

   前面说的大前提是 jfinal 2.2 版本,此版本下才有 getBean 以及 model 可生成 getter、setter。终极解决方案是让数据表字段名也使用驼峰命名,这样就至始至终都不需要知道这件事了。jfinal 社区驼峰命名字段已经好几年了,非常之爽

flt 使用 user_name与userName 都可以这个是经过测试的,都能正常取到值啊。。调用get方法说明正确的是用驼峰方式取值,可是经过测试,下划线方式例如user.user_name也能取到正确的值 这是为什么呢?
x
xiaobaiwupen
回复 @JFinal : 是这样,例如user,后台是返回setArrt("user",user) 前台用user.userName,就会调用baseUser中的get,如果用user.user_name就会直接取到值。断点调试setArrt("user",user)返回的user中已经包含了user_name属性,所以可以直接获取到
JFinal
JFinal
回复 @xiaobaiwupen : 取值是根据是否为驼峰动态调整的,那么,提供给页面取值的数据是完全相同的形式么? 例如,是不是有的给的 json ,有的给的是普通的 setAttr(k, v) 传过去的?
x
xiaobaiwupen
回复 @JFinal : 经测试,驼峰方式取值,是通过调用get/set方法;下划线方式取值,是直接从controller返回的对象中获取的属性值,类似直接获取json数据,两种方式都能取值且值完全一致,也就是说取值渠道不同但是取到的值正确。造成这种情况正常么?这个问题需要怎么解决?或者说哪种方式更加符合最初设计的初衷?求波总指点
JFinal
JFinal
你自己扩展过这个功能? 理论上来说 ftl 在同一时刻只支持一种方式取值。建议你在 model 的 get(String) 以及 getXxx(String) 方法中设置一个断点,看到底是在调用的哪个方法
返回顶部
顶部