2017-08-17 12:43
@春风吹又生 只要是使用 jfinal 操作数据库的 API,connection 对象都会在 finally 块中被 close() 掉并被连接池回收,不必担心
多数据库很多年前就支持了:
1:对于 model 来说,调用其上的任何方法,会自动查找该 model 所对应的连接池,也可以通过 model.use(configName) 来临时切换连接池/数据库
2:对于 Db 来说,可以通过 Db.use(configName) 来切换,用的时候通常这样:
Db.use(configName).find(sql, paras)
建议先看看 jfinal 手册,里面都描述过,能节省很多时间
2017-08-17 12:15
@wu482525 目前不支持,建议写个 getBeans(...) 方法进行扩展,大致如下:
List list = new ArrayList();
for (int i=0; i<size; i++) {
Xxx xxx = getBean(Xxx.class, "beanName[ " + i + "]");
list.add(xxx);
}
return list;
然后表单里面的 name 做成如下的形式就可以了:
name="beanName[0].attrName"
name="beanName[0].otherField"
name="beanName[1].attrName"
name="beanName[1].otherField"
2017-08-16 23:20
@王晓辉 映射路由的时候碰到 actionKey 相同的情况会直接抛出异常,项目将无法启动,也就不存在选择哪个执行的问题了
actionKey 必须是唯一的
2017-08-16 17:02
@dear7575 用一个独立的表去存放 userName 与 configName 的关系,查询的时候用 Db + Record 模式:
1:用一个全局拦截器
2:拦截器中得到当前登录用户的 userName,这个就是传统的登录功能,不再多说
3:String configName = Db.queryString("select configName from configTable where userName=?", userName);
4:将这个 configName 放在当前拦截器的一个 static ThreadLocal threadLocal 对象中
5:通过引入一个中间的 MyBaseModel extends Model,覆盖一下父类的 _getConfig() 方法,从 threadLocal 中拿到 configName,然后直接:
return DbKit.getConfig(configName);
6:最终的 Model 继承一下这个 MyBaseModel,如果用了生成器生成过 BaseModel,可以让所有生成的 BaseModel 由继承 Model 改为继承 MyBaseModel,扩展一下 BseModelGenerator 中的 genClassDefine() 方法即可,极度容易
2017-08-16 16:47
@Sea-sea 一定要注意:没有parameter这一栏这的情况是数据根本没到服务端,是无论如何也得不到数据的,死死盯着前端去解决问题就好
你的 js 写得不规范,少了分号 ;
2017-08-16 16:37
@Sea-sea 看一下 jfinal action report 中的 parameter 这一栏
2017-08-16 16:07
@麻言 为了性能最大化,jfinal 里面的所有的控制层拦截器是在系统启动的时候,一次性建立好对应关系的,这个关系那好以后就存放在了 Action 这个对象里头,是不能改变的
但这仅仅是 jfinal 层面上的解决方案,你完全可以添加一个 jfinal 全局拦截器,然后在这个拦截器里面添加一个自己的拦截器架构,让这个架构可以动态配置就可以了
仿照一下 jfinal 的已有拦截器体系,在全局拦截器内部再搞一个拦截器体系出来就可以动态化了
重点在于对 Invocation 与 Interceptor 工作方式的理解决,可以看一下 InterceptorStack 这个类中的 intercept(...) 方法中的 new InvocationWrapper(inv, inters).invoke(); 这行代码,仿照着写一个很容易