2018-01-24 09:49

@简单代码 嗯,很多工具 是根据业务走,才能体会到它的好处

2018-01-23 22:32

Db.tx() 源码搬过来,我们一起来瞅瞅


/**
* Execute transaction.
* @param config the Config object
* @param transactionLevel the transaction level
* @param atom the atom operation
* @return true if transaction executing succeed otherwise false
*/
boolean tx(Config config, int transactionLevel, IAtom atom) {
Connection conn = config.getThreadLocalConnection();
if (conn != null) { // Nested transaction support
try {
if (conn.getTransactionIsolation() < transactionLevel)
conn.setTransactionIsolation(transactionLevel);
boolean result = atom.run();
if (result)
return true;
throw new NestedTransactionHelpException("Notice the outer transaction that the nested transaction return false"); // important:can not return false
}
catch (SQLException e) {
throw new ActiveRecordException(e);
}
}

Boolean autoCommit = null;
try {
conn = config.getConnection();
autoCommit = conn.getAutoCommit();
config.setThreadLocalConnection(conn);
conn.setTransactionIsolation(transactionLevel);
conn.setAutoCommit(false);
boolean result = atom.run();
if (result)
conn.commit();
else
conn.rollback();
return result;
} catch (NestedTransactionHelpException e) {
if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}
LogKit.logNothing(e);
return false;
} catch (Throwable t) {
if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}
throw t instanceof RuntimeException ? (RuntimeException)t : new ActiveRecordException(t);
} finally {
try {
if (conn != null) {
if (autoCommit != null)
conn.setAutoCommit(autoCommit);
conn.close();
}
} catch (Throwable t) {
LogKit.error(t.getMessage(), t); // can not throw exception here, otherwise the more important exception in previous catch block can not be thrown
} finally {
config.removeThreadLocalConnection(); // prevent memory leak
}
}
}

2018-01-23 22:27

Db.tx() 感觉也挺棒的, 个人感觉比 Tx.clsss 好用。。。


boolean tx = Db.tx(new IAtom() {

@Override
public boolean run() throws SQLException {
try {
// 处理业务
return true;
} catch (Exception e) {
log.error("xxx失败", e);
return false;
}
}
});

2018-01-23 22:09

如果想在其他地方让 Tx.clsss 起作用的话, 需要使用 Duang.duang()、Enhancer.enhance() 了, 详见手册:

2018-01-23 17:34

23333, 挤着了。。 处女座的说看了难受。。
借楼:
缓存是怎么回事?

2018-01-23 16:16

.txt 类型的


#for(record : recordList)
----------#(for.count)START----------
学生=#(record.userName)
班级=#(record.className)
课程=#(record.courseName)
教师=#(record.teacherName)
教室=#(record.classRoomName)
预约时间=#date(record.createTime, "yyyy-MM-dd HH:mm")
状态=#(record.type)
请假备注=#(record.remark)
签到情况=#(record.sign)
签到时间=#date(record.signTime")
----------#(for.count)END----------
#end

2018-01-23 09:47

@三圣乡吴彦祖 可以的,文件后缀名叫xx.csv就可以了, 这个分享只是做一个示例,可以导出任何以模版渲染的文本。

就xls与csv相比,做复杂的表头,是一件很麻烦的事情,而且Office是可以把表格文件另存为“.html”的, 这个时候,直接使用这个html当作模版文件,进行数据动态化就可以了。

当然实现这个功能的软件有很多,只是觉得这个学习成本低比较易用。

就我自己使用来说,在数据准备好的情况下,使用这个做导出不要10分钟就完事了,而POI怎么搞也得几个点了,而且做调试预览,这个模版本身就是html, 所以render("xxx.html");浏览器直接请求就能立马看见结果了

2018-01-18 21:43

不用猜了, 肯定是 这个问题:
JFinal 部署在 Tomcat 下推荐方法

2018-01-18 13:55

@macaque 是的, 只要下载下来的时候用Excel打开(会有安全提示非常的不爽),再按保存的时候会提示这个文件是只读文件的,需要另存为,这个时候Excel就保存为真的xls文件了

2018-01-18 11:53

@macaque 是的, 只是下了个html后缀为 .xls 的文件,
这个html的格式是从Excel中导出来,套用的, 所以兼容性,还可以,都能打开。
因为很多时候只是想导出数据,而不是非得弄个真的XLS文件,所以这个比POI导出XLS方便些

2018-01-12 20:11

@tosur 建议读下里面的源码, 很简洁,没有多少代码量,绝对让你收益颇多

2018-01-07 11:49

@懒猫 js模板 还可以独立成文件.js,给它连接进来也不受影响的