JFinal

简介

JFinal 是基于 Java 语言的极速 WEB + ORM 开发框架
JFinal 有如下主要特点:MVC 架构,零配置自动加载修改后的 java 文件AOP 支持,拦截器配置灵活,多视图支持
JFinal 2.1新增 : Generator类 用来极速生成 Model()BaseModel(用于被最终的 Model 继承的基类,所有的 gettersetter方法都将生成在此文件内)、MappingKit(用于生成tableModel映射关系,并且会生成主键/复合主键的配置)、DataDictionary(生成的数据字典,会生成数据表所有字段的名称、类型、长度、备注、是否主键等信息)文件 。 使 用 时 通 常 只 需 配 置 Generator 的 四 个 参 数 即 可 : baseModelPackageName( baseMode 的包名) 、 baseModelOutputDir(baseModel 的输出路径)、modelPackageName(modle 的包名)、modelOutputDir(model 的输出路径)
例如:Generator gernerator = new Generator(dataSource, baseModelPkg, baseModelDir,modelPkg, modelDir);
Model 与 Bean 合体后注意事项
1: JSP 模板输出 Bean 中的数据将依赖其 get+变量名方法
如果需要跟以前一样( getter 方法):ModelRecordElResolver. setResolveBeanAsModel(true);
2:JFinalJson 将 Model 转换为 json 数据时:json 的 keyName 是原始的数据表字段名.
原来:jackson、 fastjson 这类依赖于 getter 方法转化成的 json 的 keyName 是数据表字段名转换而成的驼峰命名
3:建议 mysql 数据表的字段名直接使用驼峰命名
注意:mysql 数据表的名称仍然使 用下划线命名方式并使用小写字母,方便在 linux 与 windows 系统之间移植

JFinalConfig 类

用于对整个 web项目进行配置

  1. publicvoid configConstant(Constants me){}----配置 JFinal 常量值 如开发模式常量 devMode 的配置(me.setDevMode(true)),
    默认视图类型 ViewType的配置(me.setViewType(ViewType.JSP))
  2. public void configRoute(Routesme) {} ----访问路由finalView = baseViewPath + viewPath + view
  • 注意:当view以 “/” 字符打头时表示绝对路径baseViewPathviewPath 将被忽略


    ActionKey 注解: UserController 的 controllerKey 值为“/user”,在使用了@ActionKey(“/login”)注解以 后,actionKey 由原来的“/user/login”变为了“/login”
  1. publicvoid configPlugin(Plugins me) {}----JFinal插件,所有插件的配置:
    https://blog.csdn.net/qq_44123730/article/details/103304451
  2. public void configInterceptor(Interceptors me) {}----配置 JFinal 的全局拦截器,全局拦截器将拦截所有 action 请求,除非使用@Clear 在 Controller 中清除
  • 全局拦截器分为控制层全局拦截器(拦截控制 层所有 Action 方法)与业务层全局拦截器(拦截业务层所有方法)
  • 设置:
// 添加控制层全局拦截器me.addGlobalActionInterceptor(new GlobalActionInterceptor());// 添加业务层全局拦截器//老版本:me.addGlobalServiceInterceptor(new GlobalServiceInterceptor());me.add(new GlobalActionInterceptor());

Interceptor 配置粒度分为 Global(项目)、Class(类)、Method(方法) 三个层次
拦截器各级别执行的次序依次为:GlobalInjectClassMethod
6. public void configHandler(Handlersme) {}----配置 JFinal 的 Handler,Handler 可以接管所有 web 请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩展
JFinal 会在系统启动完成后回调 afterJFinalStart() 方 法 , 会 在 系 统 关 闭 前 回 调 beforeJFinalStop()方法。
PropKit 工具类用来操作外部配置文件,PropKit 可同时加载多个配置文件,第一个被加载的配置文件可以使用 PorpKit.get(…)方法直接操作,非第一个被加载的配置文件则需要使用 PropKit.use(…).get(…) 来操作
例如:

Controller

MVC 模式中的控制器,基于 JFinal 的 Web 应用的控制器需要继承该类,Controller 是定义 Action 方法的地点,其中Action是:Controller 类中定义的 public 无参方法
在 Controller中提供了 getParagetModel 系列方法 setAttr 方法以及 render 系列方法供 Action 使用
getPara***都是对 HttpServletRequest中的方法进行封 装

  1. getPara:用来从请求中获取参数,它有两种类型:
    1. 第 一 个 形 参 为 String 的 getPara 系列 方法- 是对 HttpServletRequest.getParameter(String name) 的 封 装。
    1. 第一个形参为 int 或无形参的 getPara 系列方法-是去获取 urlPara 中所带的参数值。
    1. getParaMap对应HttpServletRequest.getParameterMap,getParaNames对应HttpServletRequest.getParameterMap。
      记忆技巧:第一个参数为 String 类型的将获取表单或者 url 中问号挂参的域值。第一个参数为int 或无参数的将获取 urlPara 中的参数值。
  1. getModel 用来接收页面表单域传递过来的 model 对象,并且表单域名称以”modelName.attrName
  • modelName为类名的首字母小写,引用:getModel(类名.class)
  • modelName为otherName,引用:getModel(类名.class,“otherName”)
  • 如果希望传参时避免使用 modelName 前缀,可以使用空串作为 modelName 来实现:getModel(Blog.class, “”);
  1. setAttr(String, Object)转调了 HttpServletRequest.setAttribute(String, Object),该方法可以将 各种数据传递给 View 并在 View 中显示出来
  2. getFile 文件上传- 文件默认上传至项目根路径下的 upload 子路径之下,自定义:configConstant中配置me.setBaseUploadPath(baseUploadPath)baseUploadPath可以为路径参数接受以”/”打头或者以 windows 磁盘盘符打头的绝对路径,当该路径参数设置为相对路径时, 则是以项目根为基础的相对路径
  • 特别注意:如果客户端请求为 multipart request(form 表单使用了 enctype=“multipart/form-data”),那么必须先调用 getFile 系列方法才 能使 getPara 系列方法正常工作,因为 multipart request 需要通过 getFile 系列方法解析请求体中 的数据,包括参数。
  1. renderFile 文件下载-文件默认下载路径为项目根路径下的 download 子路径之下,me.setBaseDownloadPath(baseDownloadPath) 设置文件下载基础路径,
  2. session: 通过 setSessionAttr(key, value)可以向 session 中存放数据,getSessionAttr(key)可以从 session中读取数据。
  • 通过 getSession()得到 session 对象从而使用全面的 session API
  1. render 系列方法将渲染不同类型的视图并返回给客户端映射配置 :routes.add(“/user”, UserController.class, “/path”), render(String view)
  • JFinal 目前支持的视图类型有:
    FreeMarker、JSP、Velocity、JSON、File、Text、Html 等等,还可以通过继承 Render 抽象类来无限扩展视图类型。 视 图 类 型由JFinalConfig.configConstant(Constants constants) 配 置 中 的 constants. **setViewType(ViewType)**来决定,constants.setMainRenderFactory(IMainRenderFactory) 来设置 Controller.render(String)所使用的视图。

AOP

JFinal 采用极速化的 AOP 设计,专注 AOP 最核心的目标,仅有三个 概念:InterceptorBeforeClear,并且无需引入 IOC 也无需使用繁杂的 XML。

  1. Interceptor-对方法进行拦截,并提供机会在方法前后添加切面代码
    例如:
public class DemoInterceptor implements Interceptor {/*参数inv提供了很多便利的方法在拦截器中使用,例如:
void invoke()传递本次调用,调用剩下的拦截器与目标方法
Controller getController()获取 Action 调用的 Controller 对象(仅用于控制层拦截)
*/public void intercept(Invocation inv) { System.out.println("Before method invoking"); inv.invoke();System.out.println("After method invoking");}
}

Invocation有如下方法

  1. Before注解
    用来对拦截器进行配置,该注解可配置 Class、Method 级别的拦截器

  2. Clear注解

Clear 用于清除自身 所处层次以上层的拦截器,本层与下层不清除

  • 不带参数时清除所有拦截器,带参时清除参数指定的拦截器
  1. 触发拦截器
    控制层拦截器的触发,只需发起 action 请求即可。业务层拦截器的触发需要先使用 enhance方法对目标对象进行增强,然后调用目标方法即可
    5. DuangEnhancer 类用来对目标进行增强,让其拥有 AOP 的能力,可以把他们看作我工具类
    Duang.duang()、Enhancer.enhance()与 Controller.enhance()系方法在功能上完全一样
// 使用Duang.duang方法在任何地方对目标进行增强OrderService service = Duang.duang(OrderService.class);// 使用Enhancer.enhance方法在任何地方对目标进行增强OrderService service = Enhancer.enhance(OrderService.class);
  1. Inject 拦截器
    Inject 拦截器是指在使用 enhance 或 duang 方法增强时使用参数传入的拦截器,使用此方法便可完全无侵入地对目标进行 AOP 增强,Inject 拦截器可以被认为 就是 Class 级拦截器,只不过执行次序在 Class 级拦截器之前而已
    为enhance方法传入的拦截器称为Inject拦截器,下面代码中的Tx称为Inject拦截器
OrderService service = Enhancer.enhance(OrderService.class,         Tx.class); service.payment(…);

