JFinal 学习笔记

HandlerFactory

  HandlerFactory是不可实例化的,因为 它的构造 函数 特意定位 私有 的;它有一个 静态的方法叫做 getHandler,它有两个参数 ,一个是Handler的List类型,另一个是一个单一的handler,代码如下 :

	public static Handler getHandler(List<Handler> handlerList, Handler actionHandler) {
		Handler result = actionHandler;

		for (int i=handlerList.size()-1; i>=0; i--) {
			Handler temp = handlerList.get(i);
			temp.next = result;
			temp.nextHandler = result;
			result = temp;
		}

		return result;
	}

  如上代码所示 ,从 最后一个 开始 循环 ,然后 把它的next都 赋值 为 第二个参数 的Handler,然后最后 返回 的Handler为第一个参数List中 第一个元素,并 带上了next参数 。使用它的地方就是JFinal的initHandler方法。

    private void initHandler() {
        Handler actionHandler = new ActionHandler(actionMapping, constants);
        handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler);
    }

  不过 我有一点疑问,这个 getHandlerList()方法,能带给 我真正的List吗 ?因为我看 没有 地方 去add它,也就是说,这 个List永远只是 一个 size为 0的List,不知道@JFinal  怎么看这个问题,求解。

Handler

  我们 先来 看看 代码 ,这是 一个 抽象类,其中 nextHandler 被 标记为过时的,也就是说 已经 没多少地方用到 了。

public abstract class Handler {

    /**
     * The next handler
     */
    protected Handler next;

    /**
     * Use next instead of nextHandler
     */
    @Deprecated
    protected Handler nextHandler;

    /**
     * Handle target
     * @param target url target of this web http request
     * @param request HttpServletRequest of this http request
     * @param response HttpServletRequest of this http request
     * @param isHandled JFinalFilter will invoke doFilter() method if isHandled[0] == false,
     *             it is usually to tell Filter should handle the static resource.
     */
    public abstract void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled);
}

  关键 是看 上面的handle方法,这是一个 抽象方法。这里面 包含了ServletRequest和Response,以及 一个 boolean数组 ,标识是否 被处理 过,我觉得 熟悉代码 还是 要 从 它的实现来分层 发散,所以 下面 的都是 它的实现类。

ActionHandler

  这个类继承了上面 说的Handler类,首先我们 上 几个属性 ,下面几个 属性我们 需要 关心哪些东西 呢?首先 是ActionMapping和RenderManager,其中ActionMapping是通过 构造函数 注入进来的。而RenderManager.me其实 只是一个RenderManager的一个实例而已,

    private final boolean devMode;
    private final ActionMapping actionMapping;
    private static final RenderManager renderManager = RenderManager.me();
    private static final Log log = Log.getLog(ActionHandler.class);

    public ActionHandler(ActionMapping actionMapping, Constants constants) {
        this.actionMapping = actionMapping;
        this.devMode = constants.getDevMode();
    }

  说到RenderManager.me(),不得 不佩服 JFinal里面的一个 经常看到的东西 ,下面 贴代码 ,下面的代码 在 JFinal里面经常被 复用,他的作用 其实就是创建一个 实例 的单利 ,而且这个实例是 随着 Tomcat进程启动的。

    private static final RenderManager me = new RenderManager();
    private RenderManager() {}

    public static RenderManager me() {
        return me;
    }

  下面 我们 来 看看 其中 的核心 方法handle,在了解 这个之前,我 觉得 还是有 必要看看有 哪些地方引用 到了这个ActionHandler,经过查找 ,发现还是这个地方:

Handler actionHandler = new ActionHandler(actionMapping, constants);

  那么 我们的集中点就是 这个actionMapping了,我们 必须知道这里面 的实体 的结构 ,经过发现,在JFinal.java当中的me()方法中有一个方法 可以初始化。

