专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
程序猿  ·  姜萍造假实锤!阿里数赛出结果。。。 ·  4 天前  
OSC开源社区  ·  130万奖金池!第二届vivo蓝河操作系统创 ... ·  3 天前  
程序员的那些事  ·  趣图:当我打开老妈的手机 ·  1 周前  
51好读  ›  专栏  ›  OSC开源社区

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

OSC开源社区  · 公众号  · 程序员  · 2017-05-06 08:31

正文

点击图片报名上海、南京源创会 #


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(1, 10, getSqlPara("findGirl", 18));


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



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


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

#define layout()
   


      #@main()   

#end


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

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


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



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


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


  

#(title)


  


上面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", 18, 50);


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

#sql("findGirl")
  select * from girl where age > #para(0) and weight #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(1, 10, 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。



福利


只要您于 5 月 12 日 24:00 前在“开源中国七大夏日必备编程神器,不容错过!”评论区留言,写下你用过最好的开源项目和项目地址,并说明为什么觉得最好,点赞数最多的前十名即可获得开源中国送出的编程神器一份哦!!!




推荐阅读

最近 Python 有点火?  7 个学习它的理由!

假日照片堆积如何处理?这些工具你可能用得上

这些开源软件养活了一票国产软件!

40 行代码拿下拉勾网招聘数据

点击“阅读原文”查看更多精彩内容