ActiveRecord

使用通过 ActiveRecord 来操作数据库,减少代码量。ActiveRecord 是作为 JFinal 的 Plugin 而存在的

  1. ActiveRecordPlugin–是ActiveRecrod 支持插件

  2. Model 是 ActiveRecord 中最重要的组件之一,它充当 MVC 模式中的 Model 部分
    User 中定义的 public static final User dao 对象是全局共享的,只能用于数据库查询不能用于数据承载对象。数据承载需要使用 new User().set(…)来实现。
  3. JavaBean 与 Model 合体(JFinal 2.1 版本)
    JavaBean在mvc设计模型中是model,又称模型层,也称数据层,用来设计数据的属性和行为的,提供获取属性和设置属性的get/set方法。
    JFinal 2.1 版本提供了 ModelGenerator 、 BaseModelGenerator 、 MappingKitGernator 、 DataDictionaryGenerator,分别生成 Model、BaseModel、MappingKit、DataDictionary 四类文件。 可根据数据表自动化生成这四类文件。
  4. Db + Record 模式
    Db 类及其配套的 Record 类,提供了在 Model 类之外更为丰富的数据库操作功能。Db + Record 模式的一些常见用法

    5. 声明式事务
    注意:MySql 数据库表必须设置为 InnoDB 引擎时才支持事务,MyISAM 并不支持事务。
    6.Cache使用缓存以大大提高性能
    如何使用:
  5. Dialect 多数据库支持:即sql方言的支持
    ActiveRecordPlugin 提供了 MysqlDialect、OracleDialect、AnsiSqlDialect 实现类。 MysqlDialect 与 OracleDialect 分别实现对 Mysql 与 Oracle 的支持,AnsiSqlDialect 实现对遵守 ANSI SQL 数据库的支持。
  6. 表关联操作
    JFinal ActiveRecord 天然支持表关联操作,方法:
    1. 是直接使用 sql 得到关联数据
    1. 在 Model 中添加获取关联数据的方法
  1. 复合主键的使用

  2. Oracle 支持的配置:
public class DemoConfig extends JFinalConfig {public void configPlugin(Plugins me) { C3p0Plugin cp = new C3p0Plugin(……);//配置Oracle驱动cp. setDriverClass("oracle.jdbc.driver.OracleDriver");      me.add(cp);ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);  me.add(arp);// 配置Oracle方言arp.setDialect(new OracleDialect());
//由于 Oracle 数据库会自动将属性名(字段名)转换成大写,所以需要手动指定主键名为大写, 如:arp.addMaping(“user”, “ID”, User.class)。如果想让 ActiveRecord 对属性名(字段名)的大 小 写 不 敏 感 可 以 通 过 设 置 CaseInsensitiveContainerFactory 来达到 , 有 了 这 个 设 置 , 则 arp.addMaping(“user”, “ID”, User.class)不再需要了。//  配置属性名(字段名)大小写不敏感容器工厂 arp.setContainerFactory(new CaseInsensitiveContainerFactory()); arp.addMapping("user", "user_id", User.class);
}

让 Oracle 支 持自动主键主要分为两步:
一是创建序列

二是在YourModel 中使用这个序列
9. 多数据源支持:
10. 非 web 环境下使用 ActiveRecord

EhCachePlugin 是 JFinal 集成的缓存插件(高并发)

  1. EhCachePlugin的配置:public void configPlugin(Plugins me) { me.add(new EhCachePlugin());}
  2. CacheInterceptor 可以将 action 所需数据全部缓存起来,下次请求到来时如果 cache 存在则直接使用数据并render,而不会去调用 action。此用法可使 action 完全不受 cache 相关代码所污染
    使用:
  3. EvictInterceptor 可以根据 CacheName 注解自动清除缓存。以下是示例代码:
  4. CacheKit 是缓存操作工具类
  • CacheKit 中最重要的两个方法是 get(String cacheName, Object key)与 put(String cacheName,Object key, Object value)。
    参数 cacheName 与 ehcache.xml 中的<cache name=“blog” …>name 属性值对应;参数 key 是指取值用 到的 key;参数 value 是被缓存的数据。
  1. EhCache 的使用需要有 ehcache.xml 配置文件支持
    详细配置:

RedisPlugin

RedisPlugin 是支持 Redis 的极速化插件

