2018-09-05 10:56

@小智zaki Db 是不支持的,因为要考虑线程安全问题,多个线程在共享使用数据源,如果某一个线程可以切换全局的这个默认数据源,会影响到其它线程

简单多,默认数据源只能有一个,默认值相当于一个约定不能变来变去

如果默认值确实不能满足需求,不能成为默认值,那么在启动时指定别的数据源成为默认即可

2018-09-05 10:24

@guoshixioashuai 如果分页碰到错误,重点看一下这一章节最后部分的常见问题解决:
http://www.jfinal.com/doc/5-6

常见问题解决已经例出了大家最常碰到的两个问题

2018-09-05 10:23

@ppupup 使用 enjoy 已有的模板函数就能很容易实现 MenuDirective 的功能了,直接看 enjoy 文档就可以很轻松实现

2018-09-05 10:20

@flash866 可能是 jdbcUrl 还不支持 utf8mb4 这个写法,也可能是你的 JDBC jar 包的版本太低了,毕竟 utf8mb4 是高版本的 mysql 才开始支持的

多做尝试、多调整,在 jdbcUrl 中实在不能用 utf8mb4 也是没有关系的,这个不配置默认就会按 mysql 服务端的配置走

mysql 服务端的配置文件中默认是指定了 server 端与 client 端的字符集的

2018-09-05 10:16

如果想在 spring 下面做点扩展,先绕个十万八千里,看懂它的代码再开始写代码,黄花菜都凉了

jfinal 的 enjoy 引擎中做了支持 spring 的 view 的括展,扩展它的 AbstractTemplateView,先是有七层继承关系,再来六个接口实现,光是看清它里面的各种依赖、协同关系就得费很多时间,更别说扩展了

这还不算,扩展 view 还得同时扩展 AbstractTemplateViewResolver,以来了六层继承关系和五个接口实现。这个 AbstractTemplateView、AbstractTemplateViewResolver 的设计者一定是脑子进屎了

2018-09-05 10:08

@fansunion jfinal 几乎所有功能都留了扩展的口子,而且扩展起来极其容易

扩展的方式也很多,例如你上面那个 json 扩展的需求,你还可以通过引入一个 BaseController 继承 Controller,在其中覆盖父类的 renderJson 方法,然后做个自己的 MyJsonRender,最后这样:
public void renderJson(..) {
this.render = new MyRender(...);
}

或者不引入 BaseController 也可以,像下面这么调用就好:
render(new MyJsonRender(...));

如果不想扩展的话,还可以直接使用 renderJson(String jsonString) 带 String参的这个,然后自己将 json 转完以后传进去

2018-09-04 23:29

@libofei 通过下面的代码:
String sessionId = getCookie(LoginService. sessionIdName);
然后通过 sessionId 这个值去数据库中的 session 表里面去查询就可以知道是哪个用户了

如果只是退出功能,不用查询,只需要做两步:
1:删除 session 表中相关数据:
Db.update("delete from session where id = ? ", 从cookie得到的sessionId 值)

2:删除 cookie 值:
removeCookie(LoginService. sessionIdName)

这段代码在 jfinal club 中的 LoginService 类的 logout(...) 方法中有:
public void logout(String sessionId) {
if (sessionId != null) {
CacheKit.remove(loginAccountCacheName, sessionId);
Session.dao.deleteById(sessionId);
}
}

配置合 LoginController 的 logout() 这个 action 看一下就一目了然了

2018-09-04 21:02

@錢勢惘導 异常表明你的代码是往 ehcache 中存入 DaoContainerFactory 这个对象了,而这个对象一般是在 Config 对象中,也就是说你很可能是向 ehcache 中存放 Config 对象了

至于怎么存的,很可能是间接存放,举个例了,假定你有一个类叫 Aaa,然后这个 Aaa 声明了一个属性 private Config config,这样在向 ehcache 中存放 Aaa 时就会间接存放 Confing , 从存间接存放 DaoContainerFactory

还有一个要注意的地方,看看你有没有向 session 中存放 Config 对象,由于 jfinal 支持 session 持久化到 ehcache ,所以存放在 session 中的数据也会间接被存放到 ehcache 中,当然,这种情况只是在重启的时候存取一下,不影响总体

2018-09-04 20:56

不使用分表再去查询看看结果,估计应该是分表造成的错误

再一个,配置一下 arp.setShowSql(true) 将分页用的 sql 输出到控制台,然后手动在 mysql 客户端执行一下看是不是正确的

jfinal 分页开发完很多年了,是不会有上述这类错误的,建议从别的地方寻找原因

2018-09-04 20:54

@libofei club 中没有使用 session, 是自己用数据库的 session 表代替了原本的 session 功能

这样做的好处是便于做集群,每个集群的结点共享这个数据库就很方便实现了集群

而你谈到的 session 是让每个 tomcat 去持有了 session 数据,不支持集群

2018-09-04 20:51

@zcazj cron 表达式的五部分分别为:分钟、小时、天、月、周。

在写 cron 表达式时有个技巧,就是注意一下 “每” 这个表述,当你说 “每” 的时候,就是在相应的位置上使用星号 "*"

例如,你想每天 1 点运行,那么潜台词就是:你想每周、每月、每天、一点钟、零秒运行

位置与 cron 表达式一致就是:零秒、一点钟、每天、每月、每周

继续翻译成 cront 表达式就是:0 1 * * *

碰到每就用星号,没有表述的潜台词部分也要翻译出来,如上例中的每周、每月、每天

2018-09-04 20:44

数据库那边要将数据库、数据表、数据表中的 varchar、text 这类字段改成 utf8mb4

如果是新创建的数据库,直接在建库的时候指定 utf8mb4,那么数据表、表中的字段就不用理了,因为这两个默认是跟着创建数据库时的字符集去走的

如果你的数据库现在已经是 utf8 ,但是要改成 utf8mb4,最好是去网上找找这方面的资料

个人建议重新创建一个指定为 utf8mb4 的数据库,然后用 mysql 的命令导入到新库里面去,导入的时候指定字符集,彻底解决一下问题

2018-09-04 20:41

这个直接改数据库那头就可以了,最后在用的时候,可以将 jdbcUrl 中的 utf8 改一下,例如:
jdbcUrl=jdbc:mysql://localhost/jfinal_club?characterEncoding=utf8

上面的 utf8 改成 utf8mb4

总的来说,就是要在数据库那边去改,不要折腾项目这头

2018-09-04 15:41

DaoContainerFactory 这个应该是处于 Config.java 中的一个属性,为啥要将这个字段 write 到缓存中去?

对于 Config 来说,缓存一个 String 足够了,通过 string 得到 Config 的代码:
Config config = Db.use(string);

2018-09-04 10:47

可以在 Service 层加注解,业务层事务的触发需要 Ehancer.enhance(...),jfinal 3.5 发布以后就不再需要了