皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

JFinal 3.1 发布,没有繁琐、没有复杂,只有妙不可言

JFinal 3.1 针对 3.0 版推出的魔板引擎进行了深度打磨,例如魔板 parse 异常提示更加友好明确,消除指令嵌套时多出来的一个换行符,对于模板 isModified() 逻辑进行了重构,消除冗余代码,可读性更好。

除了对魔板引擎深度打磨之外,也不乏推出了一些极简实用的功能,匠心打磨的 JFinal 3.1 在这一个月的俱乐部内测时间里,小伙伴们的一致感言是:妙不可言!

1、sql 模板分页:没有 Handler、没有 Mapper、没有各种 Tag,只有妙不可言

JFinal 3.1 sql 管理模块,给小伙伴们带来极简的分页设计,只需要一条用于查询的 sql 便可极速打完收枪:

#sql("findGirl")
  select * from girl where age > #para(0)
#end

在 java 端的代码依然简洁到极致:

paginate(110, getSqlPara("findGirl"18));

传统 mybatis 这一类的sql 管理功能,为了实现分页还要额外做很多事情,例如,需要 Handler 或 Interceptor 扩展,需要Mapper、XML、annotation,又或者引入各种所谓的 Tag,不仅无聊,而且麻烦。

2、魔板函数:没有 macro、没有 layout、没有 tag,只有妙不可言

JFinal 魔板函数,消灭掉了传统模板引擎中大量无聊的概念,令学习成本无限逼近于0,函数是在任何现代语言都有的概念,用函数去实现类似于 layout 这样的功能就像呼吸空气一样地自由,只需 define 一个 layout() 函数,在此函数中调用另一个函数即可:

#define layout()
<html>
   <body>
      #@main()
   <body>
</html>
#end

然后在最终的页面,直接调用 layout() 并定义 main() 函数:

#@layout()
#define main()
...
#end

魔板函数是在 jfinal 3.0 时就有的功能,在此再次强调其易用性与灵活性,很多小伙伴使用 define 封装了各种可用于模块化的函数,jfinal 3.1 版的关键词 “妙不可言” 也是在这种情况下产生的,感谢 @天蓬小猪 第一个在俱乐部提出该关键词,以致于成为了 jfinal 3.1 的版本代号。

3、render 动态渲染:支持无限参数赋值,支持模块化

render 指令支持动态模板渲染,为其在运行时传入不同的模板,极速支持子模板的动态化定制,无限参数赋值极其有利于模块化,例如:如下名为 ”_hot_list.html” 的模板文件用于展示热门项目、热门新闻等等列表:

<div class="hot-list">
  <h3>#(title)</h3>
  <ul>
  #for(x : list)
  <li><a href="#(url)/#(x.id)">#(x.title)</a></li>
  #end
  </ul>
</div>

上面html片段中的title、list、url是渲染时需要的变量,使用render指令分别渲染“热门项目”与“热门新闻”的用法如下:

#render("_hot_list.html", title="热门项目", list=projectList, url="/project")
#render("_hot_list.html", title="热门新闻", list=newsList, url="/news")

上面两行代码中,为“_hot_list.html”中用到的三个变量title、list、url分别传入了不同的值,实现了 “_hot_list.html”的模块化重用。此外,include 指令也添加了无限参数赋值功能特性。

4、sql 管理添加对 Object… paras 参数的支持

JFinal 3.0 的 sql 管理功能需要传入 Map data 参数:

Kv para = Kv.by("age"18).set("weight"50);
SqlPara sp = dao.getSqlPara("findGirl", para);

而大部分情况下还可以更加简洁、极速,以下是 JFinal 3.1 引入的新用法:

SqlPara sp = dao.getSqlPara("findGril"1850);

新用法完全避免掉了参数的构造,sql 定义只需要使用 para指令的 #para(int) 形式即可:

#sql("findGirl")
  select * from girl where age > #para(0) and weight < #para(1)
#end

新用法为 para 指令提供 int 型参数达成参数传递,适用于参数位置与个数确定的场景。而老用法更加适用于参数名称、个数、位置都不确定的场景,多数情况下使用第一种用法即可胜任。

5、date 日期型数据输出指令

