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 方法并不会损失性能,建议采用第一种方法

2020-03-02 17:10

不会报

如果是 int、long 等基本数值类型,注意接收变量必须是 Integer、Long 型,例如:
Integer amount = record.getInt("amount");

如果用 int amount 接收在值为 null 时就会报异常了,当然,这个问题只与 java 规范有关,与 jfinal 无关

2020-03-02 12:31

参考文档:
https://jfinal.com/doc/3-3

或者将带有参数的 action 方法用 @NotAction 注解掉

2020-03-01 22:25

通过扩展 #myRender 指令使用动态的 layout,这种用法在需要动态切换布局的项目中十分美妙

博主的分享十分简洁有力,方案多种多样,扩展指令的方式最为美妙,谢谢分享,点赞 + 收藏

2020-03-01 22:21

用拦截器可以实现各种定制的 validate 功能,博主的分享对于前后分离的项目十分友好

早期的 jfinal 版本对前后分离的 validate 支持不太好,所以高版本的 jfinal 提供了相关 API,在本站 jfinal.com 中的一个用法如下:

/**
* ajax 登录参数验证
*/
public class LoginValidator extends Validator {

protected void validate(Controller c) {
setShortCircuit(true);

setRet(Ret.fail()); // Ret.fail() 将设置 state : "fail" 值

validateRequired("userName", "msg", "邮箱不能为空");
validateEmail("userName", "msg", "邮箱格式不正确");

validateRequired("password", "msg", "密码不能为空");
validateCaptcha("captcha", "msg", "验证码不正确");
}

protected void handleError(Controller c) {
// getRet() 与 setRet(...) 配合使用
c.renderJson(getRet());
}
}

以上的核心在于 validate 中的 setRet(Ret.fail()) 以及 handleError 中的 c.renderJson(getRet()),这样处理以后的好处是对前后分离也一并支持了,controller 中的 renderJson(Ret) 与 validate 中的 c.renderJson(Ret) 实现了统一