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