2017-08-17 22:46

在这方面有没有经验,没法帮到你,建议去 jfinal 群里问问小伙伴

2017-08-17 22:44

@yjjdick1990 redis 只支持 byte[] 与 String 两种数据类型的存放,但是 java 除了 byte、int、long、char、short、double、float 等基本类型以外,还支持 User、Account、Article 等等无限多的数据类型需要存放

那么 redis 就无法满足需求,只好将不能存放的类型转换成可以存放的类型,这个转换的操作就是序列化

2017-08-17 16:53

主要方向:显示页面时用 jfinal template engine 迭代出两个列表。当用户选择下拉列表时发一个 ajax 请求得到当前状态的数据再用 js 更新界面即可

如果数据量足够小,可以将所有数据一次性放在页面,在选择下拉列表时直接用 js 中存好的 json 数据

搜索一下 js 的二级联动代码,一搜一大把,jfinal 在后端提供数据就好

2017-08-17 16:14

目测是 default output folder 配置错误,或者 WebContent/WEB-INF/classes/app/ 目录下没有 AppConfig.class 文件

2017-08-17 15:54

最好的办法是在页面中判断一下终端类型,使用模板引擎的 if 分支,给不同的类型响应不同的内容即可

2017-08-17 14:13

@mrgaoang 调试跟踪到底层,看发生了什么

2017-08-17 13:56

多试试,一定可以的

2017-08-17 13:45

看控制台输出的 jfinal action report 的parameter 栏即可,数据根本没到后端而已

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:17

有好多方法:
1:Db.update("delete from xxx where id = ?", idValue);
2:new MyModel().setId(id).delete();
3:Db.delete("tableName", new Record().set("id", idValue));

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-17 11:32

@dear7575 根据不同的 dataBaseName 按照我前面的方案,去 return 不同的 Config 对象就可以了

每个 Config 都可以对就到不同的 dataBaseName, Config 中有很多构造方法,中有一个一个是 DataSource 参数,这个 DataSource 参数可以对应到不同的 jdbcUrl,也就是说可以对应到不同的 database

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 写得不规范,少了分号 ;