1. 程式人生 > >【深度精講】JFinal中的Ret和Kv工具類的區別,你用對了嗎?

【深度精講】JFinal中的Ret和Kv工具類的區別,你用對了嗎?

在JFinal中有兩個類Map的工具類,一個是有狀態的Ret,一個是無狀態的Kv,各種自己的應用場景,你用對了嗎?

 

Ret+kV_新版公眾號首圖_2018.11.13 (1).png

 

 

下面我們從多個方面來探究一下,JFinal針對這兩個類的設計:

 

一、位置-com.jfinal.kit包

image.png

 

com.jfinal.kit包,JFinal裡的核心工具類包,裡面還有我們常用來判斷和處理字串用的StrKit工具類。載入讀取配置檔案用的PropKit工具類。使用者密碼Md5或者加鹽加密用的HashKit工具類等。

 

總之,這個工具類包下面都是我們日常開發中常用的.(不接受反駁 (#^.^#))

 

二、Kv.java詳解

image.png

 

Kv繼承HashMap,擁有HashMap的所有特性,你可以把Kv.java當做一個更好用的HashMap

 

場景使用:主要用來做引數,傳遞引數

 

image.png

 

 

例1、下面來看一個Service裡封裝的例子:

image.png

 

這是Service中封裝的一個根據關聯型別和關聯物件ID 刪除符合條件資料的一個數據庫操作。這裡用Kv來構造了刪除使用的引數,是deleteBy(Kv params)這個方法的引數。

 

例2、再來看一個JFinal微信開發中 對微信API的一個封裝:

 

image.png

這個場景下,使用Kv包裝作為介面的引數,去呼叫微信API。

 

例3、在Controller層 使用Kv把前端傳遞的引數封裝起來,更方便的呼叫非結構化引數,非Bean,非Model的引數傳遞

image.png

 

Controller.java中預設提供了getKv()這個方法,如果前端傳遞的引數是一個Model,比如引數是user.id=1 user.name="張三" 此時我們後端可以使用getModel(User.class,"user")去獲取一個用model包裝的引數集合。如下圖案例所示:

這裡需要注意的是modelName.attrName這種形式,

使用的attrName必須與資料表字段名完全一樣。

 

image.png

 

如果傳遞的引數與Model不同,但是也是user.id這種形式的引數,一般我們後端可以封裝一個JavaBean,然後使用getBean(MyBean.class,"user") 也可以得到一組bean封裝的引數集合。如下圖所示:

 

image.png

注意:getBean方法用於支援傳統Java Bean,包括支援使用jfinal生成器生成了getter、setter方法的Model,頁面表單傳參時使用與setter方法相一致的attrName,而非資料表字段名

 

 

 

除了以上兩種情況,如果前端一個表單提交的資料,表單沒有設定域,直接傳遞的零散的表單項和值,則可以使用getKv()拿到所有前端提交過來的引數,按照HashMap的形式包裝起來,方便後面使用。

 

其實:如果希望傳參時避免使用modelName字首,可以使用空串作為modelName來實現:getModel(User.class, ""); 這對開發純API專案非常有用。

 

但是這裡我們主要來探究Kv的方式:

image.png

Kv裡提供了很多快速引數轉型的方法:在Service裡可以快速根據引數的名字作為Kv裡的Key獲取轉型資料值。

image.png

在Service裡 我們可以使用這些方法,拿到我們需要的引數值。

image.png

特別注意:上面這個案例還能看出一個Ret和Kv的區別,就是一個主要作為引數,一個主要作為返回值。

 

 

三、Ret.java詳解

image.png

從上圖可以看出,Ret和Kv一樣 都是繼承了HashMap,是一個更好用的HashMap,唯一不同的是加入了狀態state主要是用來做返回值,用來返回操作處理的資料和狀態的。也用於伺服器對客戶端請求響應JSon資料通訊。

image.png

 

例1、Service層操作返回值,標明返回的資料、狀態資訊。

image.png

這裡我列舉一個更新密碼的例子,拿到原密碼和新密碼之後做完判斷和更新後,根據最後執行是否成功,返回一個Ret值,或者是success或者是error,這裡具體看看封裝的Ret是這樣的:

 

image.png

 

呼叫了Ret裡的fail和ok方法,設定了success和error分別對應的兩個狀態。

 

image.png

 

最後會設定這個狀態名字是state值要麼是ok要麼是fail

image.png

那麼,我們Controller層拿到這個service的返回值,如果前端是Ajax請求或者是作為API介面,用JSON資料個是通訊的話,可以直接使用renderJson(ret)了。

 

image.png

 

總結這個就是Ret作為Service返回值和伺服器與客戶端做JSON資料通訊,返回的Json資料的典型應用場景,跟Kv還是有區別的,就只在這個狀態上。

 

希望,這個對比試驗可以讓大家清晰的認識同樣繼承了HashMap的兩個工具類,在應用場景上的區別,用對JFinal,用好JFinal。

 

如果您對次圖文教程有任何意見和改進建議,請一定關注JFinal學院公眾號:jfinalxueyuan 留言告訴我們。

 

如果您在本文中有所收穫,想關注更多JFinal課程,也請一定關注JFinal學院公眾號:jfinalxueyuan ,更多精彩課程,等著你。

 

image.png