文档章节

jfinal学习笔记02 源码解读JFinalFilter

学海无涯_
 学海无涯_
发布于 2017/05/04 13:53
字数 360
阅读 37
收藏 0

当运行起来后,我们可以看看如此短小精悍的神器的原理是什么?肯定会有人有疑惑。下面我们来初步学习一下。

首先看web.xml , 可以看到他只有一个filter(过滤器)。 可以肯定他的核心是filter(过滤器)构成的。

/**
 * JFinal framework filter
 */
public class JFinalFilter implements Filter {
	
	private Handler handler;
	private String encoding;
	private JFinalConfig jfinalConfig;
	private Constants constants;
	private static final JFinal jfinal = JFinal.me();
	private static Log log;
	private int contextPathLength;

	//方法在 Filter 生命周期中仅执行一次,web 容器在调用 init 方法时
	public void init(FilterConfig filterConfig) throws ServletException {
        //从web.xml里读取configClass参数,并初始化jfinalConfig这个类
		createJFinalConfig(filterConfig.getInitParameter("configClass"));
		//初始化一些参数配置
		if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false) {
			throw new RuntimeException("JFinal init error!");
		}
		
		handler = jfinal.getHandler();
		constants = Config.getConstants();
		encoding = constants.getEncoding();
		jfinalConfig.afterJFinalStart();
		
		String contextPath = filterConfig.getServletContext().getContextPath();
		contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());
	}
	
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)res;
		request.setCharacterEncoding(encoding);
		
		String target = request.getRequestURI();
		if (contextPathLength != 0) {
			target = target.substring(contextPathLength);
		}
		
		boolean[] isHandled = {false};
		try {
			handler.handle(target, request, response, isHandled);
		}
		catch (Exception e) {
			if (log.isErrorEnabled()) {
				String qs = request.getQueryString();
				log.error(qs == null ? target : target + "?" + qs, e);
			}
		}
		
		if (isHandled[0] == false) {
			chain.doFilter(request, response);
		}
	}
	
	public void destroy() {
		jfinalConfig.beforeJFinalStop();
		jfinal.stopPlugins();
	}
	
	private void createJFinalConfig(String configClass) {
		if (configClass == null) {
			throw new RuntimeException("Please set configClass parameter of JFinalFilter in web.xml");
		}
		
		Object temp = null;
		try {
			temp = Class.forName(configClass).newInstance();
		} catch (Exception e) {
			throw new RuntimeException("Can not create instance of class: " + configClass, e);
		}
		
		if (temp instanceof JFinalConfig) {
			jfinalConfig = (JFinalConfig)temp;
		} else {
			throw new RuntimeException("Can not create instance of class: " + configClass + ". Please check the config in web.xml");
		}
	}
	
	static void initLog() {
		log = Log.getLog(JFinalFilter.class);
	}
}

概念解读

Filter  : https://my.oschina.net/u/1178126/blog/892195

 

 

 

 

 

© 著作权归作者所有

学海无涯_
粉丝 15
博文 111
码字总数 53170
作品 0
邯郸
私信 提问
关于JFinal的JFinalFilter的一个小建议

@JFinal 之前有个朋友说他的Tomcat下有多个Web工程,都是使用JFinal,所以想把JFinal的包统一放在Tomcat的lib下去,发现启动的时候报异常说JFinalFilter在初始化的时候找不到他Webapp这边自定...

逝水fox
2013/09/29
1K
5
JFinal2.0开启Server后启动其他插件

最近同事在搞JFinal动态添加数据源配置,多亏了JFinal2.0的出现,才很方便的解决了这个问题。 我看他代码时,无意中发现插件还需要调用start()方法,于是就思考在总配置类里面配置插件之后是...

夜辰
2015/07/04
0
0
JFinal启动过程

@JFinal 你好,想跟你请教个问题:你好,最近有幸用JFinal做项目,想请问一下,JFinal的具体启动流程是如何的?SysConfig继承JFinalConfig,JFinal,JFinalFilter等类的启动过程的流程是如何...

有梦想的小孩
2013/05/14
686
6
JFinal源码中,JFinalFilter中doFilter内isHandled[0]的作用是?

JFinal源码中,JFinalFilter中doFilter内isHandled[0]的作用是?

osrchina
2012/06/10
356
2
JFinal项目成功部署到SAE之后,上传文件出现问题

@JFinal 你好,想跟你请教个问题: JFinal项目成功部署到SAE之后,上传文件出现问题: 这是错误日志: 相关代码: 之前本地测试上传图片保存至七牛上,是没有问题的,部署至SAE上之后,修改了...

chris_hellowoo
2015/04/28
204
2

没有更多内容

加载失败,请刷新页面

加载更多

java版spring cloud+spring boot+redis多租户社交电子商务平台(五)springboot整合 beatlsql

Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六。BeetSql是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求...

sccspuercode
20分钟前
3
0
SSM MySql数据导出到Excel

语言:java 框架:SSM 工程:maven 工具类:ExcelUtils.java 工具类下载地址:https://download.csdn.net/download/ledzcl/10234291 备注:本下载地址来源CSDN的dedzcl的博客(连接:https:/...

隔壁吃西瓜
24分钟前
1
0
OSChina 周四乱弹 —— 快把你男友们收走

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享Delacey的单曲《Dream It Possible》: 挺喜欢华为这首歌的 《Dream It Possible》- Delacey 手机党少年们想听歌,请使劲儿戳(...

小小编辑
46分钟前
832
15
归并排序

import java.util.Arrays;/** * Created by chengxiao on 2016/12/8. */public class MergeSort { public static void main(String []args){ int []arr = {9,8,7,6,......

暗中观察
今天
3
0
面试爱奇艺,竟然挂在第5轮……

今天给大家分享我曾经在爱奇艺的面试,过程还是比较有意思的,可以给大家一些参考 <br> 聊骚阶段 嗲妹妹:你好,我是爱奇艺的HR,我们正在招聘运维开发岗位,请问您最近有在看工作机会吗? ...

上海小胖
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部