2016-10-12 16:46

@合金来了 可能是 jdbc 无法将这种类型转成 java.sql.Timestamp,建议通过继承 BaseModelGenerator 来改造一下生成器

2016-10-12 16:43

Db.batch 系列的方法就是专做这个的,有 Db.batchSave(...)、Db.batchUpdate(...)、Db.batch(...)

2016-10-12 16:08

@xRhbN jfinal 没有对第三方有强制依赖,所以无需重新打包开箱即用,jfinal 自身才 300K 左右,自己打包基本没有意义

2016-10-12 16:06

单步调试一下

2016-10-12 16:06

先确定数据库是 timestamp 类型,然后 jdbc 才有可能转换成 java.sql.Timestamp 类型

2016-10-12 16:04

@nbjgl 前面不是说得很清楚了,避免调用 next.handle(...) 那么 jfinal 后续的组件就不会接手,使用 isHandled[0] = true; 那么 jetty/tomcat 就不会接手,你确定这两项你都做了?

2016-10-12 16:03

@kojz redis 应该可以设置,找下相关文档

2016-10-12 15:34

样式需再美观一下,例如字体、行高之类的

2016-10-12 15:34

解决方法不需要多说了吧,简单说就是自己处理了,就不要再往下转手了

2016-10-12 15:33

在 Handler 中首先,你要决定是不是要将这个请求传递下去,注意以下几点:
1:当你不去调用 next.handle(...) 时,该请求不会传递给 jfinal 的 ActionHandler
2:当你设置 isHandle[0] = true 后,该请求不会传递给 tomcat、jetty
3:即便是向下传递下去了,接手的组件也会根据情况决定是否自己要处理,例如 ActionHandler 只处理动态请求,对于 /img/abc.jpg 这样的图片请求不会处理,会再转手给 tomcat、jetty
4:这一路下来,不能多次调用 response.getWriter() 并将其关闭

所以,问题原因就很显然了,你自己的代码中有一个 req.getDispatcher(...).forward(...) 已经操作过 writer 关闭,但后续仍然让这个请求继续转手给了 jfinal 或者 jetty/tomcat,而后面接手的组件以为自己还需要处理这个请求,造成重复处理,出异常

2016-10-12 15:28

@kojz 哪怕你是一个 new RedisPlugin(...) 也是有连接池,在连接池中有存在多个连接,否则多线程并发的时候会等待资源

2016-10-12 11:30

@白银骑士 renderJson 是一定会向客户端发送数据的,收不到的原因通常不是服务端的问题,例如是不是网络不通,是不是客户端程序有问题等等

总之不用在服务端找原因,因为 renderJson(object) 这个方法用了五年了,极度可靠

2016-10-12 11:28

jfinal 的 paginate 没有支持这样复合的 order by 语句,解决办法极其简单,假定你使用的是 mysql 数据库:
public class MyDialect extends MySqlDialect {
public String replaceOrderBy(String sql) {
return sql;
}
}
上面的自定义 MyDialect 中覆盖掉了父类的 replaceOrderBy 语句,直接 return sql即可

然后再替换掉方言: arp.setDialect(new MyDialect()),jfinal 2.3 将会改进这里,可支持任意复杂的 order by

2016-10-12 11:24

在手机端查看一下收到的是什么数据,输出在控制台一下,这种情况应该是手机端的问题

2016-10-12 11:23

@kojz redis 的多个实例是指,你有多台服务器,每台服务器上安装一个 redis 服务,或者一台服务器上跑多个 reids 进程。前者是通过调整连接的 host 地址来连接多实例,后者则是通过不同的 port 连接,使用的时候,相当于 new RedisPlugin(...) 传入不同的 host 或不同的 port

另外一种在同一个 reids 实例中使用多个 RedisPlugin 的方式是,在创建 RedisPlugin 时, host 与 port 相同,但 int database 不同,就相当于使用同一个 redis 服务的不同 database

最后记住最重要一点,无论你使用上述哪种方式,多个 new RedisPlugin(...) 出来的对象对应着多个 cacheName,在使用的时候通过 Redis.use(cacheName) 进行指定