JFinal 初始化过程浅析

从 web 容器进行初始化。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  3. <filter>
  4. <filter-name>jfinal</filter-name>
  5. <filter-class>com.jfinal.core.JFinalFilter</filter-class>
  6. <init-param>
  7. <param-name>configClass</param-name>
  8. <param-value>com.fw.config.MppConfig</param-value>
  9. </init-param>
  10. </filter>
  11. <filter-mapping>
  12. <filter-name>jfinal</filter-name>
  13. <url-pattern>/*</url-pattern>
  14. </filter-mapping>
  15. </web-app>

从 web.xml 可以看出,容器初始化的时候会加载 JFinalFilter 这个类(调用其 init 方法)。下面来看看 JFinalFilter 类做了些什么。

  1. public final class JFinalFilter implements Filter {
  2. private Handler handler;
  3. private String encoding;
  4. private JFinalConfig jfinalConfig;
  5. private Constants constants;
  6. private static final JFinal jfinal = JFinal.me();
  7. private static Log log;
  8. private int contextPathLength;
  9. public void init(FilterConfig filterConfig) throws ServletException {
  10. createJFinalConfig(filterConfig.getInitParameter("configClass"));
  11. if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)
  12. throw new RuntimeException("JFinal init error!");
  13. handler = jfinal.getHandler();
  14. constants = Config.getConstants();
  15. encoding = constants.getEncoding();
  16. jfinalConfig.afterJFinalStart();
  17. String contextPath = filterConfig.getServletContext().getContextPath();
  18. contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());
  19. }
  20. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
  21. HttpServletRequest request = (HttpServletRequest)req;
  22. HttpServletResponse response = (HttpServletResponse)res;
  23. request.setCharacterEncoding(encoding);
  24. String target = request.getRequestURI();
  25. if (contextPathLength != 0)
  26. target = target.substring(contextPathLength);
  27. boolean[] isHandled = {false};
  28. try {
  29. handler.handle(target, request, response, isHandled);
  30. }
  31. catch (Exception e) {
  32. if (log.isErrorEnabled()) {
  33. String qs = request.getQueryString();
  34. log.error(qs == null ? target : target + "?" + qs, e);
  35. }
  36. }
  37. if (isHandled[0] == false)
  38. chain.doFilter(request, response);
  39. }
  40. public void destroy() {
  41. jfinalConfig.beforeJFinalStop();
  42. jfinal.stopPlugins();
  43. }
  44. private void createJFinalConfig(String configClass) {
  45. if (configClass == null)
  46. throw new RuntimeException("Please set configClass parameter of JFinalFilter in web.xml");
  47. Object temp = null;
  48. try {
  49. temp = Class.forName(configClass).newInstance();
  50. } catch (Exception e) {
  51. throw new RuntimeException("Can not create instance of class: " + configClass, e);
  52. }
  53. if (temp instanceof JFinalConfig)
  54. jfinalConfig = (JFinalConfig)temp;
  55. else
  56. throw new RuntimeException("Can not create instance of class: " + configClass + ". Please check the config in web.xml");
  57. }
  58. static void initLog() {
  59. log = Log.getLog(JFinalFilter.class);
  60. }
  61. }

1. createJFinalConfig 创建自定义配置类的一个实例

这个方法中的参数正是 web.xml 中的 JFinalFilter 的初始化参数,它继承于 JFinalConfig。

调用此方法会创建出一个 JFinalConfig 实例。

2. jfinal.init 加载配置并且初始化各个 JFinal 组件

代码如下:

  1. boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
  2. this.servletContext = servletContext;
  3. this.contextPath = servletContext.getContextPath();
  4. initPathUtil();
  5. Config.configJFinal(jfinalConfig);
  6. constants = Config.getConstants();
  7. initActionMapping();
  8. initHandler();
  9. initRender();
  10. initOreillyCos();
  11. initTokenManager();
  12. return true;
  13. }

(1) 初始化项目根路径 contextPath

(2) Config.configJFinal 加载自定义配置(配置常量、添加 handler、添加 routes、添加插件、开启插件、添加 Interceptor),代码如下:

  1. static void configJFinal(JFinalConfig jfinalConfig) {
  2. jfinalConfig.configConstant(constants); initLogFactory();
  3. jfinalConfig.configRoute(routes);
  4. jfinalConfig.configPlugin(plugins); startPlugins(); // very important!!!
  5. jfinalConfig.configInterceptor(interceptors);
  6. jfinalConfig.configHandler(handlers);
  7. }
  1. public class MppConfig extends JFinalConfig {
  2. //配置常量
  3. public void configConstant(Constants me) {
  4. PropKit.use("jdbc.properties");
  5. me.setDevMode(PropKit.getBoolean("devMode", false));
  6. }
  7. //配置路由
  8. public void configRoute(Routes me) {
  9. me.add(new RoutesMapping());
  10. }
  11. public static C3p0Plugin createC3p0Plugin() {
  12. return new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
  13. }
  14. //配置插件
  15. public void configPlugin(Plugins me) {
  16. // 配置C3p0数据库连接池插件
  17. C3p0Plugin C3p0Plugin = createC3p0Plugin();
  18. me.add(C3p0Plugin);
  19. // 配置ActiveRecord插件
  20. ActiveRecordPlugin arp = new ActiveRecordPlugin(C3p0Plugin);
  21. me.add(arp);
  22. // 配置属性名(字段名)大小写不敏感容器工厂 oracle
  23. arp.setContainerFactory(new CaseInsensitiveContainerFactory());
  24. //缓存插件
  25. me.add(new EhCachePlugin());
  26. // 所有配置在 MappingKit 中搞定
  27. ModelMapping.mapping(arp);
  28. }
  29. //配置全局拦截器
  30. public void configInterceptor(Interceptors me) {
  31. me.add(new SessionInViewInterceptor());//session拦截器,用于在View模板中取出session值
  32. }
  33. //配置处理器,接管所有 web 请求
  34. public void configHandler(Handlers me) {
  35. me.add(new ContextPathHandler("contextPath"));//设置上下文路径
  36. }
  37. //系统启动完成后回调,如创建调度线程
  38. public void afterJFinalStart(){}
  39. //系统关闭前回调,如写回缓存
  40. public void beforeJFinalStop(){}
  41. }

(3) 初始化 ActionMapping、Handler、Render、等。

来自为知笔记(Wiz)

时间: 2024-10-06 07:35:39

JFinal 初始化过程浅析的相关文章

MySQL redo log及recover过程浅析

写在前面:作者水平有限,欢迎不吝赐教,一切以最新源码为准. InnoDB redo log 首先介绍下Innodb redo log是什么,为什么需要记录redo log,以及redo log的作用都有哪些.这些作为常识,只是为了本文完整. InnoDB有buffer pool(简称bp).bp是数据库页面的缓存,对InnoDB的任何修改操作都会首先在bp的page上进行,然后这样的页面将被标记为dirty并被放到专门的flush list上,后续将由master thread或专门的刷脏线程阶

Android应用程序包解析过程浅析

我在上一篇文件中Android应用程序安装过程浅析粗略分析了一下Android应用程序安装过程,其中有一步说到了apk包的解析,但是没有详细分析,这里我们就来粗略分析一下包的解析过程. 流程图 执行过程 从上面的流程图可以看到,包的解析过程比安装过程执行步骤少很多,也简单一点.那我们就来详细的一步一步的进行剖析一下,我们从外部调用该方法开始分析: private void installPackageLI(InstallArgs args, PackageInstalledInfo res) {

java代码的初始化过程研究

刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻--)但是博主写的不够详细具体,我想在这详细谈一下java代码的具体初始化过程. 首先要清楚,初始化分为两个过程:类初始化.对象初始化. 类初始化是指类加载器将类加载到内存时,对类成员的初始化过程,也就是有static修饰的变量.对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了.比如int类型就是0

JAVA对象的初始化过程

出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1:   编译并运行该程序会有以下输出 Static Block Employee Company:china soft Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() 下面我们来对结果做分析: 1 在代码34行实例化对象时, 先对给

Java对象相关元素的初始化过程

1.类的成员变量.构造函数.成员方法的初始化过程 当一个类使用new关键字来创建新的对象的时候,比如Person per = new Person();JVM根据Person()寻找匹配的类,然后找到这个类相匹配的构造方法,这里是无参构造,如果程序中没有给出任何构造方法,则JVM默认会给出一个无参构造.当创建一个对象的时候一定对调用该类的构造方法,构造方法就是为了对对象的数据进行初始化.JVM会对给这个对象分配内存空间,也就是对类的成员变量进行分配内存空间,如果类中在定义成员变量就赋值的话,就按

对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】

转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 对于一般的CAN模块,进行初始化时,最关键的是以下两步: 1.  配置CAN的位时序: 2.  配置CAN的消息报文: 下面,我们来详细分析上面提到的关键两步. 一.初始化步骤: 1.  第一步,进入初始化模式,在CAN控制寄存器中,将Init位置1: 2.  第二步,在CAN控制寄存器中,将CCE位置1: 3.  第三步,等待Init位置1,此步聚为了确保已经进入初始化模式: 4.  第四步,将位时序的值写入到

IOC容器的初始化过程

1.ClassPathXmlApplicationContext类体系结构 左边的黄色部分是ApplicationContext体系继承结构,右边是BeanFactory结构体系,两个体系是典型的模板方法设计模式的使用. 从该继承体系可以看出: (1)BeanFactory是一个bean工厂的最基本定义,里面包含了一个bean工厂的几个最基本方法:getBean(),containsBean()等,是一个很纯粹的bean工厂,不关注资源.资源位置.事件等. ApplicationContext是

Java初始化过程

以下程序执行的结果是: class X{ Y y=new Y(); public X(){ System.out.print("X"); } } class Y{ public Y(){ System.out.print("Y"); } } public class Z extends X{ Y y=new Y(); public Z(){ System.out.print("Z"); } public static void main(Stri

启动期间的内存管理之初始化过程概述----Linux内存管理(九)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的boot阶段就是系统初始化阶段使用的内存分配器. 1 前景回顾 1.1