您的位置:首页 > 其它

JFanal框架介绍

2015-08-25 08:26 369 查看
最近有个项目使用了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系列方法将渲染不同类型的视图并返回给客户端.
来自<<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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: