2017-12-13 22:18
@badouyuren 只要不是复杂 order by 就没事,用正则去除复杂 order by 性能会下降一个数量级,权衡后引入 paginateByFullSql
大部分 sql 的 order by 都能搞定,一般没事
2017-12-13 16:48
1:一开始是为了使用同样的 url 值,通过 GET、POST、PUT、DELETE 去请求不同的 action 方法,例如:
GET localhost/user/1 用于访问 UserController.detail() 方法
PUT localhost/user/1 用于访问 UserController.update() 方法
除了上面的 GET、PUT 这些以外,还有一些 DELETE、HEAD 之类的 对应到更多的 action 方法,但是 http 协议里头并不支持 DELETE 等请求类型,所以请求类型不够用,要完全实现,就需要引入隐藏表单域并用 POST 请求来辅助
上面的用法很鸡肋,所以 spring 在实战中并没有利用这个机制来制定 URL 规则。绝大部分情况仍然是用不同的 url 访问不同的 action,但 spring 已经忘记了来时的路,还在继续用着 GetMapping、PostMapping 这样原先为了别的目的而建立的规则
jfinal 则不同,是直接就跳过那些鸡肋设计,将请求类型动作直接放在 url 中,例如:
localhost/user/delete/1
localhost/user/update/1
此外,还有一个谈不上好处的功能,就是你的 GetMapping 注解过的 action 无法被 POST 请求访问到,仅是一个功能,实际用处从没人提出来过,估计是没有任何好处
2:用 Post 做所有请求,那么网页中的超链接就没法访问到这些 action 方法了,因为浏览器的在点击超链接时发起的是 GET 请求
3:jfinal 通过深入分析 rest 建议的 url 风格,以及 spring 的实践,认定是个鸡肋后,做出的最终设计,简洁、方便、性能高、学习成本低
2017-12-13 16:32
@阿普 已提交 issue: https://gitee.com/dreamlu/Easy4JFinal/issues/IGSOH
感谢你的反馈
2017-12-13 16:27
@leomj 没有主键的话, model.save()、model.update()、model.delete() 这些方法就不可能实现,前面这三个方法生成 sql 时,都是要依赖 id 生成 where 部分的,例如:
...... where id = ?
2017-12-13 12:07
再补充一个改源码的方案:
创建一个 com.jfinal.core 的包到你的项目中,然后将 jfinal 源码中的 Config.java 拷贝过来,改掉里头的次序
如果觉得这样不太好看,可以将这个包创在 src/main/resources 目录下面,这样在开发的时候一般是看不到的, jfinal 3.4 发布以后,再删掉这个改动就可以了
此外,不用改源码的方案,除了我前面介绍的以外,或许 @玛雅牛 也有一个,找一下作者:
https://my.oschina.net/myaniu
2017-12-13 12:06
还想到一个不用改源码的方案:
1:做一个 MyActionMapping extends ActionMapping,在里头覆盖掉 buildActionMapping() 方法,拿到自己想要的东西,然后调有 super.buildActionMapping()
2:再做一个 MyActionHandler extends ActionHandler,覆盖 init(...) 方法,在里头趁机将 ActionMapping 这个参数换成自己的 MyActionMapping
3:在 configHandler(Handlers me) 中配置一下即可:
me.setActionHandler(new MyActionHandler());
记得搞定后回来分享
2017-12-13 11:37
@懒猫 主要是当时没想到会有这个影响,jf 3.4 会想办法解决,已经有了初步的方案,尽可能做到可以定制 configPlugin 的次序
此外,我也希望得到你的应用场景,这样在做这个功能时候能掌握更多信息量,做得更好