首页 > 代码库 > JFanal框架介绍

JFanal框架介绍

近期有个项目使用了JFanal框架,我认为挺好用.这篇文章介绍我的详细使用感受.假设想要了解JFanal,请至官网下载文档和demo.

 

我在项目中使用了JFanal框架例如以下东东:

  • 路由
  • 获取请求參数
  • 设置属性以及视图中获取属性
  • 模型与数据库
  • 渲染
  • 分页(Pagination)

 

有些技术可能有普遍的使用需求,可是我在这个项目中没有使用到:

  • ajax

 

以下一一介绍

路由

基于JFinalweb项目须要创建一个继承自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再实现一个没有參数,返回值为voidsave函数.

 

获取请求參数

Controller提供了getPara系列方法用来从请求中获取參数.

来自<<jfinal-2.0-manual>>3.3 Controller getPara系列方法

 

getpost方法请求都使用这样的方式获取.处理请求方法函数中

Stringtitle = getPara("title");

 

设置属性以及视图中获取属性

使用setAttr系列函数设置属性

String prodNm =getPara("prodNm");

setAttr("prodNm",prodNm);

 

视图中通过例如以下方式获取属性

${(prodNm)!}

注意请不要通过${prodNm}方式获取属性,假设prodNmnull,那么浏览器渲染网页到此处时会报错并停止渲染.

 

模型与数据库

基于ActiveRecordModel无需定义属性,无需定义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语句除了从单表中获取,也能够从多表中获取.

 

使用DbRecord类时,无需对数据库进行映射,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系列方法

 

这个项目控制器处理请求函数中仅仅做三件事:

  1. 获取请求參数.
  1. 获取服务组件调用方法,返回模型或基本类型,设置属性.
  2. 渲染.

 

在渲染系列方法除了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);

}

JFanal框架介绍