2017-08-04 16:44

每一个请求过来的时候都是独立的 controller 对象,所以 companybh 是独立的,可以为其添加一个 static 修饰,但要注意线程安全问题

建议通过拦截器来解决,拦截器自动为这个属性赋值即可,至于为啥 jfinal 的 controller 不是单例的,这里有很详细的说明:
http://www.oschina.net/question/197668_221395

2017-08-04 16:21

在首页有一个 jfinal-all-3.1.zip 可以下载, redis 所用到的 jar 包在说明文件里面有说明

start() stop() 方法是系统启动与停止时调用的,如果你是在 configPlugin 中使用,则不需要处理, jfinal 会自动调用

2017-08-04 16:03

@dear7575 注意最新版本的 jfinal 的 Model 中有一个 protected Config _getConfig() 方法,这个方法是可以通过继承并覆盖,从而实现数据源切换的

简单来说,要在整上切换 model 的数据源,并且对开发者完全透明化,只需要做两点:
1:用一个全局拦截器 + ThreadLocal 将当前线程的 Config 绑定到当前线程
2:通过引入一个中间 MyModel extends Model 覆盖 _getConfig() 方法,并在这个方法中从全局拦截器中获取 ThreadLocal 中准备好的 Config 对象

而 Db.xxx(...) 系列方法的数据源自动化切换也大体可以用上面的方式,只需要将第 2 步改为以下的方式:
让 Db.xxx(...) 方法使用的 config 对象也参考上述方式进行切换

2017-08-04 15:52

@dear7575 ActionInvocation 是 jfinal 很老版本中的类名了,后来的版本早就是是 Invocation,建议升级到新版本

此外,参考我前面的说明尝试,拦截器的用法在手册中都有详细的说明,多多调试代码,实现你想要的功能是一定可以的

2017-08-04 15:43

这里再补充一点,对于 model 来说,要切换数据源,可以在拦截器里面弄一个 ThreadLocal 保存 config 对象

然后引入一个 MyBaseModel extends Model, 让你所有最终的 model 继承这个 MyBaseModel ,里头覆盖掉 _getConfig() 方法,利用 ThreadLocal 切到你想使用的 config 上去

2017-08-04 14:39

@dear7575 使用一个全局拦截器,关注一下 DbKit.getConfig() 出来的 Config 对象中有一个 setThreadLocalConnection(Connection ) 方法

用这个方法可以直接为当前线程提供一个 connection,那么后续的数据库操作都会直拦支使用这个 connnection 对象了

更进一步,参考一下 com.jfinal.plugin.activerecord.tx.Tx.java 这个源代码,里面有这种用法,大致分几步:
1:在拦截器中通过某种方式得知当前操作的用户身份,根据登录信息很容易知道
2:通过用户身份,得到该用户的 configName
3:通过 DbKit.getConfig(configName) 得到这个用户的 config 对象
4:通过 config.setThreadLocalConnection(config.getDataSource().getConnection()) 为当前线程设置上 connection 对象
5:调用 inv.invoke()
6:在 finally 块中调用 config.close(connection)

2017-08-04 13:28

jfinal 开发的项目是标准的 java web 项目,部署方式沿用你以前的经验就可以了

这里是我写的 tomcat 下的部署:https://my.oschina.net/jfinal/blog/353062

2017-08-04 13:27

@dear7575 jfinal 手册上有说明,还有例子代码,在本站首页可以下载到

2017-08-04 11:59

通常用 Db.use(configName) 去动态切换数据源

Model 所对应的数据源是确定的不需要动态切换,不过 Model 的数据源仍然是可以通过 model.use(configName) 临时进行切换的,也就是说为当前这个 model 对象切换数据源

2017-08-04 11:58

@godhellsing 我自己并没有这方面经验,这类功能都是小伙伴们自己扩展的

2017-08-04 11:57

@海哥 传参是不限制表达式的, 你可以为参数传入赋值表达式,这个从来都是支持的

楼主的代码是想在扩展指令中知道传入的参数名称是什么,而不是通过约定的方式限定参数名是什么

jfinal 3.2 已经添加了 Assign.getId() 方法,这样就可以在扩展指令中通过 assign.getId() 知道传入的形参名是啥了

2017-08-04 11:55

TableMeta 数量为零很可能是当前你使用的这个用户的权限不足,获取不到表名 getCataLog() 也是同样的道理

2017-08-04 11:54

@本王很饿 这段代码看上去没有什么问题,要看你的控制台抛了什么异常,多数是数据表字段对不对得上, sql 写没写对

2017-08-04 11:52

@极客 spring 的依赖注入是为了植入代理类,从而实现 aop 这样的功能,而 jfinal 可以在 controller 层以及 service 层实现 aop,所以就没有必要使用注入了,这是一个观念的转变,需要点适应的时间

2017-08-04 11:13

此外模板文件可以与项目一起打包在 jar 之中,用一下 Enjoy 3.2 的这个用法:
engine.setSourceFactory(new ClassPathSourceFactory())

这个配置可以让你的程序去 class path 与 jar 包之中去找模板文件,十分的爽