jfinal作为一个快速开发框架,已经提供了很多便捷的功能,极大的方便了开发。但是其中还是有一些功能可以简洁化,而jfinal-ext作为一个插件补充了jfinal的一些不足,两者搭配基本可以满足一些常用的开发。
个人觉着jfinal-ext的以下功能很常用且很有用,故暂且尝试并收录,将心得写下已备忘。
- jfinal测试框架
- 自定绑定表 AutoTableBindPlugin
- SqlInXmlPlugin
- 任务调度 QuartzPlugin Cron4jPlugin
- PoiRender
- 自动注册Route AutoBindRoutes
注:jfinal-ext需要的jar包
1、JFinal测试框架
在非web环境下对jfinal Controller 进行单元测试
使用说明
所有对Controller的测试必须继承ControllerTestCase,此类中方法说明如下
use | 需要调用的url |
post | post数据包,支持String和File |
writeTo | response数据写入文件 |
invoke | 调用url |
findAttrAfterInvoke | action调用之后getAttr的值 |
---|
示例代码
public class PostTestCase extends ControllerTestCase<Config> { @Test public void line() throws Exception { String url = "/post"; String filePath = Thread.currentThread().getContextClassLoader().getResource("dataReq.xml").getFile(); String fileResp = "/home/kid/git/jfinal-ext/resource/dataResp.xml"; String resp = use(url).post(new File(filePath)).writeTo(new File(fileResp)).invoke(); System.out.println(resp); } @Test public void test3() { String url = "/post/1?age=1&age=2&name=2"; String body = "<root>中文</root>"; use(url).post(body).invoke(); } }
2、自定绑定表 AutoTableBindPlugin
简介
扫描clsspath和lib中继承了model的类自动注册,可选择不同的命名规则自定映射表名,也可以在每一个model上用注解指定表名
AutoTableBindPlugin使用示例
基本使用
AutoTableBindPlugin 继承自ActivitiRecordPlugin,所以如果你使用 AutoTableBindPlugin则不用再使用ActivitiRecordPlugin,其他需要在 ActiviRecordPlugin中的设置都在此plugin中设置,比如方言,大小写不敏 感等..
DruidPlugin druid = new DruidPlugin("jdbc:mysql://127.0.0.1/jfinal_demo", "root", "root"); AutoTableBindPlugin atbp = new AutoTableBindPlugin(druid);
*记住一定要在启动atbp之前启动连接池的plugin
jar包扫描
如果你需要载入jar包中的model,需要调用以下的api将jar包加入扫描
atbp.addJar("modelInJar.jar"); atbp.addJars("jar1,jar2");
表名风格INameStyle 配置
一个model自动绑定的表明默认是该类的simpleClassname,如果需要用其他 的命名风格,需要在构造函数中指定,如
AutoTableBindPlugin atbp = new AutoTableBindPlugin(cp,SimpleNameStyles.LOWER);
SimpleNameStyles 中已有的命名风格以及映射的表明如下表:
DEFAULT | FIRST_LOWER |
UP | LOWER | UP_UNDERLINE |
LOWER_UNDERLINE |
|
DevInfo.java | DevInfo | devInfo | DEVINFO | devinfo | DEV_INFO |
dev_info |
ParamNameStyles 含有构造参数的命名风格:
module(test) | lowerModule(test) | upModule(test) | upUnderlineModule(test) | lowerUnderlineModule(test) | |
DevInfo.java | test_DevInfo |
test_devinfo |
test_DEVINFO |
test_DEV_INFO |
test_dev_info |
TableName 配置
如果有Model到表的映射命名不符合规范需要单独配置,则在Model上加上 TableName注解,属性说明如下:
tableName | 表名 | 必填 |
pkName | 外键名 | 默认”” |
configName | 数据源名 | 默认”” |
具体代码中实现效果如下
关闭自动扫描
如果你只想用注解而不想让没有注解的model被自动注册,则如下使用
atbp.setAutoScan(false);
忽略不想自动扫描的Model
如果你打开了自动扫描,但是又有不想要被扫描进去的,如通用的BaseModel
atbp.addExcludeClass(Class<? extends Model> clazz)
多数据源
推荐将不同数据源的Model放在不同的package中然后调用 addScanPackages 设置要扫描的package
atbp = new AutoTableBindPlugin(druidPlugin) .addScanPackages("com.xx.yy.service1.model"); atbp2 = new AutoTableBindPlugin("another",druidPlugin2) .addScanPackages("com.xx.yy.service2.model2","com.xx.yy.service2.model3")
如果在一个package里面有属于不同数据源的model(如果不是因为无法避 免的历史遗留原因不要采用这样的方式),那么给Model加上TableBind注 解并给configName属性赋值
3、SqlInXmlPlugin
简介
类似ibatis的在xml中管理sql.主要用于复杂的sql管理或者有dba的开发团 队。
适用于sql语句需要经常变动的情况,通过此方法可以在不变动程序的前提下,直接修改配置中的sql即可。
使用示例
插件会扫描classpath根目录下以”.sql”结尾的xml文件. 用一个xml举例,文件名为user-sql.xml,内容如 下:

