jfinal-ext學習小記


jfinal作為一個快速開發框架,已經提供了很多便捷的功能,極大的方便了開發。但是其中還是有一些功能可以簡潔化,而jfinal-ext作為一個插件補充了jfinal的一些不足,兩者搭配基本可以滿足一些常用的開發。

個人覺着jfinal-ext的以下功能很常用且很有用,故暫且嘗試並收錄,將心得寫下已備忘。

  1. jfinal測試框架
  2. 自定綁定表 AutoTableBindPlugin
  3. SqlInXmlPlugin
  4. 任務調度 QuartzPlugin Cron4jPlugin
  5. PoiRender
  6. 自動注冊Route AutoBindRoutes

注:jfinal-ext需要的jar包

jfinal-1.9.jar

jfinal-ext-3.1.2.jar

guava-18.0.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM