JFinal初识
JFinal
了解JFinal
JFinal是什么?
JFinal 是基于Java 语言的极速web 开发框架,其核心设计目标是开 发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、 Restful。
JFinal 项目开发始于2011年初,作者詹波(James Zhan)开发。项 目开源于2012年3月18日,采用对商业应用友好的Apache Licence 2.0协议。
基于微内核+全方位扩展型架构,打造功能极度全面WEB+ORM开发 框架。彻底解放开发者的生产力,彻底改善开发者的开发体验,让 软件开发成为一件轻松愉快的事情。
JFinal的系统架构
JFinal 采用微内核全方位扩展架构,全方位是指其扩展方式在空间上的表现形式。 JFinal由Handler、Interceptor、Controller、Render、Plugin五大部分组成。
- 遵循COC原则,零配置,无xml
- ActiveRecord支持,使数据库开发极致快速
- 自动加载修改后的java文件,开发过程中无需重启web server
- AOP支持,拦截器配置灵活,功能强大
- Plugin体系结构,扩展性强
- 多视图支持,支持FreeMarker、JSP、Velocity
- 强大的Validator后端校验功能
- 功能齐全,拥有struts2的绝大部分功能
- 体积小仅218K,且无第三方依赖
JFinal可以做什么
目前学习和使用JFinal极速web开发框架的个人开发者或者公司团队已经 非常多了,项目类型范围涵盖也比较多. 常见的:后台管理系统, 电商网站, 金融系统, 校务管理, 进销存系统, ERP系统, 游戏后台维护支撑系统, 微信小程序社区俱乐部等。
JFinal入门案例
开发 jfinal 项目建议使用 maven,而不是使用传统手工的方式去管理 jar 包和构建项目。
1.创建maven项目
选择需要的web模板,创建maven项目
创建一个Maven项目
在项目src --> main --> 创建 java 、resources、 webapp 目录
pom.xml 文件中导入Jfinall的依赖包
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>5.0.8</version>
</dependency>
创建一个带main的JFinal配置类
案例: DemoConfig的一个配置类
要继承 JFinalConfig 类
在main方法中启动UndertowServer服务
start方法参数: 加载的类 端口号 是否支持热加载
public class My_Config extends JFinalConfig{
@Override
public void configConstant(Constants me) {
me.setInjectDependency(true);
me.setDevMode(true);
}
@Override
public void configRoute(Routes me) {
me.scan("com.ape.view.");
}
@Override
public void configEngine(Engine me) {
// TODO Auto-generated method stub
}
@Override
public void configPlugin(Plugins me) {
// TODO Auto-generated method stub
}
@Override
public void configInterceptor(Interceptors me) {
me.add(new SessionInViewInterceptor());
}
@Override
public void configHandler(Handlers me) {
// TODO Auto-generated method stub
}
}
创建一个控制器类
HelloController
要继承 Controller
定义一个index方法
renderText()
方法响应用户内容
定义@Path 用户的访问路径
创建带main的java类,启动并通过浏览器访问
public class Run {
public static void main(String[] args) {
UndertowServer.start(My_Config.class,80,true);
}
}
配置类 JFinalConfig
基于JFinal的web项目需要创建一个继承自JFinalConfig类的子类,该类用于对整个web项 目进行配置。
JFinalConfig子类需要实现六个抽象方法:
配置类中configConstant方法
此方法用来配置JFinal常量值:
// 配置开发模式,true 值为开发模式
me.setDevMode(true);
// 配置 aop 代理使用 cglib,否则将使用 jfinal 默认的动态编译代理方案 me.setToCglibProxyFactory();
// 配置依赖注入
me.setInjectDependency(true);
// 配置依赖注入时,是否对被注入类的超类进行注入
me.setInjectSuperClass(false);
// 配置基础下载路径,默认为 webapp 下的 download
me.setBaseDownloadPath(...);
// 配置基础上传路径,默认为 webapp 下的 upload
me.setBaseUploadPath(...);
// 配置 404、500 页面 me.setError404View("/common/404.html"); me.setError500View("/common/500.html");
// 配置 encoding,默认为 UTF8
me.setEncoding("UTF8");
// 配置上传文件最大数据量,默认 10M
me.setMaxPostSize(10 * 1024 * 1024);
此方法用来配置访问路由 我们的入门案例中 http://localhost/hello 这个URL 访问了HelloController控制器中的index()
// 配置 baseViewPath,可以让 render(...) 参数省去 baseViewPath 这部分前缀 me.setBaseViewPath("/view");
// 配置作用于该 Routes 对象内配置的所有 Controller 的拦截器 me.addInterceptor(new FrontInterceptor());
// 路由扫描,jfinal 4.9.03 新增功能。参数 "com.xxx." 表示扫描被限定的包名, // 扫描仅会在该包以及该包的子包下进行 me.scan("com.xxx.");
// 手工添加路由。注意:使用了路由扫描就不要再使用手工添加路由,两者选其一 me.add("/hello", HelloController.class);
finalView = baseViewPath + viewPath + view
==注意:当view以 “/” 字符打头时表示绝对路径,baseViewPath 与 viewPath 将被忽略 ==
路由的使用
(1)手动添加路由
@Override
public void configRoute(Routes me) {
// 参数1 demo:是访问控制器的url
// 参数2 DemoController.class :是控制器类
// 参数3 html:是该控制器访问视图的路径
me.add("demo",DemoController.class,"html");
}
设置具体的view文件将访问该视图
如果没有写具体的view文件将访问跟方法名同名的html
(2)路由自动扫描
@Override
public void configRoute(Routes me) {
// 参数 指定controller所在的包
me.scan("com.ape.web.");
}
使用了路由自动扫描就需要@Path 注解来修饰 Controller类
// 参数是访问Controller的url @Path("active")
public class DemoController extends Controller {
public void index() {
// 这里需要注意:要明确指向view的路径
// 否则它访问/webapp/active/show.htmlrender("/html/show.html"); } 注意: 路由的路径以 /字符打头时表示绝对路径。 baseViewPath 与 viewPath 将被忽略
}
}
注意: 路由的路径以 /字符打头时表示绝对路径。 baseViewPath 与 viewPath 将被忽略
配置类中configEngine方法
该方法用来配置Template Engine。
public void configEngine(Engine me) {
me.addSharedFunction("/view/common/layout.html");
me.addSharedFunction("/view/common/paginate.html");
me.addSharedFunction("/view/admin/common/layout.html");
}
方法向模板引擎中添加了三个定义了 template function 的模板文件
注意:me.setToClassPathSourceFactory()、me.setBaseTemplatePath(…)、 me.setDevMode(…) 这三个配置要放在最前面,因为后续的 me.addSharedFunction(…) 等配置对前面三个配置有依赖。
其他方法
configPlugin(…) 该方法使用来配置插件
configInterceptor(…) 该方法使用来配置拦截器
configHandler(…) Handler可以接管所有web请求,并对应用拥有完全的控制权,可以很方便地实 现更高层的功能性扩展
onStart()、onStop() 方法 JFinal 会在系统启动完成之后以及系统关闭之前分别回调这两个方法