文档章节

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

冷冷gg
 冷冷gg
发布于 2016/12/11 19:32
字数 548
阅读 39
收藏 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
粉丝 386
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部