你好,最近在用jfinal做小项目,发现一个问题不太明白麻烦解答一下。。。
在外部创建数据库字段,例如user_name,自动生成model中就会有userName的get/set
前端ftl中取值可以用user.user_name或者user.userName两种方式皆可。
但是如果利用控件提交,controller中通过getModel(User.class)方式来获取对象,如果页面中控件名称为user.user_name那没问题,但是如果控件名称为user.userName就会报错找不到userName属性,这是为什么呢?这样许多名称需要用下划线来命名,是不是跟java几乎约定俗成的驼峰命名方式有冲突呢?
getModel在获取数据时,是根据数据表中的字段名来的,而字段名为"user_name"这种带下划线的,所以getModel需要使用"user_name",。
而ftl取值的时候,是调用的model.getter方法,getter方法是遵守了驼峰命名的。楼主所说的flt使用user_name与userName都可以,这个应该是不正确的,默认仍然是使用的getter方法
解决方案是将getModel改为getBean,页面仍然统一使用"userName"这种风格,因为getBean是根据setter方法来操作的,而非表字段名
前面说的大前提是jfinal2.2版本,此版本下才有getBean以及model可生成getter、setter。终极解决方案是让数据表字段名也使用驼峰命名,这样就至始至终都不需要知道这件事了。jfinal社区驼峰命名字段已经好几年了,非常之爽
flt使用user_name与userName都可以这个是经过测试的,都能正常取到值啊。。调用get方法说明正确的是用驼峰方式取值,可是经过测试,下划线方式例如user.user_name也能取到正确的值这是为什么呢?getModel在获取数据时,是根据数据表中的字段名来的,而字段名为"user_name"这种带下划线的,所以getModel需要使用"user_name",。
而ftl取值的时候,是调用的model.getter方法,getter方法是遵守了驼峰命名的。楼主所说的flt使用user_name与userName都可以,这个应该是不正确的,默认仍然是使用的getter方法
解决方案是将getModel改为getBean,页面仍然统一使用"userName"这种风格,因为getBean是根据setter方法来操作的,而非表字段名
前面说的大前提是jfinal2.2版本,此版本下才有getBean以及model可生成getter、setter。终极解决方案是让数据表字段名也使用驼峰命名,这样就至始至终都不需要知道这件事了。jfinal社区驼峰命名字段已经好几年了,非常之爽
回复 @JFinal:是这样,例如user,后台是返回setArrt("user",user)前台用user.userName,就会调用baseUser中的get,如果用user.user_name就会直接取到值。断点调试setArrt("user",user)返回的user中已经包含了user_name属性,所以可以直接获取到回复 @xiaobaiwupen:取值是根据是否为驼峰动态调整的,那么,提供给页面取值的数据是完全相同的形式么?例如,是不是有的给的json,有的给的是普通的setAttr(k,v)传过去的?回复 @JFinal:经测试,驼峰方式取值,是通过调用get/set方法;下划线方式取值,是直接从controller返回的对象中获取的属性值,类似直接获取json数据,两种方式都能取值且值完全一致,也就是说取值渠道不同但是取到的值正确。造成这种情况正常么?这个问题需要怎么解决?或者说哪种方式更加符合最初设计的初衷?求波总指点你自己扩展过这个功能?理论上来说ftl在同一时刻只支持一种方式取值。建议你在model的get(String)以及getXxx(String)方法中设置一个断点,看到底是在调用的哪个方法版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。