JFinal 4.9 发布,持续精雕细琢

栏目: 软件资讯 · 发布时间: 5年前

内容简介:JFinal 是一个 Web MVC + ORM + AOP + Template Engine 四合一的极简、极轻量级应用开发框架,至今已迭代发展进入第 10 年。 JFinal 坚持极简设计,迭代近 10 年,却只有 3 万行代码,比传统的同等功能组合类框架...

    JFinal 是一个 Web MVC + ORM + AOP + Template Engine 四合一的极简、极轻量级应用开发框架,至今已迭代发展进入第 10 年。

    JFinal 坚持极简设计,迭代近 10 年,却只有 3 万行代码,比传统的同等功能组合类框架要少几十倍的代码量,这使得开发者可以完全掌控其源代码,也成为学习 java 框架设计的绝佳资源。

    经过这么多年的迭代,JFinal 已经非常完善、成熟。JFinal 4.9 主要打磨了近半年来开发者的需求与反馈,较大的雕琢有下面这些:

1、重构、优化自带的 json 转换模块

    JFinalJson 模块被重新设计,初步测试,性能提升至 jackson 的 3 倍以上。并且添加了一些便利的功能,如下配置可以开启将 Model、Record 字段名转成驼峰格式:

JFinalJson.setModelAndRecordFieldNameToCamelCase();

    大量开发者将数据库字段名命名成下划线的格式,如:"user_id",这就造成了与 java 变量名风格的不统一,对代码质量有一定损害。

    上述配置只有在碰到下划线时才会对其进行转换,否则原样保留,而 oracle 用户习惯使用大写的字段名,所以需要使用如下配置:

JFinalJson.setModelAndRecordFieldNameConverter(fieldName -> {
    return StrKit.toCamelCase(fieldName, true);
});

    上述代码中的第二个参数 true 表示将字段名转成小写字母,而无论是否出现下划线。

    新增 addToJson 可方便地指定任意类型的转换规则:

JFinalJson.addToJson(Timestamp.class, (value, depth, ret) -> {
    ret.addLong(((Timestamp)value).getTime());
});

    以上扩展代码,将 Timestamp 类型转换成 long 值。

    新增 setSkipNullValueField 方法,用于去除 null 值字段的转换:

JFinalJson.setSkipNullValueField(true);

2、Enjoy 模板引擎添加 HTML 压缩功能

    通过如下配置可开启该功能:

engine.setCompressorOn();

    开启该功能以后,渲染出来的 html 结果如下:

JFinal 4.9 发布,持续精雕细琢

    该功能对于超高并发访问的 web 应用会有益处,节约流量、提升效率。

3、Enjoy 模板引擎添加 addEnum 方法支持枚举类型

    随着大量用户对于 Enjoy 使用的深入,越来越多的同学向我询问枚举类型的支持问题。该功能其实可以通过 addSharedObject(...) 来实现。

    由于问的人太多,为避免今后重复回复该问题,也为了进一步提升开发体验,jfinal 4.9 给予了直接支持,假定有如下枚举类型:

public enum UserType {
    ADMIN,
    USER;

    public String hello() {
        return "hello";
    }
}

    添加一行配置即可支持该枚举类型:

engine.addEnum(UserType.class);

    Enjoy 模板中即可像下面这样使用:

### 以下的对象 u 通过 Controller 中的 setAttr("u", UserType.ADMIN) 传递
#if(u == UserType.ADMIN)
    #(UserType.ADMIN)

    ### 以下两行代码演示直接方法调用
    #(UserType.ADMIN.name())
    #(UserType.ADMIN.hello())   
#end

     在模板中的用法与在 java 中的用法保持一致性,不遗余力地为你减少学习成本。

4、Enjoy 的 Ctrl 添加 attachment 属性

    Ctrl 添加了 Object attachment 及其 setter、getter 方法,便于穿透 Scope 传递变量,主要用于指令扩展之中:

public class MyDirective extends Directive {
    public void exec(Env env, Scope scope, Writer writer) {
        // 获取类型为 Box 的 attachment,Box 可以是任意类型,在此仅为演示
        Box box = scope.getCtrl().getAttachment();

        // 从 box 中获取数据,或者向里面放入数据
        String xxx = box.getXxx();
        stat.exec(env, scope, writer);
    }
}

    该变量的优点之一是穿透 Scope 传递参数,优点之二是避免了使用 Scope 传参时对用户数据可能的污染。

    例如出现同名变量冲突  attachment 数据可以是在某个指令之中创建并传递,也可以是在 Template.render(...) 时创建,实例见后续。

5、Enjoy 的 Template 添加四个携带 Func 接口的 render 方法

    这些新添加的方法用于支持更深度的扩展。

    开发者可以在 render 之前接管 Template 中的 Stat ast、Env env、Scope scope 变量,并且便于向 Ctrl 传入 attachment 参数:   

Map data = new HashMap<>();
data.put("key", 123);

String ret = template.renderToString(data, (ast, env, scope, writer) -> {
    // 可以传入任意类型的 attachment 参数,以下以 Kv 对象为例
    // 该参数可以在指令中通过 scope.getCtrl().getAttachment() 获取
    scope.getCtrl().setAttachment(Kv.by("key", 456));

    // 接管内部的 ast、env、scope、writer,执行 ast.exec(...)
    ast.exec(env, scope, writer);
});

System.out.println(ret);

    以上代码,利用 Func 参数可以让开发者接触到 Template 内部的 Stat、Env、Scope、Writer 数据,这样就为更深度地扩展提供了无限可能。

    具体到上例,其向 Ctrl 中传入了一个 Kv 对象作为 attachment,该对象将穿透 Scope 直达所有指令。

    即便 JFinal 已打磨多年,4.9 版本仍然有 30 多项增强与改进。剩下的一些改进是一些开发者不用太关注的内部优化类的,为节约大家时间在此不在赘述,感兴趣的同学可以去 jfinal 官网首页右侧下载详情的 changelog:https://jfinal.com

    最后,借此 4.9 版发布之际,感谢 jfinal 俱乐部所有同学这几年的支持,你的支持将是 jfinal 可持续发展的强劲动力。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

A Guide to Monte Carlo Simulations in Statistical Physics

A Guide to Monte Carlo Simulations in Statistical Physics

Landau, David P./ Binder, Kurt / Cambridge Univ Pr / 2005-9 / 786.00元

This new and updated edition deals with all aspects of Monte Carlo simulation of complex physical systems encountered in condensed-matter physics, statistical mechanics, and related fields. After brie......一起来看看 《A Guide to Monte Carlo Simulations in Statistical Physics》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具