2020-03-04 21:08

如果生成的静态页面只需要在不存在时生成,需要加 if 判断,否则每次访问这个 index() action 时都要生成一次了

当然,如果这个 action 只是作为生成静态文件触发机制是没问题的

还有个改进建议,Template 内有支持 String fileName 与 File file 的方法,所以可以去掉 FileWriter 改为下面的用法:
template.render(null, "xxx.html");

也可以这么用:
template.render(null, new File("xxx.html"));

上面两种方式的优点除了省代码以外,还无需关心 fileWriter.close() 这种处理

谢谢分享

2020-03-04 16:29

@becklu jfinal undertow 下开发有详细的文档:
https://jfinal.com/doc/1-2

2020-03-04 16:28

这个暂时没想好怎么加

2020-03-04 16:27

@jounzhang 现在是目录 + ajax 处理过的,用户体验已经与两年进步很多了

2020-03-04 16:27

@jounzhang 最后,再结合 #include 指令,按模块拆分的 sql 文件可以再整合到一起,当然,也可以多次调用 arp.addSqlTemplate 来添加,不需要 #include

2020-03-04 16:26

@jounzhang 直接在sql中使用aaa.bbb.ccc.ddd来标识sql 是一个既巧妙,又很简单有效的方法,超赞

这就好比 jfinal 路由中的 controllerKey 中可以包含 "/" 字符一样,虽然明面上是没有支持 namespace,但在实质上也支持了 namespace

2020-03-04 16:24

@jounzhang 计划上一个 Db.txInNewThread(...) @passion

2020-03-04 15:53

Db.txOnNewThread( ...) 行不行?

2020-03-04 15:19

此外, 建议使用 jfinal-undertow 进行开发,让开发、打包、部署 完全一体化,打包即部署,多爽

2020-03-04 15:19

@becklu 已在文档中添加, 感谢反馈:
https://jfinal.com/doc/1-6

2020-03-04 13:51

这个肯定跟 jfinal 无关了,我对前端也不熟,找找前端的知识

2020-03-04 13:51

Db 中的 API 主要有两大类, 一类是 find 系列, 一类是 query 系列

find 系返回的数据会被封装成 Record 对象,query 系返回的数据是原样返回,不做封装

Db.query 一般直接使用 queryLong、queryInt、queryStr 这类方法,可以得到确切的类型

2020-03-02 22:38

@sliver 对于拥有非常多 post 请求,也就是添加、更新请求的项目可能要定义很多 Validator

但一般来说提交的数据结构是有规律的,或者说是有限的,所以,你可以定义多个通用的 Validator ,在使用的时候再灵活去组合,例如:
@Before( AaaValicator.class, BbbValidator.class, CccValidator.class)
public void action() {
...
}

还有一种办法是在 Validator 方法中多加些 if 分支,或建立一些通用的抽象,这样也可以让一个 Validator 满足多个 action


最后,有很多项目是读多写少的,例如 jfinal.com ,而一般只有写数据的 action 才需要 Validator。 所以一般情况用 Validator 还是可以接受的

2020-03-02 22:34

jfinal club 中有实际的例子,在 layout.html 中调用时添加一个问号,例如:
#@css?()

那么在 css() 被调用的时候,被定义则被调用,否则直接跳过

2020-03-02 19:51

最快最简单的办法是通过扩展 ISource , 对其 getContent() 返回的数据用正则表达式先进行一次 replace , 将 ${} 换成 #()

当然,还可以改改代码,对 com.jfinal.template.stat.Lexer.java 中的相关扫描方法进行改造

由于 enjoy 会对 sql 模板进行缓存,所以用前面的第一种 replace 方法并不会损失性能,建议采用第一种方法