JFinal快速入门

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服务-----newsRedis
	RedisPlugin 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 五大部分组成:
    在这里插入图片描述
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值