以下所有源码只截取了部分代码,标题即为类名

1、Web.xml

<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>

2、JFinalFilter

if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)

3、Jfinal

boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {

   Config.configJFinal(jfinalConfig); // start plugin and init log factory in this method

}

4、Config

static void configJFinal(JFinalConfig jfinalConfig) {

   jfinalConfig.configConstant(constants);             initLogFactory();

   jfinalConfig.configRoute(routes);

   jfinalConfig.configPlugin(plugins);                startPlugins();    // very important!!!

   jfinalConfig.configInterceptor(interceptors);

   jfinalConfig.configHandler(handlers);

}

加载jfinalConfig配置文件

5、jfinalConfig

public void configRoute(Routes me) {

   //增加自定义route

   me.add(new ApiRoute());

6、  Routes

public Routes add(Routes routes) {

   if (routes != null) {

      routes.config();   // very important!!!

      for (Entry<String, Class<? extends Controller>> e : routes.map.entrySet()) {

         String controllerKey = e.getKey();

         if (this.map.containsKey(controllerKey)) {

            throw new IllegalArgumentException("The controllerKey already exists: " + controllerKey); 

         }

         this.map.put(controllerKey, e.getValue());

         this.viewPathMap.put(controllerKey, routes.getViewPath(controllerKey));

      }

   }

   return this;

}

7、JFinalFilter

加载完jfinalConfig回到JFinalFilter

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

try {

   handler.handle(target, request, response, isHandled);

}

// handler.handle(target, request, response, isHandled);是整个Filter最核心的方法

这里的handlre来自JFinalFilter.init方法中52行handler=jfinal.getHandler();

8、Jfinal

private void initHandler() {

   Handler actionHandler = new ActionHandler(actionMapping, constants);

   handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler);

}

handler是由HandlerFactory的getHandler方法得来的,此处使用handler子类ActionHandler,并且传进去了有两个参数,一个是ActionMapping类的变量,一个是constants。

ActionMapping在ActionMapping中定义了一个路由(routes)和一个Interceptors,这个routes类里面主要的核心是两个Map,主要处理处理一些关于ActionMapping中对应的ControllerKey与Controller.class的事情。看下ActionHandler

9、ActionHandler

  1)、根据ActionMapping获得相应的Action,

Action action = actionMapping.getAction(target, urlPara);

  2)、然后利用反射进行方法的调用,最后把结果映射到相应的页面上去

new Invocation(action, controller).invoke();

Jfinal启动原理及源码简析的更多相关文章

  1. Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析

    一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...

  2. SpringMVC学习(一)——概念、流程图、源码简析

    学习资料:开涛的<跟我学SpringMVC.pdf> 众所周知,springMVC是比较常用的web框架,通常整合spring使用.这里抛开spring,单纯的对springMVC做一下总 ...

  3. django-jwt token校验源码简析

    一. jwt token校验源码简析 1.1 前言 之前使用jwt签发了token,里面的头部包含了加密的方式.是否有签名等,而载荷中包含用户名.用户主键.过期时间等信息,最后的签名还使用了摘要算法进 ...

  4. 0002 - Spring MVC 拦截器源码简析:拦截器加载与执行

    1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日 ...

  5. OpenStack之Glance源码简析

    Glance简介 OpenStack镜像服务器是一套虚拟机镜像发现.注册.检索. glance架构图: Glance源码结构: glance/api:主要负责接收响应镜像管理命令的Restful请求, ...

  6. 源码简析XXL-JOB的注册和执行过程

    一,前言 XXL-JOB是一个优秀的国产开源分布式任务调度平台,他有着自己的一套调度注册中心,提供了丰富的调度和阻塞策略等,这些都是可视化的操作,使用起来十分方便. 由于是国产的,所以上手还是比较快的 ...

  7. AFNetworking源码简析

    AFNetworking基本是苹果开发中网络请求库的标配,它是一个轻量级的网络库,专门针对iOS和OS X的网络应用设计,具有模块化的架构和丰富的APIs接口,功能强大并且使用简单,深受苹果应用开发人 ...

  8. spring ioc源码简析

    ClassPathXmlApplicationContext 首先我们先从平时启动spring常用的ClassPathXmlApplicationContext开始解析 ApplicationCont ...

  9. ElementUI 源码简析——源码结构篇

    ElementUI 作为当前运用的最广的 Vue PC 端组件库,很多 Vue 组件库的架构都是参照 ElementUI 做的.作为一个有梦想的前端(咸鱼),当然需要好好学习一番这套比较成熟的架构. ...

随机推荐

  1. linux root修改密码失败

    问题: 当使用root修改密码时,报错passwd:Authentication token manipulation error 解决: 1.查看是否权限问题, /etc/passwd /etc/s ...

  2. url 地址处理(截取,参数等)

    function hrefObj() { var localhref = window.location.href; var localarr = localhref.split('?')[1].sp ...

  3. Leetcode题解(七)

    24.Swap Nodes in Pairs 题目 看到此题,第一想法是利用两个指针,分别将其所指向的节点的value交换.然后同时向后移动2个节点,代码如下: struct ListNode { i ...

  4. IdentityServer4实现Token认证登录以及权限控制

    相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的:小菜学习编程-IdentityServer4 晓晨Master:Ide ...

  5. Unity 游戏框架搭建 (七) 减少加班利器-QApp类

    本来这周想介绍一些框架中自认为比较好用的小工具的,但是发现很多小工具都依赖一个类----App. App类的职责: 1.接收Unity的生命周期事件. 2.做为游戏的入口. 3.一些框架级别的组件初始 ...

  6. 利用win10自带的系统配置禁止开机启动项和程序

    一.利用win10自带的系统配置禁止开机启动项和程序     首先打开"运行"对话框,可以通过开始菜单打开运行,也可以按下快捷键WIN+R打开"运行".如下图. ...

  7. 基于.net的通用内存缓存模型组件

    谈到缓存,我们自然而然就会想到缓存的好处,比如: 降低高并发数据读取的系统压力:静态数据访问.动态数据访问 存储预处理数据,提升系统响应速度和TPS 降低高并发数据写入的系统压力 提升系统可用性,后台 ...

  8. Luogu P2183 巧克力

    题目描述 佳佳邀请了M个同学到家里玩.为了招待客人,她需要将巧克力分给她的好朋友们.她有N(1<=N<=5000)块巧克力,但是大小各不一样,第i块巧克力大小为为1*Xi(1<=i& ...

  9. 【吐槽】关于256个 class可以覆盖一个id的问题

    还是说今天下午面试的事情,被面试官问了 40多分钟的问题,我觉得丫 一定是从哪个网站down了几份面试题,自个儿整合了一下,然后挨个问,刚开始感觉哟,不错哦,面试官懂的蛮多的. 然后问到某个问题之后, ...

  10. 【深度学习笔记】(一)TensorFlow安装及环境搭建

    在学习了一段时间台大李宏毅关于deep learning的课程,以及一些其他机器学习的书之后,终于打算开始动手进行一些实践了. 感觉保完研之后散养状态下,学习效率太低了,于是便想白天学习,晚上对白天学 ...