文档章节

【Jfinal源码】第一章 com.jfinal.core.JFinalFilter(1)

冷冷gg
 冷冷gg
发布于 2016/12/11 19:32
字数 548
阅读 34
收藏 0

前言:
首先在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类

  1. initPathUtil 获取webRootpath
  2. 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;
}

© 著作权归作者所有

共有 人打赏支持
冷冷gg
粉丝 335
博文 110
码字总数 49926
作品 1
潍坊
UI设计师
JFinal极速开发实战教程新鲜出炉~

JFinal极速开发实战教程新鲜出炉~ [持续更新中...] JFinal框架让 IT 工程师发挥更大的潜能,实现更大价值,同时也希望 JFinal 工具力量能帮助正在创业的朋友们提升效率、降低成本从而实现创业...

山东-小木
2015/01/07
0
13
JFinal的基本配置和杏彩源码下载

1、web.xml中的配置 杏彩源码下载 jfinal企 娥:217 1793 408 com.jfinal.core.JFinalFilter configClass cn.sinodata.fabric.config.DemoConfig...

有但很小
07/09
0
0
手把手教你新建 jfinal 项目 (二)

前言:上一节,我们新建了一个jfinal 的项目。接下来,我们初步理解下jfinal 我们理解一个东西,肯定是从我们看到的开始。我们看到了页面,看到了我们访问的地址返回了Hello Jfinal World这个...

胡萝卜炒肉
2014/05/27
0
0
JFinal-Beetl-Shiro(JdbcRealm)-例子

JFinal-Shiro-JDBC-Demo http://git.oschina.net/yinjun622/JFinal-Shiro-JDBC-Demo 简单实现@JFinal与Shiro整合例子 1、工程通过Eclipse直接导入,部署到tomcat中; 2、新建jfinalshiro数据......

leon_rock
2014/02/27
0
12
JFinal针对ORACLE的timestamp字段解决办法

JFinal是个比较不错的的框架,但JFinal起源时使用mysql数据库,因此在对数据库支持方面还没有达到完美。 本人使用JFinal有一段时间的,由于项目的数据库普遍采用oracle,在使用oracle过程中遇...

真的农夫三拳
2013/06/23
0
6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

C++ gflags

gflags是google一个开源的处理命令行参数的库,相比getopt,更加容易使用。 定义参数 gflags主要支持的参数类型包括 DEFINEbool: boolean DEFINEint32: 32-bit integer DEFINEint64: 64-bit ...

SibylY
24分钟前
0
0
intellij IDEA Properties中文unicode转码问题

在IDEA中创建了properties文件,发现默认中文不会自动进行unicode转码。如下 在project settings - File Encoding,在标红的选项上打上勾,确定即可 效果图如下: unicode转码后效果...

muzi1994
25分钟前
0
0
Java IO类库之PipedWriter

一、PipedWriter介绍 PipedWriter是字符管道输出流,继承自Writer,功能与PipedOutputStream类似,通过与PipedReader组合使用实现类似管道的功能,在多线程环境下,一个线程使用PipedWriter...

老韭菜
29分钟前
0
0
精简分页组件(手写)

需要引入CSS(没错就是这4行) .pagelist { text-align: center; color: #666; width: 100%; clear: both; margin: 20px 0; padding-top: 20px }.pagelist a { color: #666; margin: 0 2px;......

AK灬
30分钟前
3
0
29 岁成为阿里巴巴 P8,工作前 5 年完成晋升 3 连跳,他如何做到?

泡泡是我的好朋友。今年 31 岁,毕业后就进了阿里巴巴,工作五年内从 P4 晋升至 P6、P7、P8。 和他很少聊到工作,但总觉得他有很棒的职场心得,应该分享出来,于是有了这次采访。希望对职场新...

Java填坑之路
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部