【深度精講】JFinal中的Ret和Kv工具類的區(qū)別,你用對(duì)了嗎?
在JFinal中有兩個(gè)類Map的工具類,一個(gè)是有狀態(tài)的Ret,一個(gè)是無狀態(tài)的Kv,各種自己的應(yīng)用場(chǎng)景,你用對(duì)了嗎?

下面我們從多個(gè)方面來探究一下,JFinal針對(duì)這兩個(gè)類的設(shè)計(jì):
一、位置-com.jfinal.kit包

com.jfinal.kit包,JFinal里的核心工具類包,里面還有我們常用來判斷和處理字符串用的StrKit工具類。加載讀取配置文件用的PropKit工具類。用戶密碼Md5或者加鹽加密用的HashKit工具類等。
總之,這個(gè)工具類包下面都是我們?nèi)粘i_發(fā)中常用的.(不接受反駁 (#^.^#))
二、Kv.java詳解

Kv繼承HashMap,擁有HashMap的所有特性,你可以把Kv.java當(dāng)做一個(gè)更好用的HashMap。
場(chǎng)景使用:主要用來做參數(shù),傳遞參數(shù)

例1、下面來看一個(gè)Service里封裝的例子:

這是Service中封裝的一個(gè)根據(jù)關(guān)聯(lián)類型和關(guān)聯(lián)對(duì)象ID 刪除符合條件數(shù)據(jù)的一個(gè)數(shù)據(jù)庫(kù)操作。這里用Kv來構(gòu)造了刪除使用的參數(shù),是deleteBy(Kv params)這個(gè)方法的參數(shù)。
例2、再來看一個(gè)JFinal微信開發(fā)中 對(duì)微信API的一個(gè)封裝:

這個(gè)場(chǎng)景下,使用Kv包裝作為接口的參數(shù),去調(diào)用微信API。
例3、在Controller層 使用Kv把前端傳遞的參數(shù)封裝起來,更方便的調(diào)用非結(jié)構(gòu)化參數(shù),非Bean,非Model的參數(shù)傳遞

Controller.java中默認(rèn)提供了getKv()這個(gè)方法,如果前端傳遞的參數(shù)是一個(gè)Model,比如參數(shù)是user.id=1 user.name="張三" 此時(shí)我們后端可以使用getModel(User.class,"user")去獲取一個(gè)用model包裝的參數(shù)集合。如下圖案例所示:
這里需要注意的是modelName.attrName這種形式,使用的attrName必須與數(shù)據(jù)表字段名完全一樣。

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

注意:getBean方法用于支持傳統(tǒng)Java Bean,包括支持使用jfinal生成器生成了getter、setter方法的Model,頁(yè)面表單傳參時(shí)使用與setter方法相一致的attrName,而非數(shù)據(jù)表字段名
除了以上兩種情況,如果前端一個(gè)表單提交的數(shù)據(jù),表單沒有設(shè)置域,直接傳遞的零散的表單項(xiàng)和值,則可以使用getKv()拿到所有前端提交過來的參數(shù),按照HashMap的形式包裝起來,方便后面使用。
其實(shí):如果希望傳參時(shí)避免使用modelName前綴,可以使用空串作為modelName來實(shí)現(xiàn):getModel(User.class, ""); 這對(duì)開發(fā)純API項(xiàng)目非常有用。
但是這里我們主要來探究Kv的方式:

Kv里提供了很多快速參數(shù)轉(zhuǎn)型的方法:在Service里可以快速根據(jù)參數(shù)的名字作為Kv里的Key獲取轉(zhuǎn)型數(shù)據(jù)值。

在Service里 我們可以使用這些方法,拿到我們需要的參數(shù)值。

特別注意:上面這個(gè)案例還能看出一個(gè)Ret和Kv的區(qū)別,就是一個(gè)主要作為參數(shù),一個(gè)主要作為返回值。
三、Ret.java詳解

從上圖可以看出,Ret和Kv一樣 都是繼承了HashMap,是一個(gè)更好用的HashMap,唯一不同的是加入了狀態(tài)state,主要是用來做返回值,用來返回操作處理的數(shù)據(jù)和狀態(tài)的。也用于服務(wù)器對(duì)客戶端請(qǐng)求響應(yīng)JSon數(shù)據(jù)通訊。

例1、Service層操作返回值,標(biāo)明返回的數(shù)據(jù)、狀態(tài)信息。

這里我列舉一個(gè)更新密碼的例子,拿到原密碼和新密碼之后做完判斷和更新后,根據(jù)最后執(zhí)行是否成功,返回一個(gè)Ret值,或者是success或者是error,這里具體看看封裝的Ret是這樣的:

調(diào)用了Ret里的fail和ok方法,設(shè)置了success和error分別對(duì)應(yīng)的兩個(gè)狀態(tài)。

最后會(huì)設(shè)置這個(gè)狀態(tài)名字是state值要么是ok要么是fail

那么,我們Controller層拿到這個(gè)service的返回值,如果前端是Ajax請(qǐng)求或者是作為API接口,用JSON數(shù)據(jù)格式通訊的話,可以直接使用renderJson(ret)了。

總結(jié):這個(gè)就是Ret作為Service返回值和服務(wù)器與客戶端做JSON數(shù)據(jù)通訊,返回的Json數(shù)據(jù)的典型應(yīng)用場(chǎng)景,跟Kv還是有區(qū)別的,就只在這個(gè)狀態(tài)上。
希望,這個(gè)對(duì)比試驗(yàn)可以讓大家清晰的認(rèn)識(shí)同樣繼承了HashMap的兩個(gè)工具類,在應(yīng)用場(chǎng)景上的區(qū)別,用對(duì)JFinal,用好JFinal。
如果您對(duì)次圖文教程有任何意見和改進(jìn)建議,請(qǐng)一定關(guān)注JFinal學(xué)院公眾號(hào):jfinalxueyuan 留言告訴我們。
如果您在本文中有所收獲,想關(guān)注更多JFinal課程,也請(qǐng)一定關(guān)注JFinal學(xué)院公眾號(hào):jfinalxueyuan ,更多精彩課程,等著你。

posted on 2018-11-13 21:02 xiaomuedu 閱讀(1349) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)