JFinal 2.1 发布,用 JFinal 开发,就这么定了!

JFinal
 JFinal
发布于 2015年12月29日
收藏 224

JFinal 2.1 将带给大家超过60项增强与改进,此次升级核心目的,一是全面解救传统SSH开发者,强力推动这些早已累成狗的工程师转投 JFinal 怀抱,二是与老用户建立更深的情感,答谢你们长久以来对JFinal的支持!

作为传统SSH开发者全面转投JFinal怀抱的版本,JFinal 2.1必须带给SSH用户全新的足够消除他们顾忌的极速化功能,传统JavaBean的回归 必不可少,但不能是简单的回归,必须还要完全拥有 JFinal 所有优势,并且还要彻底消除所带来的体力劳动。

一、极速合体 Model与JavaBean

JFinal 2.1引入BaseModel设计实现Model与JavaBean的合体,在保持了Model类干净清爽的同时,极速拥有JavaBean所有优势,并且极速响应数据表的任何变化。以下是示例代码:

// 生成 BaseModel
new Generator(...).generate();

// 依然清爽的 Account Model
public class Account extends<BaseAccount> {

}

// setter、getter 完美回归
public void actoin() {
  new Account().setUserName(userName);
}

BaseModel承载 getter、setter,留给 Model一个清爽的世界,也令表结构变化后的重构安全放心,丝毫不打扰Model中的代码。

以上代码展示,只需要使用Generator一步即可完成合体工作,在保持Model所有优势的前提下,getter、setter实现完美回归。

小木学堂相关视频教程分享:
http://www.tudou.com/programs/view/sb4U1aWCNks/
http://pan.baidu.com/s/1c1tkmUO

    二、极速化table与Model自动映射,极速化主键/复合主键自动配置

    JFinal 2.1引入MappingKit设计,实现table与Model的极速映射,主键/复合主键的极速配置,完全不需要人工干预,如下是生成的MappingKit.java的代码:

// MappingKit 自动映射,无需人工干预
public class _MappingKit {
  public static void mapping(ActiveRecordPlugin arp) {
   arp.addMapping("account", "id", Account.class);
   arp.addMapping("order", "id,serialId", Order.class);
  }
}

// 在ActiveReocrdPlugin 中使用MappingKit,JFiinalConfig中无比清爽
public void configPlugin(Plugins me) {
  ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
  me.add(arp);  
  _MappingKit.mapping(arp);
}

        无论你的项目是几百张表还是几千张表,搞定映射都在弹指一挥间!

三、极速化验证码支持

        值此12306又是一年吐槽之际,JFinal 2.1特别针对验证码进行了极速化的增强,将验证码提升为Controller一等公民,在Controller之中直接调用 renderCapthca()极速渲染。新版本实现不仅颜值超高,安全性更好,而且使用方式更加极速,无论是生成还是验证全然一行代码的事:

// 极速渲染超高颜值验证码
public void edit() {
  renderCaptcha();
}

// 极速验证那都不是个事
public void save() {
  validateCaptcha(field);
}

在保证高颜值,极速用法的同时,新版验证码还使用了随机字体、随机文字旋转、随机背景圆圈、随机曲线,httpOnly等多种安全化处理。

    四、极速化json与Object互转,极速化json服务端

    JFinal 2.1新增独立json处理模块,引入更加专业化的json实现,为开发高性能json服务应用提供强力支持。引入Json、IJsonFactory抽象,并提供jfinal、jackson、fastjson三种实现,可随心选择三种实现之一:

// json与 object极速互转
public void action() {
  Account account = Json.getJson().parse(jsonStr);
  jsonStr = Json.getJson().toJson(account);
}

// 切换Json实现
public void configConstant(Constants me) {
 me.setJsonFactory(new JacksonFactory());
}

也可通过扩展抽象自由切换心爱的json工具,只需如下两步:

// 自定义 Json实现
public class MyJson extends Json {
  public String toJson(Object) {
    ...
  }
  public <T> T parse(String json, Class<?> type) {
    ...
  }
}

