2017-06-12 13:22
这个问题与 jfinal 唯一有关联的地方在下面这行代码:
Db.update(....)
而这行代码 jfinal 仅仅是转头扔给 JDBC 执行了而已,所以不可能是 jfinal 的 bug。很可能是由于 rtime 这个变量生成有问题,也可能是 updateRtime() 这个 action 被调用过多次
rtime 这个字段如果是 datetime 类型,建议直接注入 java.util.Date 类型的对象,不要注入 String 对象,使用 joda time 这样的第三方工具很方便生成相对于当前日期的时间对象
如果界面是一个按钮来触发调用 updateRtime(0 这个 action,那么连续快速点击这个按钮很可能会调用多次,防止这种情况的发生,你可以拿到本页面“发送”按钮相关的 js 代码来用一用
2017-06-12 11:16
@netwild fastjson 会自动识别你的所有 getter 方法,如果你希望大多数情况是这种行为,也可以多种 json 实现混合使用,例如上面的情况你可以使用:
renderJson(JFinalJson.getJson().toJson(model));
2017-06-12 10:36
@Rocky 必然有办法,你用一个 YourHandler 接管请求,不走 action,然后通过 request.setAttribute(...) 传递,再这样:
RenderManager.me().getEngine().getTemplate(....).render(...) 即可
2017-06-11 16:30
使用继承的方式扩展一下QrCodeRender 这个类,在 render() 方法里面将 Writer 参数改为一个 FileWriter 将二维码内容写入文件即可,大致代码示意如下:
public class MyQrCodeRender extends QrCodeRender {
private String saveFile;
public MyQrCodeRender(String saveFile) {
this.saveFile = saveFile;
}
public void render() {
// 这里只需要将 Writer 改为 FileWriter
Writer writer = new FileWriter(myPath + saveFile);
// 这里是原有的代码不用动
}
}
在使用的时候,可以这样:
render(new MyQrCodeRender("qr_code.png"))
关键点在于 Writer 对象指向一个文件
2017-06-11 16:24
@chenwang 你的代码中自行获取了 Connection 对象:
Connection conn = DbKit.getConfig().getConnection();
所以,需要对 conn 对象自行关闭一下,jfinal 之下调用存储过程的正确姿势是:
Db.execute(new ICallback() {
Object call(Connection conn) throws SQLException {
// 这里是你的存储过程代码,conn 用完无需关闭
}
});
使用 ICallback 调用存储过程,jfinal 会提供一个 Connection 对象给你,用完不需要关闭,由 jfinal 来关闭
2017-06-09 15:38
@salon 建议将 freemarker 切换到 jfinal template engine,非常顺滑