动机
在做项目的过程中运用到了JFinal,由于是第一次看这样框架的源码,所以很多东西都不知道。想多了解一些架构的思想和Web学习的基本知识。本文主要从大致的方面介绍JFinal,对于细节不做深究,而且本文的源码只剪辑了真正源码的部分。
总体思想
首先要了解一哈基本的知识:
- ORM:Object Relational Mapper,is the layer that sits between your database and your application. In Object -Oriented Programming, you work with Objects as your main point of reference.也就是说假如在数据库里面有一个表,那么在应用程序里面就有一个类与这个表相对应,类中的成员变量是数据库的列名,一个类的实例是数据库的一行数据。
- ActiveRecord:是一种模式。然后我们先来理解
Record
,字段,也就是数据库里面的一行数据。对于ORM来说,我们定义一个Model
类作为ORM的基类,然后继承这个ORM基类。
class User extends Model{
....
}
User user = new User();
user.setName("Ferrair");
user.save();
这样只需要直接的调用save()
方法,就会在数据库里面插入一条数据。而在基类Model里面,save()
方法封装了SQL语句。
对于Active
可以把它理解为持久的意思,也就是说与数据库是持久连接。
然后可以参考这些文章
什么是ActiveRecord
What’s the difference between Active Record and Data Mapper?(这里面还有一种思想叫Data-Mapper)
- POJO:什么是POJO(Plain Ordinary Java Object),即简单Java对象,关于POJO可以把它和JavaBean进行比较,POJO比JavaBean限制要多的多,一般在应用程序里面的与数据库映射的对象就叫POJO.在JFinal里面也就是继承Model
的类.
然后看看JFinal作者给出的图:
JFinal由Handler、Interceptor、Controller、Render、Plugin五大部分组成,以Action为参照,Handler处在扩展的最外围,Interceptor处在更贴近Action的周围,Controller承载Action处在扩展的中心,Render处于Action后端,Plugin处于在Action侧边位置。
在上面的图中首先一个Request过来进入到JFinalFiter
,然后运用了责任链的模式,将请求一层层的传递,直到ActionHandler
,在这里进行路由,路由到具体的Controller
,而对于Model
则是在Plugin
里面实现的.这一切进行好了之后,就可以使用Render
来渲染View
了。大致流程如上。
采用了下面的模式:
- DB + ActiveRecord
- Web MVC + ORM
- 责任链的设计模式
Jfinal初始化
首先在web.xml定义了JFinalFilter
,所以这个框架才可以被运行,在JFinalFilter
里面的init()
找到下面这些初始化的过程
temp = Class.forName(configClass).newInstance();
jfinalConfig = (JFinalConfig)temp; // 在web.xml得到具体的配置文件
jfinal.init(jfinalConfig, filterConfig.getServletContext()) // 真正的初始化过程
然后再去看看jfinal.init()
boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
this.servletContext = servletContext;
this.contextPath = servletContext.getContextPath();
initPathUtil();
Config.configJFinal(jfinalConfig); // start plugin and init log factory in this method
constants = Config.getConstants();
initActionMapping();
initHandler();
initRender();
initOreillyCos();
initTokenManager();
return true;
}
private void initTokenManager() {
ITokenCache tokenCache = constants.getTokenCache();