2019-11-08 15:18
贴主认为 "不用继承" 是属于轻量级框架的一个特征,这个肯定是误解
spring、struts 这类 web 框架的 controller 确实可以不用继承就可以实现,但是必然会在 action 中出现对于类似于 ActionContext、ActionSupporter 等等之类的组件的依赖
也就是说,侵入性只是换了一种方式,但是不可能完全消除
从根本上来说,你使用某个框架,就必然对其组件有所依赖,也就必然有侵入性,只是侵入的方式有所不同
那么我们所说的追求的少侵入性或者无侵入性到底是什么呢?
做好业务层,让业务层对框架无依赖,这个在侵入性方向的努力才是对的,业务层在未来可以拆分出来换到不同的 web 框架中使用
最后,退一步讲,极少情况会出现将 controller 中的代码迁移到另一个 web 框架中使用的情况,所以完全无侵入性其实没有什么意义
继承可以带来很多好处,试用一下 jfinal 的 controller 就会知道,一个简单的继承立即拥有了十分之多的可用方法,让开发变得非常便捷
2019-11-08 14:59
@xiaoxxin6140 @爱小乖 在使用 SessionInViewInterceptor 时再多传入一个 true 参数,例如:
me.add(new SessionInViewInterceptor(true));
传入 true 参数是让拦截器在获取不到 sesion 对象时,立即创建一个,进而这个 session 永远不为 null,进而 session.user 才不会抛出空指针异常
如果不传入这个 true 参数,那么使用的时候需要用双问号表达式,例如:
#if(session.user ?? !=null)
因为双问号表达式可以在 session 为 null 时避免空指针异常,双问号表达式的文档见这里:
https://www.jfinal.com/doc/6-3
2019-11-08 14:55
@简单代码 jfinal club 中的 JsoupFilter.java 已经解决过了,参考 jfinal club 中对于 JsoupFilter 的使用方法
简单来说就是按一定规则将恶意部分过滤掉
2019-11-08 14:50
@smileForLife 使用 return 返回模板需要用拦截器稍做点扩展,例如:
public MyInterceptor implements Interceptor {
public void intercept(Invocation inv) {
inv.invoke();
Object ret = int.getReturnValue();
if (ret instantceof String) {
inv.getController().render(ret.toString());
}
}
}
然后将这个拦截器配置为全局拦截器:
public void configInterceptor(Interceptors me) {
me.add(new MyInterceptor());
}
2019-11-08 13:49
注意对比 ArpTest1 与 ArpTest2 的 addMapping(...)
ArpTest1.addMapping("BAS_BRAND", "BRAND_CODE", BasBrand.class);
ArpTest2.addMapping("BAS_BRAND", "BRAND_CODE", BasBrand.class);
这两个 addMapping 映射了同一个 BasBrand.class,所以就会有这个异常
Model 在一个应用中是全局唯一的,多数据源的时候也只能映射一次,以前老版本虽然没做限制,但最终只有最后一次映射有效,前一次映射会被覆盖
2019-11-08 13:44
@leomj 使用 jfinal 的 Render 扩展出各种格式的响应数据极度便利,比扩展 spring 的 ViewResolver 简单 32 倍
享主的分享简单实用,必须赞