【Jfinal源码】第一章 com.jfinal.core.JFinalFilter(1)
时间:2022-04-27
本文章向大家介绍【Jfinal源码】第一章 com.jfinal.core.JFinalFilter(1),主要内容包括JFinalFilter 的init方法、Config类、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
前言: 首先在gitosc获取到jfinal的源码,本学习笔记使用的是jfinal2.2版本。
从web.xml开始,我们去学习jfinal是怎么从路由请求,到业务处理,最后的返回结果
源码下有示例的web.xml,整个框架的入口是JFinalFilter
<!--整个框架的入口-->
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>common.JFinalDemoConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JFinalFilter 的init方法
boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
this.servletContext = servletContext;
this.contextPath = servletContext.getContextPath();
// 初始化webRootpath
initPathUtil();
// 启动插件并初始化日志工厂(本章主要讲该部分)
Config.configJFinal(jfinalConfig);
constants = Config.getConstants();
initActionMapping();
initHandler();
initRender();
initOreillyCos();
initTokenManager();
return true;
}
Config类
- initPathUtil 获取webRootpath
- jfinalConfig.configConstant(constants);//调用实现类的配置信息初始化常量
* jfinalConfig实现类配置常量
*/
public void configConstant(Constants me) {
// 加载少量必要配置,随后可用getProperty(.)获取值
loadPropertyFile("a_little_config.txt");
}
/**
* loadPropertyFile会最终调用该方法
*/
public Properties loadPropertyFile(String fileName, String encoding) {
prop = new Prop(fileName, encoding);
return prop.getProperties();
}
/**
* @param fileName classpath目录下的文件名
* @param encoding 文件编码,默认UTF-8
*/
public Prop(String fileName, String encoding) {
InputStream inputStream = null;
try {
inputStream =Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName); // properties.load(Prop.class.getResourceAsStream(fileName));
if (inputStream == null)
throw new IllegalArgumentException("Properties file not found in classpath: " + fileName);
properties = new Properties();
properties.load(new InputStreamReader(inputStream, encoding));
} catch (IOException e) {
throw new RuntimeException("Error loading properties file.", e);
}finally {
if (inputStream != null)
try {
inputStream.close();
} catch (IOException e) {
LogKit.error(e.getMessage(), e);
}
}
}
3.initLoggerFactory();就是初始化logger,运用了工厂模式,有JdkLogger和Loger4jLogger
/**
* 默认使用log4j作为日志实现
*/
static void init() {
if (defaultLogFactory == null) {
try {
Class.forName("org.apache.log4j.Logger");
Class<?> log4jLogFactoryClass =Class.forName("com.jfinal.log.Log4jLogFactory");
defaultLogFactory = (ILogFactory)log4jLogFactoryClass.newInstance(); // return new Log4jLogFactory();
} catch (Exception e) {
defaultLogFactory = new JdkLogFactory();
}
}
}
4.jfinalConfig.configRoute(routes); 配置路由映射
/**
* 设置 controllerKey Controller viewPath 三者的映射关系
* 注意里面的这几个异常,经常会遇到
*/
public Routes add(String controllerKey, Class<? extends Controller> controllerClass, String viewPath) {
if (controllerKey == null)
throw new IllegalArgumentException(
"The controllerKey can not be null");
controllerKey = controllerKey.trim();
if ("".equals(controllerKey))
throw new IllegalArgumentException(
"The controllerKey can not be blank");
if (controllerClass == null)
throw new IllegalArgumentException(
"The controllerClass can not be null");
if (!controllerKey.startsWith("/"))
controllerKey = "/" + controllerKey;
if (map.containsKey(controllerKey))
throw new IllegalArgumentException(
"The controllerKey already exists: " + controllerKey);
map.put(controllerKey, controllerClass);
if (viewPath == null || "".equals(viewPath.trim())) // view path is
viewPath = controllerKey;
viewPath = viewPath.trim();
if (!viewPath.startsWith("/")) // "/" added to prefix
viewPath = "/" + viewPath;
if (!viewPath.endsWith("/")) // "/" added to postfix
viewPath = viewPath + "/";
// 获取配置的基础路径(在Constant中进行赋值)
if (baseViewPath != null) // support baseViewPath
viewPath = baseViewPath + viewPath;
// 得到 controller view 的映射
viewPathMap.put(controllerKey, viewPath);
return this;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 回文平方数 Palindromic Squares
- 双重回文数 Dual Palindromes
- 修理牛棚 Barn Repair
- 牛式 Prime Cryptarithm
- 解题报告(牛客OI周赛7-普及组)
- 号码锁 Combination Lock
- 数据结构回顾及展望(一)
- Spring Boot 整合 Quartz 实现 Java 定时任务的动态配置
- 数据结构回顾及展望(二)(3.22更新)
- Windows挂载CFS文件系统
- XMU oj Problem List
- Python入门笔记(安装及初步使用)
- python 入门笔记[语法基础(上)]
- 怎样解决 JavaScript 生态中第三方安全性问题?
- 【Hadoop 分布式部署 十:配置HDFS 的HA、启动HA中的各个守护进程】