// 切换成自定义Json实现
public void configConstant(Constants me) {
 me.setJsonFactory(new IJsonFactory() {
   public Json getJson() {
     return MyJson();
 });
}

五、极速化的纯API服务支持

增强getModel(),可通过getModel(modelClass, ""),使客户端免去输入modelName前缀,方便纯API服务端项目的开发,方便支持纯json手机服务端应用。

添加 getBean()方法支持传统JavaBean的获取,尤其适用于合体后的Model独立工作于无数据源连接的应用。

添加 IXmlRenderFactory,方便支持XML服务端应用,默认使用Freemarker实现XmlRender。

六、极速化数据库批量操作支持,极速化pagnate增强

添加 Db.batchSave(List<Model>) Db.batchUpdate(List<Model>) 避免拼写繁杂的 insert into及 update 类 sql,极速批量保存更新model。添加 Db.batchUpdate()  Db.batchSave(),妈妈再也不担心俺不会写sql批量插入和更新了:

public class Happy {
  public void justDoIt(List<Account> accountList) {
    Db.batchSave(accountList);
    Db.batchUpdate(accountList);
  }
}

老版本中的sqlSelect与sqlExceptSelect两个参合体为一个整体的sql参数,并兼容老版本分而参数,更省心的 sql,
支持 group by 嵌套,以及group by 分页仅有一条记录的情况。

public void justForFun() {
  Db.paginate(1, 10, "select * from happy where x>?", x);
}

七、极速化AOP增强

添加类级的@Clear注解,便捷删除global、inject 级拦截器。拦截器管理模块全面增强,重构合并控制层与业务层拦截器管理逻辑,对除 Mothod级的拦截器栈全部提供缓存支持,让 AOP 更加极速,代码量更小。

ONE MORE THING值此SSH用户全面转投JFinal之际,特推出JFinal最佳实践之JFinal CMS项目,实现更大粒度的极速开发,狂扫下方二维码,JFinal官方公众号粉丝再增加5000立即放出源码:


JFinal 2.1来袭,用JFinal开发,就这么定了!

该版本详细的改进记录请看:

1:添加BaseModelGenerator,极速合体Model与传统java bean

2:添加MappingKitGenerator,极速映射table与model,极速配置主键/复合主键

3:添加ModelGenerator,极速生成Model

4:添加DataDictionaryGenerator,极速生成数据字典

5:添加json模块,极速json与object互转。提供jfinal、jackson、fastjson三种json实现,按需选用

6:增强Clear注解,极速支持类级别拦截器清除

7:添加Controller.renderCaptcha(),极速验证码渲染

8:添加Validator.validateCaptcha()、Controller.validateCaptcha()极速校验验证码

9:添加Db.batchSave()、batchUpdate(),极速批量插入/更新数据

10:增强Controller.getModel()、keepModel(),支持传入""作为 modelName,极速友好支持纯API项目

11:添加ActiveRecordPlugin.useAsDataTransfer()极速支持Model在分布式场景下承载/传输数据,极速支持在无数据源场景下使用Model

12:添加Json、IJsonFactory抽象,极速扩展自己喜爱的json实现

13:改进所有paginate()方法,合并select与sqlExceptSelect参数,并兼容老版本用法。改进正则对order by、group by支持更完备

14:改进Controller.setCookie()系列方法,添加isHttpOnly参数,方便保护敏感cookie值不被js读取

15:增强文件上传功能,支持设置baseUploadPath在项目根路径之外,便于支持单机多实例共享上传目录

16:增强文件下载功能,支持设置baseDownloadPath在项目根路径之外,便于支持单机多实例共享上传目录

17:改进ActiveRecord,默认事务隔离级别提升为Connection.TRANSACTION_REPEATABLE_READ

18:增强TypeConverter,对Timestamp类型转换时根据字符串长度选择转换pattern,添加对boolean、float、double三种primitive类型的转换支持以便更适合传统java bean应用场景

19:添加StrKit.toCamelCase()、支持下划线命名转化为驼峰命名

20:增强I18nInterceptor,支持404、500页面国际化

21:重构log模块,所有Logger更名为Log,所有getLogger()更名为getLog()

22:优化、重构HashKit,提升性能,缩减代码量

23:改进Json转换规则,避免对"/"字符的转义,与jackson、fastjson转换行为一致

24:改进TxByRegex,将其拆分成TxByActionKeyRegex与TxByMethodRegex,语义更加明确

25:改进Prop.getBoolean()添加对value值前后空格的处理,避免开发者粗心带来难以发现的错误

26:添加Controller.setHttpServletRequest()、setHttpServletResponse()便于拦截注入做更深扩展

27:改进Db.delete(String, String, Record)支持复合主键参数

28:添加Constants.setReportAfterInvocation()设置Action Report时机,默认值为true,有利于纯API项目

29:添加Controller.getBean()、keepBean()系列方法,支持传统java bean以及合体后的Model,有利于无数据源使用Model的场景

30:JFinalConfig.loadPropertyFile()直接使用Prop,避免影响PropKit,删除unloadAllPropertyFiles() 方法

31:改进OracleDialect.fillStatement()添加对Timestamp的判断

32:改进Validator,其内部属性全部改为protected可见性,便于继承扩展

33:添加Handler.next属性代替nextHandler,原属性被Deprecated

34:添加CaptchaRender,极速生成更加美观安全的验证码

35:改进Controller.getModel()系列方法,添加skipConvertError参数,便于在获取model时跳过无法转换的字段

36:添加LogKit支持在任意地方快捷使用日志

37:改进Model,getAttrNames、getAttrsEntrySet、getAttrValues、setAttrs方法名添加 "_"前缀,便于和getter、setter区分开来

38:添加FreeMarkerRender.setTemplateLoadingPath(),支持指定freemarker模板基础路径

39:改进HttpKit,支持非Oracle JDK,readIncommingRequestData()更名为 readData()、添加 setCharSet()方法

40:添加IBean接口,标记识别Model继承自BaseModel带有getter、setter

41:改进Redis Cache,添加对hash、set数据结构的field字段转换,支持field字段使用任意类型。改进支持通过继承Cache实现自定义Cache。

42:添加Constants.setJsonFactory()方法,用于切换json实现

43:改进Constants,setUploadedFileSaveDirectory()更名为setBaseUploadPath(),setFileRenderPath()更名为setBaseDownloadPath()

44:添加Constants.setXmlRenderFactory()用于切换XmlRender工厂实现类

45:改进ActionReporter,可设置JFinal Action Report时机

46:添加IXmlRenderFactory接口,支持Xml Render实现类的切换

47:添加InterceptorManager,支持缓存类级别拦截器栈

48:添加FreeMarkerRender.getContentType(),有利于重用freemarker,并利用其重构XmlRender,缩减代码量

49:改进SqlServerDialect,避免将sql转成小写字母,更好支持model字段取值

50:改进CacheInterceptor,支持未调用render时的场景

51:改进Redirect301Render,支持对已有queryString进行追加

52:改进异常处理,对所有catch块中忽略的异常添加适当处理,例如添加日志

53:添加ActiveRecordPlugin.setPrimaryKey()用于强制指定主键名或复合主键名及其次序

54:优化com.jfinal.aop.Callback,提升性能

55:重构合并InterceptorBuilder、ActionInterceptorBuilder,去除冗余代码

56:改进Controller.renderJson(Object),识别JsonRender类型对象,避免对其进行toJson转换

57:改进Controller中cookie操作,默认不设置domain与path值

58:改进Model.set()使Model可在未启动ActiveRecordPlugin场景下充当java bean使用

59:添加RedisInterceptor.getCache(),便于继承扩展切换Cache

60:改进FileRender,支持baseDownloadPath为应用以外的路径

61:添加Constants.setJsonDatePattern(),支持配置json转换Date类型时的pattern

62:I18nInterceptor.ge2:I18nInterceptor.ge2:I18nInterceptor.getLocalPara()更名为getLocalParaName()

63:c3p0升至0.9.5.1版本

64:删除 StringKit、NullLoggerFactory

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:JFinal 2.1 发布,用 JFinal 开发,就这么定了!
加载中

最新评论(354

氵言
6666
JFinal
JFinal

引用来自“zt-ken”的评论

请问这个可以在java8中开发吗?@Jfinal
java 语言一直都是向下兼容的,必然可以,建议看 jfinal 2.2 的 changelog,2.1 不建议使用:http://www.oschina.net/news/70001/jfinal-2-2
zt-ken
zt-ken
请问这个可以在java8中开发吗?@Jfinal
mack_ky
mack_ky
SSH开发者的福音
JFinal
JFinal

引用来自“哎码”的评论

Jfinal支持关联查询么?有没有类似hibernate的懒加载功能?
在我们需要的时候加载,不需要的时候置空?
关联查询的用法在 jfinal 手册上有,有两种使用方式很方便。你需要的懒加方式属于手册中的第二种,写个简单的 sql 就搞定懒加载
JFinal
JFinal

引用来自“风行七月”的评论

  public void captcha() {
    renderCaptcha();
  }

然后validateCaptcha("captcha")总是FLASH,我看请求controller.getCookie(DEFAULT_CAPTCHA_NAME)总是为NULL.啥意思?
改为 getCookie("_jfinal_captcha") 试一下
哎码
哎码
Jfinal支持关联查询么?有没有类似hibernate的懒加载功能?
在我们需要的时候加载,不需要的时候置空?
风行七月
  public void captcha() {
    renderCaptcha();
  }

然后validateCaptcha("captcha")总是FLASH,我看请求controller.getCookie(DEFAULT_CAPTCHA_NAME)总是为NULL.啥意思?
柠檬与少年
柠檬与少年
Routes的add(Routes routes)方法baseViewPath重复了两次?
JFinal
JFinal

引用来自“xforgchen”的评论

为什么我升级到2.1后getModel转换对象属性为空,前端要全部改为小写?

引用来自“JFinal”的评论

你用的什么数据库? 什么时候下载的 jfinal 的 jar 包?

引用来自“xforgchen”的评论

sql2008,就是原来2.0的是好的正常的,后来我想升级到2.1,升级后getModel获取的字段就是空的了,我原来是设置了不区分大小写的,和这个有关系?要是原来2.0的升级到2.1需要注意什么?
    // 配置ActiveRecord插件
    ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
    arp.setShowSql(true);
    arp.setDialect(new SqlServerDialect());
    arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));
    me.add(arp);
在官网下载一下最新版本的 jfinal 2.1,这里有改进,最近一周会对类似的问题进行微调,目前发布一周,大概只有三个问题需要调整,其她的极好
返回顶部
顶部