  1. RedisPlugin配置:
public void configPlugin(Plugins me) {// 用于缓存bbs模块的redis服务-----bbsRedis
//最先创建的 RedisPlugin 对象所持有的Cache对象将成为主缓存对象,主缓存对象可通过Redis.use()直接获取,否则需要提供cacheName参数才能获取,例如:Redis.use(“news”)RedisPlugin bbsRedis = new RedisPlugin("bbs", "localhost"); me.add(bbsRedis);// 用于缓存news模块的redis服务-----newsRedisRedisPlugin newsRedis = new RedisPlugin("news", "192.168.3.9"); me.add(newsRedis);}


3. 非 web 环境使用 RedisPlugin:

Validator 是 JFinal 校验组件

  1. Validator 自身实现了 Interceptor 接口,所以它也是一个拦截器,配置方式与拦截器完全一 样,Validator 配置
public class UserController extends Controller {@Before(LoginValidator.class) public void login() {}
}
public class LoginValidator extends Validator {//validateXxx(…)系列方法进行后端校验
protected void validate(Controller c) { validateRequiredString("name", "nameMsg", "请输入用户名"); validateRequiredString("pass", "passMsg", "请输入密码");
}
//handleError(Controller c)只有在校验失败时才会调用
//调用 c.keepPara(…)方法将提交的值再传回页面以便保持原先输入的值,还可以调用 c.render(…)方法来返回相应的页面,如果传递过来的是 model 对象,可以使用 keepModel方法来保持住用户输入过的数据
protected void handleError(Controller c) { c.keepPara("name");c.render("login.html");}
}

国际化

详情:

FreeMarker

JFinal 默认使用 FreeMarker 作为 View,默认使 用”.html”作为 FreeMarker 视图文件的扩展名(原为”.ftl”)
使用JSP:me.setDevMode(true); me.setViewType(ViewType.JSP);
freeMarker使用:将 userList 中的 user 对象循环输出

详细的FreeMarker的使用:
2. 在 JFinal 中扩展:

  • 通过 FreeMarkerRender.getConfiguration().setSharedVariable(“myKit”, new MyKit()) 为FreeMarker 设置共享工具类,在 view 中使用 ${myKit.method(para)}
    总结:JFinal 由 Handler、Interceptor、Controller、Render、Plugin 五大部分组成:

JFinal快速入门相关推荐

  1. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  2. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  3. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  4. Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...

  5. 《iOS9开发快速入门》——导读

    本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...

  6. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  7. python scrapy菜鸟教程_scrapy学习笔记(一)快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  8. OpenStack快速入门

    OpenStack云计算快速入门(1) 该教程基于Ubuntu12.04版,它将帮助读者建立起一份OpenStack最小化安装.我是五岳之巅,翻译中多采用意译法,所以个别词与原版有出入,请大家谅解.我 ...

  9. Expression Blend实例中文教程(2) - 界面快速入门

    上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Ble ...

最新文章

  1. mysql getline_getMessage(),getFile,getLine获取异常用法
  2. VS 解决方案平台和解决方案配置
  3. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...
  4. LeetCode(682)——棒球比赛(JavaScript)
  5. iOS开发,轻松获取根控制器当前控制器的正确方式
  6. c# socket接收字符串_php 的 socket简单原理及实现
  7. win10 升级导致找不到SQL Server配置管理器
  8. 【图频处理】基于matlab GUI界面环图像处理与音乐播放系统【含Matlab源码 185期】
  9. 网站服务器历史解析记录查询,域名解析ip历史查询
  10. 用java怎么开发图片标注工具,图片标注工具选型
  11. 手机里舍不得删除的48条搞笑短信
  12. Hadoop集群中HDFS的API测试案例以及MapReduce的多种提交Job方式案例
  13. Android开发工具类
  14. 苹果怎么换行打字_2周内将你的打字速度提高3倍的方法
  15. 聊一聊前端程序员的现状与挑战
  16. or在python中是什么意思_Python中and和or的用法
  17. 美国大学计算机科学博士生排名,2021美国大学本科计算机专业(高学位博士)排名...
  18. 腾讯云公布大数据平台最新数据,日实时计算量超40万亿
  19. [附源码]计算机毕业设计Python基于微信小程序的网络办公系统(程序+源码+LW文档)
  20. 印度尼西亚 east java_东爪哇(EAST JAVA)

热门文章

  1. 6-1 求二叉树高度 (25 分)【实验三:二叉树的构造和遍历】
  2. Mysql 安装 000007b_w7电脑蓝屏0x0000007b的解决方法
  3. 贝壳、安居客、天猫好房的数字化博弈
  4. ffmpeg绿幕抠图原理解析
  5. win10开启护眼模式
  6. 06.Google抓包技巧和方法
  7. 机器人学之运动学笔记【3】—— 机械臂DH表示法+正向运动学(Forward Kinematics)
  8. opencv 视频中人脸检测
  9. 正则表达式对qq号码进行校验
  10. codeup|问题 E: FatMouse‘s Trade