- 前言
- 启动类
- 核心过滤器:JFinalFilter
- 核心初始化类:JFinal
- 总结
1.前言
JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。 – 百度百科
写这篇文档的时候特意去知乎逛了一下,果然小众的框架还是没有被主流接受,毕竟现在还是spring一统天下的时期。
但我觉得它有它的优势。作为一个新手玩家,它的学习成本确实很低。我依然记得大学那会磨了一天也不知道SSM整合的时候哪里出了问题,我想如果那时候会jfinal,写课程设计或毕业设计应该会轻松些吧。虽说有springboot后免去了XML配置,但前提还是要会spring,mybatis的啊。jfinal封装比较浅,所以才会有读源码的欲望,里面一些设计也确实受益匪浅。
另我更惊呀的是在社区提交的问题很快就能得到詹总(jfinal作者)回复。
贴出官网地址: JFinal文档 很详细。
2.启动类
jetty服务器启动方式(undertow是另外一种)
public static void main(String[] args) {
JFinal.start("src/main/webapp", 80, "/", 5);
}
为了简化开发,jfinal封装集成了jetty服务器,使得可以main方法启动服务器,springboot的SpringApplication.run应该是同样的道理。这里先不展开讨论,等我研究好了再写一篇专门讨论jfinal-jetty原理。
3.核心过滤器:JFinalFilter
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>cn.lang.common.TestConfig</param-value>
</init-param>
</filter>
javaweb三大组件之一的filter过滤器的生命周期方法init()是在服务器启动时被执行。
以下JFinalFilter类仅仅引入了核心代码
public class JFinalFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
if (jfinalConfig == null) {
//<1> 反射得到jfinalConfig对象
createJFinalConfig(filterConfig.getInitParameter("configClass"));
}
//<2> 整个初始化核心方法
jfinal.init(jfinalConfig, filterConfig.getServletContext());
//<3> 拿到应用名称以及应用名长度
String contextPath = filterConfig.getServletContext().getContextPath();
contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());
constants = Config.getConstants();
encoding = constants.getEncoding();
//<4> 启动后的jfinal后的回调
jfinalConfig.onStart();
//<5> 和4一样的作用 为兼容以前版本
jfinalConfig.afterJFinalStart();
//<6> 处理请求的对象
handler = jfinal.getHandler(); // 开始接受请求
}
}
- <1> 获取到我们web.xml中配置的全类名
cn.lang.common.TestConfig 再通过createJFinalConfig()方法反射得到TestConfig的实例对象jfinalConfig - <2> 整个初始化的核心方法,后续会展开讲
- <3> 拿到应用名称以及应用名长度,后续路由映射controller中的方法需要排除掉url中的应用名影响
- <4><5> 用户可重写配置类JFinalConfig中的onStart()方法, jfinal启动初始化完后在这里调用用户重写的onStart()方法
- <6> 获取到初始化后的handler对象,挂载到JFinalFilter类全局变量上, 用于在doFilter()中调用处理后续的每个请求。
4.核心初始化类:JFinal
接上一步的<2> 执行jfinal对象的init()方法
本类主要处理服务器启动时的初始化,以及提供jetty的main方法启动方式。
public