插件会将name+id作为一个sql语句的唯一标识, 在java中获取该sql的方法为 SqlKit.sql(“blog.findBlog”)
代码中使用示意如下:
4、任务调度 QuartzPlugin Cron4jPlugin
业务如何调度
QuartzPlugin
需要进行的调度任务实现必须实现org.quartz.Job接口
Cron4jPlugin
需要进行的调度任务实现必须实现java.lang.Runnable接口
如何加载配置
插件默认加载classpath根目录下job.properties文件。 如果需要加载指定的配置文件,需要在构造方法中传入参数
配置文件说明
job.properties配置示例
#JobA
a.job=test.com.jfinal.plugin.quzrtz.JobA a.cron=*/5 * * * * ? a.enable=true #JobB b.job=test.com.jfinal.plugin.quartz.JobB b.cron=*/10 * * * * ? b.enable=false
配置说明 job cron enable为配置关键字 a和b为任务的名字,仅作为标识,无其他用处。
任务名字.job | 调度任务的类全名 |
任务名字.cron | 调度任务的cron表达式 |
任务名字.enable | 调度任务是否启用 |
如何在代码中添加任务
在plugin上调用add方法
Quartz 1.X和2.X版本不兼容问题
quartz 2.X版本和1.X不兼容. JobDetail 和 CornTrigger 在 1.X版本中是Class,但是在2.X版本中是Interface. QuartzPlugin 解决了兼容问题,默认使用2.X版本,如果需要使用1.X,调用quartzPlugin.version(QuartzPlugin.VERSION_1)即可.
5、PoiRender
通过list数据生成excel,支持多sheet导出,支持的数据类型为map ,record , model.
示例代码
PoiRender.me(data,data2,...dataN).fileName("your_file_name.xls").headers(headers,headers2,...headerN).cellWidth(5000).headerRow(2)
jfinal中查询到的Page<Record>导出为excel示例:

excel2003和2007版本问题
2003版一个sheet只支持最多65535行,2007则没有此限制.对此PoiRender做了如 下处理
- 默认使用2007版,单个sheet的data无限制,如果想用2003版调用以下API:
PoiRender.me(data).version(PoiKit.VERSION_2003)
多sheet支持
- data ,sheetNames,headers,columns长度必须相同.
- 2003版本,如果data长度大于1,会检查每个data的item的数据长度,不允许超 过65535
- 2003版本,如果data长度等于1,如果数据超过65535,会自动拆分为多个sheet
备注
使用此功能,需要加载poi-3.11-20141221.jar(测试此版本jar可用。其他版本,可能会导致导出后台报错。最新版的3.14,3.15经测试不可使用。)
6、自动注册Route AutoBindRoutes
简介
扫描clsspath和lib中继承了Route的类按照约定的规则自动注册,也可以在 每一个Route上用注解配置
示例代码
public void configRoute(Routes me) { me.add(new AutoBindRoutes()); }
如果我们有一个AController,以上代码则相当于
public void configRoute(Routes me) { me.add("/a",AController.class); }
默认的注册规则是截取类名Controller前的部分并首字母小写.
ControllerBind配置
如果需要单独配置Route,需要在Controller上加上ControllerBind注解
ControllerBind 注解,属性说明如下:
controllerKey | 访问某个 Controller 所需要的一个字符串 |
viewPath | Controller 返回的视图的相对路径 |
jfinal链接:https://github.com/jfinal/jfinal
jfinal-ext链接:https://github.com/b1412/jfinal-ext