关于Controller继承封装的问题

请问大侠,Jfinal的Controller可以继承进一步封装么?因为Controller的init不能继承,导致无法封装自己的Controller层,用构造方法,但构造方法是在init之前执行,请问有何优雅的方案么?

评论区

JFinal

2017-03-18 15:32

用拦截器配合一下就可以了,拦截器可以在 action 调用的前后置入你自己想要的功能

cleverbug

2017-03-18 15:52

@JFinal 我是要在Controller初始化的时候初始化一些后面经常需要用到的对象和参数,用拦截器拦截实现好像不太合适的感觉?

杜福忠

2017-03-18 22:55

肯定是用拦截器合适啊! 你那个继承然后加些成员变量才不好, 都强绑定了! 拦截器直接把需要的参数set到需呀的地方, 需要和不需要就@下, 多方便啊

cleverbug

2017-03-19 10:57

@杜福忠 嗯嗯,谢谢,有道理,从统一性和封装角度来说在我这项目里面拦截器显得不是很优雅,但从解耦角度来说,那是肯定拦截器更好些,就用拦截器了,不过很多公司可能需要在Jfinal基础上面再封装一层,作为公司体系的框架,从这个角度来说还是希望有更多选择性更好,支持你们

JFinal

2017-03-19 17:24

@cleverbug Controll.init 这个方法目前确实不能被扩展,init() 方法中有 HttpServletRequest request, HttpServletResponse response, String urlPara 这三个参数,如果是希望再干预一下这三个参数,可以通过 setHttpServletRequest、setHttpServletResponse、setUrlPara 三这个方法来做到

对于 init() 方法的开放,在未来会考虑,只是当前对这个方法开放的需求只被提出过一次,可能不是很强烈,如果未来再有一两个提出 init 开放性的需求,会考虑扩展

JFinal

2017-03-19 17:25

@cleverbug 希望你能针对这个需求再谈一下细节,好深入去考虑是不是要改进这里

cleverbug

2017-03-22 10:33

@JFinal 可能是习惯不同吧,另外也许是刚刚开始用Jfinal,还不熟悉,通常项目开发的时候在框架层和应用层之间封装一层用于项目特性的封装,或者也是和框架层之间的缓冲,将来项目的业务逻辑模块越来越多越来越复杂的时候,如果框架层升级或变更某些项目的时候封装的缓冲层可以有很大的余地进行调整,就Jfinal来说,默认继承的Controller如果要封装一层BaseController给整个项目或给项目的每个大模块封装一个底层控制器,初始化部分就只能靠构造器,init不能扩展,构造器里面扩展的时候request和response等这些基础控件还没注入,所以封装或扩展功能(主要是初始化的时候)会受到比较大的限制。当然用拦截器可以实现,但如果项目比较大模块比较多,拦截器里面会比较杂乱,显得像外挂一样,没有整体感,或许是个人习惯不同吧,相互探讨,谢谢你们的努力带给我们的方便

JFinal

2017-03-22 12:26

@cleverbug 先直接改源码试用下,然后反馈给我是不是好用,后续版本会考虑改进这里,要改进只需要在 init 上添加一个 protected 即可

热门反馈

扫码入社