date指令用于格式化输出日期型数据,包括Date、Timestamp等一切继承自Date类的对象的输出,
使用方式极其简单:

#date(account.createAt)
#date(account.createAt, "yyyy-MM-dd HH:mm:ss")

上面的第一行代码只有一个参数,那么会按照默认日期格式进行输出,默认日期格式为:“yyyy-MM-dd HH:mm”。上面第二行代码则会按第二个参数指定的格式进行输出。

如果希望改变默认输出格式,只需要通过engine.setDatePattern()进行配置即可。此指令在 jfinal 3.0 中已经存在,但jfinal 手册中遗漏了其说明,有不少小伙伴们经常问,借本次新版本发布强调一下该功能的使用。

6、Kv 参数快捷构建工具

JFinal 3.1 添加了 Kv 用于实现快捷构造参数,与 JFinal 3.0 版本中引入的 JMap 工具对比如下:

JMap cond = JMap.create("k1", v1).set("k2", v2);
Kv cond = Kv.by("k1", v1).set("k2", v2);

Kv 无论是在字符输入量上,还是在输入的顺滑度上都完胜 JMap。Kv 的引入,表达为 jfinal 一直以来追求极致且永不止不步的精神。

7、renderFile 支持文件重命名,并支持各种浏览器之下的中文文件名

renderFile("原文件名.zip""新文件名.zip");

在原有熟悉的 renderFile 基础之上再添加一个新文件名即可打完收枪。

8、#para 指令支持任意表达式

JFinal 3.1 去除了对于 para 指令参数表达式类型的限制,可以支持任意表达式,方便支持类似于下面这种用法:

#sql("find")
   select * from t
   #for (x : map)
      #(for.index == 0 ? "where" : "and")
      #(x.key) = #para(x.value)
   #end
#end

9、全面提升对分页的支持

JFinal 3.0 取消了用正则对 order by 子句的移除工作,对于非mysql数据库等等不支持 select count(*) 带有 order by 子句的数据库带来了一定的困扰。JFinal 3.1 添加对 order by 子句的处理,为了权衡正则效率引入了 paginateByFullSql 专门处理复杂 order by 子句:

String from = "from t where ...";
String totalRowSql = "select count(*) " + from;
String findSql = "select * " + from + "order by case when a > 0 then 0 else 1 end";
dao.paginateByFullSql(110, totalRowSql, findSql, x);

以上的 findSql 中包含一个非常规的 order by 子句,还有比这更为复杂的嵌套型 order by 子句,如果需要正确匹配这些复杂 order by,正则表达式的效率会降低一到两个量级,而绝大部分 sql 使用的是简单 group by 子句,权衡后通过引入 paginateByFullSql 来解决这类少部分情况。

10、添加 HikariCpPlugin 支持 HikariCP 数据库连接池

hp = new HikariCpPlugin(url, username, password, driverClass);
arp = new ActiveRecordPlugin(hp);
me.add(hp);
me.add(arp);

HikariCP 号称是目前为止最快的数据库连接池,这个插件对于数据库请求有超高并发量的小伙伴们可能非常有价值,此插件由 @玛雅牛 大牛贡献,感谢 @玛雅牛 的支持。

11、Dialect 接管 ModelBuilder、RecordBuilder

ModelBuilder、RecordBuilder 被 Dialect 接管以后,方便小伙伴们对于 JDBC 返回的数据进行精细化控制和类型转换,在使用时,只需要扩展相应的 XxxDialect 并覆盖掉其 buildeModelList() 与 buildRecordList()即可。

由于近期时间极其有限,本文只做较为粗浅的表述,里面很可能有不少错别字,还有很多增强与改进都未在此文中提到,changlog 也未来得及整理出来,所有这些内容将在近两天内在 jfinal.com 官网公布,大家可以明后天去 jfinal.com 官网下载详细的 changelog。

ONE MORE THING: JFinal 俱乐部直播即将推出,作者将通过直播的方式深度讲解 JFinal 设计原理、俱乐部专享项目源码内涵,以及在线问题答疑,对这些内容感兴趣的小伙伴可加入俱乐部:http://www.jfinal.com/club

转自 http://www.oschina.net/news/84455/jfinal-3-1