VO的实际应用;后端接收前端传入的值;实体类转化VO;PO,VO,DTO,BO,DAO,POJO区别
文章目錄
- 各層轉(zhuǎn)換流程
- 分層領(lǐng)域模型規(guī)約:
- 領(lǐng)域模型命名規(guī)約:
- 后端向前端傳參
- 封裝
- 前端向后臺傳參
- 封裝
- 快速轉(zhuǎn)換解決方案
- 參考
各層轉(zhuǎn)換流程
分層領(lǐng)域模型規(guī)約:
- DO( Data Object):與數(shù)據(jù)庫表結(jié)構(gòu)一一對應(yīng),通過DAO層向上傳輸數(shù)據(jù)源對象。
- DTO( Data Transfer Object):數(shù)據(jù)傳輸對象,Service或Manager向外傳輸?shù)膶ο蟆?/li>
- BO( Business Object):業(yè)務(wù)對象。 由Service層輸出的封裝業(yè)務(wù)邏輯的對象。
- AO( Application Object):應(yīng)用對象。 在Web層與Service層之間抽象的復(fù)用對象模型,極為貼近展示層,復(fù)用度不高。
- VO( View Object):顯示層對象,通常是Web向模板渲染引擎層傳輸?shù)膶ο蟆?/li>
- POJO( Plain Ordinary Java Object):在本手冊中, POJO專指只有setter/getter/toString的簡單類,包括DO/DTO/BO/VO等。
- Query:數(shù)據(jù)查詢對象,各層接收上層的查詢請求。 注意超過2個(gè)參數(shù)的查詢封裝,禁止使用Map類來傳輸。
領(lǐng)域模型命名規(guī)約:
- 數(shù)據(jù)對象:xxxDO,xxx即為數(shù)據(jù)表名。
- 數(shù)據(jù)傳輸對象:xxxDTO,xxx為業(yè)務(wù)領(lǐng)域相關(guān)的名稱。
- 展示對象:xxxVO,xxx一般為網(wǎng)頁名稱。
- POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止命名成xxxPOJO。
后端向前端傳參
普通業(yè)務(wù)直接傳入DTO即可,復(fù)雜業(yè)務(wù)通過封裝VO方式來進(jìn)行
我自己應(yīng)用就是通過controller將不同結(jié)果放入Demo,然后轉(zhuǎn)換json返回前端;之前不用VO封裝的時(shí)候也會通過Map進(jìn)行賦值然后轉(zhuǎn)換json返回前端;其實(shí)這兩種方式實(shí)現(xiàn)的結(jié)果都json都是一樣的,看個(gè)人選擇。
封裝
// public class Demo{private String name;private String url;private String page;private String isNonProfit;private List<Address> address; //封裝address實(shí)體類private List<Links> links; //封裝links實(shí)體類/***省略set、get方法*/ }前端向后臺傳參
應(yīng)該傳的是vo 但是根據(jù)情況而定,尤其是前后分離,有特定的前端開發(fā)人員的時(shí)候。因?yàn)閐to往往會添加很多額外的數(shù)據(jù)信息,打個(gè)比方,用戶新增,往往前端傳遞的是賬戶名、密碼、創(chuàng)建人標(biāo)示等等很少的信息,但是dto作為一個(gè)中轉(zhuǎn)數(shù)據(jù),會添加例如更新人、用戶狀態(tài)等等其他的信息,如果前端傳遞的是dto,如此多的額外信息會給前端造成很多問題。如果是小項(xiàng)目的話,前后端都是一個(gè)人在進(jìn)行,那就無所謂了,后端需要哪些,不需要哪些心里有數(shù),傳遞dto就無所謂了。 一般的數(shù)據(jù)轉(zhuǎn)換是,前端傳遞vo給接口,接口將vo轉(zhuǎn)為dto傳遞給service,service將dto分解為do,調(diào)用領(lǐng)域服務(wù)進(jìn)行調(diào)度,然后逆向轉(zhuǎn)為vo或者其他的返回結(jié)果,傳遞給前臺。
VO和DTO在實(shí)際開發(fā)過程中其實(shí)可以是一樣的。從定義上來說他們區(qū)別于使用的所在層,VO(view object)視圖對象,DTO(Data Transfer Object),數(shù)據(jù)傳輸對象; 至于你這里的controller接收參數(shù)要看是接收service的參數(shù)還是頁面?zhèn)鬟f過來的參數(shù)了,若是頁面?zhèn)鬟f的參數(shù)叫VO,service傳遞的參數(shù)叫DTO。
看你們項(xiàng)目的規(guī)范是什么,有的人認(rèn)為前端給后端傳是視圖層的交互,應(yīng)該用VO,但也有人認(rèn)為是接收的參數(shù),應(yīng)該用DTO。這個(gè)沒有定論的,就像最后說的,規(guī)矩是死的,人是活的,有的人還喜歡用xxxParam來表示前端傳遞的值。只要能表達(dá)清楚業(yè)務(wù)意義就可以了。
總結(jié):可以傳參數(shù),或者封裝好的VO(這里有取名可以是xxxVO、xxxParam、xxxBody)要看自己需要了;可以接收和返回前端都用同一個(gè)VO,也可以返回用VO,接收用其他的,這個(gè)就根據(jù)自己業(yè)務(wù)復(fù)雜程度靈活處理。
我自己應(yīng)用就是通過xxxBody接收,然后解析里面的值,創(chuàng)建對應(yīng)的POJO,然后去調(diào)用相對應(yīng)的service處理
封裝
將自己需要的前端傳入的參數(shù)封裝起來即可,這塊主要看自己要接收前端什么參數(shù)來封裝
public class Demo{private String name;private String url;private String page;private String isNonProfit;private List<Address> address; //封裝address實(shí)體類private List<Links> links; //封裝links實(shí)體類/***省略set、get方法*/ }快速轉(zhuǎn)換解決方案
這里就看自己需要了,如果自己業(yè)務(wù)比較復(fù)雜,那就自己手動去處理
1.dozer + lombok
2.遍歷出來后取出每個(gè)元素,一個(gè)個(gè)set后再添加到新的集合里
3.用Java8的lambda表達(dá)式
4.使用commons-lang3或者直接org.springframework.beans. BeanUtils的copyProperties方法
參考
微服務(wù)篇-DTO、VO快速轉(zhuǎn)換解決方案 - 知乎 (zhihu.com)
controller接收參數(shù)的對象是vo還是dto? - M號開發(fā)者 - 博客園 (cnblogs.com)
(63條消息) Java種前端包括三個(gè)實(shí)體類變量,后臺怎么用VO接收前端傳過來的值_k_love1219的博客-CSDN博客
(63條消息) 實(shí)體類轉(zhuǎn)化為VO返回給前端的方法_吹滅讀書燈 一身都是月的博客-CSDN博客
阿里巴巴Java開發(fā)手冊中的DO、DTO、BO、AO、VO、POJO定義 - EasonJim - 博客園 (cnblogs.com)
一篇文章講清楚VO,BO,PO,DO,DTO的區(qū)別 - 掘金 (juejin.cn)
DO,DTO,VO,POJO 你知道嗎? - 掘金 (juejin.cn)
總結(jié)
以上是生活随笔為你收集整理的VO的实际应用;后端接收前端传入的值;实体类转化VO;PO,VO,DTO,BO,DAO,POJO区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 相思曲
- 下一篇: 技术解析:一文看懂 Anolis OS