private void initActionMapping() {
        actionMapping = new ActionMapping(Config.getRoutes(), Config.getInterceptors());
        actionMapping.buildActionMapping();
        Config.getRoutes().clear();
    }

  从上面的代码 当中,我们 可以 知道 几个地方 ,ActionMapping肯定是和route和intercertor(拦截器 )相关联的,我们 进入 ActionMapping的构造函数一探究竟,发现作者已经注释掉 了 第二个 参数 。

    ActionMapping(Routes routes, Interceptors interceptors) {
        this.routes = routes;
        // this.interceptors = interceptors;
    }

   我们再来看看 handle方法:

        if (target.indexOf(‘.‘) != -1) {
            return ;
        }

        isHandled[0] = true;
        String[] urlPara = {null};
        Action action = actionMapping.getAction(target, urlPara);

  首先如果 target包含.的 话 直接 结束,如果通过,把第一个isHandleed的布尔参数设置为 true.下面 我们 来 看看 getAction方法,

Action getAction(String url, String[] urlPara) {
        Action action = mapping.get(url);
        if (action != null) {
            return action;
        }

        // --------
        int i = url.lastIndexOf(‘/‘);
        if (i != -1) {
            action = mapping.get(url.substring(0, i));
            urlPara[0] = url.substring(i + 1);
        }

        return action;
    }

  我们 再来 看看 mapping这个属性,其实 从 上面 下面 的代码我们可以 看书,target-url中可以获取 这个target的action.

private final Map<String, Action> mapping = new HashMap<String, Action>();

 今天 就 写到这里,未完待续。。。

时间: 2024-12-13 20:57:46

JFinal 学习笔记的相关文章

JFinal学习笔记

[原]JFinal学习笔记(一) 在Tomcat下的JFinal环境配置 2014-12-23阅读180 评论0 最近打算做一个属于我自己的个人网站,本来打算使用微软的.NET来进行开发的,但是听朋友说有一个基于java的开源框架JFinal和.NET的开发模式很像,同时兼备了.NET快速开发和java安全性两方面的优点.出于好奇本人打算学习一下JFinal框架,看看是不是真的这么神. 同时这次我将对我学习的每个重要的步骤或者遇到的问题都在博客中详细的记录,主要是为自己做个学习笔记,防止以后一段

【原】jFinal学习笔记(01)Hello World

jFinal是一个非常优秀的轻量级框架,理论上看看框架文档就可以上手了.不过对于我这样Java基本不懂的来说,还是需要一点一点摸索使用.这个系列的学习笔记可能是史上最简单.最傻瓜的jFinal学习笔记了^_^. 1.开发工具准备: ① JDK 1.7.0_65:如果安装后不知道如何配置,可以查看Java分类下的JDK设置文章 ② Myeclipse 8.5:因为Java IDE都不熟悉,所以选择了这个听说集成诸多功能的利器 ③ jFinal框架文件:jetty-server-8.1.8.jar.

JFinal学习笔记(一) 在Tomcat下的JFinal环境配置

最近打算做一个属于我自己的个人网站,本来打算使用微软的.NET来进行开发的,但是听朋友说有一个基于java的开源框架JFinal和.NET的开发模式很像,同时兼备了.NET快速开发和java安全性两方面的优点.出于好奇本人打算学习一下JFinal框架,看看是不是真的这么神. 同时这次我将对我学习的每个重要的步骤或者遇到的问题都在博客中详细的记录,主要是为自己做个学习笔记,防止以后一段时间不用后会遗忘.话说我以前怎么就没有写博客的习惯,之前经常发生一些开发技术一段时间不用后就不会用的乌龙,怨念啊.

[学习笔记]--Jfinal 表单提交附件

最近,项目里面用到了Jfinal 里面的上传附件.Jfinal 的Controller 里面提供了一个 getFile系列方法提供文件上传. 我这里呢,是文件上传和表单参数一起提交.页面类似下图: 这里form表单里面使用了 enctype="multipart/form-data" .先看看Jfinal手册的说明吧!大家看了就知道了 然后还有个问题 如果是表单提交 还不可以用ajax 提交,具体的原因呢也找到了 http://www.oschina.net/question/9410

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件