这一年多以年来工作繁忙,上一次发版还是去年一月份的事了,这次趁着五一长假,发布 5.0.0 版,纪念一下 jfinal 开源十周年。
5.0.0 版本中较为重要的功能来源于公司库存管理的现实需求,该项目采用前后分离开发模式,前后端 json 交互产生了 json 注入 action 方法参数的需求。
开启 json 解析配置可自动解析 json 数据并注入 action 形参:
me.setResolveJsonRequest(true);
假定请求 json 格式如下:
{
"name": "信息论",
"publisher": "清华出版社"
}
在 action 中的接受方式如下:
public void search(String name, String publisher) {
renderJson("msg", "接收到参数:" + name + "," + publisher);
}
对象类型必然也是支持的:
{
"book": {
"name": "信息论",
"publisher": "清华出版社"
}
}
在 action 中的接受方式如下:
public void search(Book book) {
renderJson("msg", "接收到参数:" + book.getName() + "," + book.getPublisher());
}
另一个比较重要的功能是 #para 指令添加了对 sql like、in 子句的支持,大致用法如下:
### 一般用法,第二个参数传入 "like"、"in" 参数即可
select * from t title like #para(title, "like")
select * from t title like #para(title, "in")
### like 类型第一个参数支持 int 类型
select * from t title like #para(0, "like")
### like 支持左侧与右侧百分号用法
select * from t title like #para(title, "%like")
select * from t title like #para(title, "like%")
### 警告:对于 in 子句,如果 #para 第一个参数是 int 型,并且 java 代码针对 Object... 参数传入的是数组
select * from t id in #para(0, "in")
### 那么 java 代码中要将 Object... 处的参数强制转成 Object,否则参数传递不正确
Integer[] idArray = {1, 2, 3};
Db.template("findByIdArray", (Object)idArray).find();
该功能在没有引入新指令的情况下,通过扩展现有 #para 指令实现,简洁、学习成本低。
再一个实用功能是 enjoy 引擎添加了 optional chain 操作符,用法如下:
# 当 article 为 null 时不对 title 进行取值,而是直接返回 null
article?.title
# 可用于方法调用
article?.getTitle()
# 可级联操作
page?.list?.size()
# 可用在方法调回之后,以下代码在 getList() 返回 null 时可避免抛出异常
page?.getList()?.size()
由于 enjoy 是极简设计,实现此功能只用了 30 行代码。该功能一开始我是拒绝的,用上以后,嗯,挺香!
再一个比较贴心的功能是 Db.update(...)、Db.batchUpdate(...) 支持 modifyFlag 机制,仅更新修改过的字段,该功能以前只在 Model 中被支持。
由于 jfinal 已开源十年,诞生十一年,已经非常完善,所以需要新增、改进的功能已经非常之少,除了上面较为实用的功能外,其它细致打磨可下载 changelog 进行查看:
时光飞逝,至简永恒,jfinal 开源十周年之际祝你 bug 少头发多,也希望 jfinal 在下个十年里继续陪伴着你!
https://gitee.com/Tencent/APIJSON
@jpress 啥时候跟着升级呀
前端尽量使用标准的 html5 + css3。
不过,我不太认可文中所说的几个思路:
1.自动解析 json 数据并注入 action 形参, 这个我个人觉得不太有必要。
首先,action 这个词,应该是 apache struct 提出来的吧。我更喜欢用 request/response 这种 http 协议自身的词,java/c# web 通用。
2. SQL 调用方面,java 使用 jdbc prepared statement, C# 使用 ado.net , 这个已经封装得很好了。这种 #para 指令 ,在我看来有些多余。至少,如果我所用的技术包 apache dbutils 中有这种功能、我也会视而不见。
3. enjoy 引擎添加了 optional chain 操作符 ----- 模板引擎的功能,尽量简单吧。我更倾向于将业务逻辑放在纯 java 代码中。