JFanal框架介绍
近期有个项目使用了JFanal框架,我认为挺好用.这篇文章介绍我的详细使用感受.假设想要了解JFanal,请至官网下载文档和demo.
我在项目中使用了JFanal框架例如以下东东:
- 路由
- 获取请求參数
- 设置属性以及视图中获取属性
- 模型与数据库
- 渲染
- 分页(Pagination)
有些技术可能有普遍的使用需求,可是我在这个项目中没有使用到:
- ajax
以下一一介绍
路由
基于JFinal的web项目须要创建一个继承自JFinalConfig类的子类,该类用于对整个web项目进行配置.
来自<<jfinal-2.0-manual>>2.1 JFinalConfig概述
/**
* 配置路由
*/
@Override
public voidconfigRoute(Routes me) {
me.add("/",IndexController.class,"/index"); //第三个參数为该Controller的视图存放路径
me.add("/blog",BlogController.class); //第三个參数省略时默认与第一个參数值同样,在此即为 "/blog"
}
注意第三个參数缺省为index.因此BlogController类中实际处理/blog请求的是index函数.该函数没有參数,返回值为void.
publicvoid index() {
}
那么怎样处理诸如/blog/save请求呢?
BlogController再实现一个没有參数,返回值为void的save函数.
获取请求參数
Controller提供了getPara系列方法用来从请求中获取參数.
来自<<jfinal-2.0-manual>>3.3 Controller getPara系列方法
get和post方法请求都使用这样的方式获取.处理请求方法函数中
Stringtitle = getPara("title");
设置属性以及视图中获取属性
使用setAttr系列函数设置属性
String prodNm =getPara("prodNm");
setAttr("prodNm",prodNm);
视图中通过例如以下方式获取属性
${(prodNm)!}
注意请不要通过${prodNm}方式获取属性,假设prodNm为null,那么浏览器渲染网页到此处时会报错并停止渲染.
模型与数据库
基于ActiveRecord的Model无需定义属性,无需定义getter,setter方法
来自<<jfinal-2.0-manual>>5.3 ActiveRecord Model
初次使用感觉挺奇妙,挺方便.当然如同demo那样,有哪些字段最好在凝视中说明清楚.
publicclass Blog extends Model<Blog> {
public static final Blog me = new Blog();
}
服务组件中
Blog blog = Blog.me.findFirst(sql);
sql语句除了从单表中获取,也能够从多表中获取.
使用Db与Record类时,无需对数据库进行映射,Record相当于一个通用的Model.
来自<<jfinal-2.0-manual>>5.4 ActiveRecord JFinal独创的Db+Record模式
在实际使用中,我发现Db+Record模式也挺好用.暂时须要获取某些字段又不想再麻烦创建一个模型时使用.
RecordcustomTypeName = Db.findFirst(sql);
StringstrCustomTypeName =customTypeName.getStr("customTypeName");
渲染
render系列方法将渲染不同类型的视图并返回给client.
来自<<jfinal-2.0-manual>>3.8 Controller render系列方法
这个项目控制器处理请求函数中仅仅做三件事:
- 获取请求參数.
- 获取服务组件调用方法,返回模型或基本类型,设置属性.
- 渲染.
在渲染系列方法除了render("index.html")之外,我还发现renderJson()特别好用,它会将全部通过setAttr设置的变量转换成json数据并渲染.在开发视图之前,先将全部页面须要的属性设置,然后调用renderJson()渲染成json数据,检查数据,确保数据OK之后再开发视图.
分页
分页文档中没有介绍,可是demo中有.
step1
请将Jfanal框架的_paginate.html拷贝至项目WebRoot/common目录下.
step2
服务组件中提供返回值为Page<Record>的函数
publicPage<Record> paginate(intpageNumber, int pageSize) {
return Db.paginate(pageNumber, pageSize, sql, sqlExcept);
}
注意我使用的是Db+Record模式,读者也能够使用demo中介绍的Db+Model模式.
step3
在控制器请求处理函数中调用
BlogService blogServ =new BlogService();
setAttr("blogPage",blogServ.paginate(getParaToInt(0, 1), 10));
step4
渲染视图中加入
<!-- 分页区域 -->
<#include"/common/_paginate.html" />
<@paginatecurrentPage=blogPage.pageNumbertotalPage=blogPage.totalPageactionUrl="/blog/"urlParas="?
id=${(id)!}"/>
注意:JFanal框架对于多表联合查询没有优化,假设使用了多表联合查询,在大数据量情况下,效率令人抓狂.如需从多表中获取数据,请先从单表中获取
Page<Record>recordPage;
然后採用例如以下方法获取多表数据.
for(Recordr : recordPage.getList()){
String sql2 ="select * from table2where id="+r.getStr("foreignId");
Object table2Field1="空";
Object table2Field2="空";
if(Db.find(sql2).isEmpty()){
}else{
Recordr2 = Db.findFirst(sql2);
table2Field1=r2.get("field1");
table2Field2=r2.get("field2");
}
r.set("table2Field1", table2Field1);
r.set("table2Field1",table2Field2);
}