您好,登錄后才能下訂單哦!
這篇文章主要介紹“Mvc模式下SSM環(huán)境是什么”,在日常操作中,相信很多人在Mvc模式下SSM環(huán)境是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Mvc模式下SSM環(huán)境是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
MVC模式與代碼分層策略,MVC全名是ModelViewController即模型-視圖-控制器,作為一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯,這是一種開發(fā)模式,但并不是實際開發(fā)中代碼的分層模式,通常SSM框架的后端代碼分層如下:
controller控制層:定義服務(wù)端接口,入?yún)⒊鰠?,和一些入?yún)⑿r灒?/p>
service業(yè)務(wù)服務(wù)層:組裝業(yè)務(wù)邏輯,業(yè)務(wù)校驗,構(gòu)建控制層需要的參數(shù)模型;
dao數(shù)據(jù)交互層:提供服務(wù)層需要的數(shù)據(jù)查詢方法,處理數(shù)據(jù)交互條件相關(guān)的邏輯;
mapper持久層:基于mybatis框架需要的原生支持,目前很常用的持久層組件;
1、Rest接口風(fēng)格
基于資源訪問和處理的邏輯,使用不同風(fēng)格的注解。例如資源新增,更新,查詢,刪除。
/** * 新增 */ @PostMapping("/insert") public Integer insert (@RequestBody BaseInfo baseInfo){ return baseInfoService.insert(baseInfo); } /** * 更新 */ @PutMapping("/update/{id}") public String update(@PathVariable(value = "id") Integer id, @RequestBody BaseInfo baseInfo) { if (id<1){ return "error"; } baseInfo.setId(id); return "update="+baseInfoService.update(baseInfo); } /** * 主鍵查詢 */ @GetMapping("/detail/{id}") public InfoModel detail(@PathVariable(value = "id") Integer id) { return baseInfoService.detail(id) ; } /** * 主鍵刪除 */ @DeleteMapping("/delete/{id}") public String delete(@PathVariable(value = "id") Integer id) { baseInfoService.delete(id) ; return "SUS" ; }
2、接口復(fù)用度
不建議接口高度復(fù)用,例如增刪改查都各自對接接口即可,基本原則,不同的客戶端端操作,對于獨立的接口。
/** * 列表加載 */ @GetMapping("/list") public List<BaseInfo> list() { return baseInfoService.list(new BaseInfoExample()) ; } /** * 列表搜索 */ @PostMapping("/search") public List<BaseInfo> search (@RequestParam("userName") String userName, @RequestParam("phone") String phone) { return baseInfoService.search(userName,phone) ; }
例如常見的list接口,list通常都有會按條件加載的search機制,而且搜索的判斷條件很復(fù)雜,建議分為兩個接口,從實際考慮,大部分場景下都是只使用list接口,很少使用search搜索。
3、入?yún)⒊鰠?/strong>
校驗客戶端必須條件,例如某某條件必填必選等,如果有問題,快速阻斷請求鏈路,做到程序入口控制層攔截返回。
@PutMapping("/update/{id}") public String update(@PathVariable(value = "id") Integer id, @RequestBody BaseInfo baseInfo) { if (id<1){ return "error"; } baseInfo.setId(id); return "update="+baseInfoService.update(baseInfo); }
參數(shù)在三個以下,可以直接陳列入?yún)?,參?shù)在三個或三個以上可以使用實體類統(tǒng)一封裝。
@PostMapping("/search") public List<BaseInfo> search (@RequestParam("userName") String userName, @RequestParam("phone") String phone) { return baseInfoService.search(userName,phone) ; }
4、參數(shù)處理
出參格式處理度基本原則,服務(wù)器作為公共資源,避免非必要操作,例如客戶端可自行判斷返回值是否為空,null等,或者一些常見格式處理,利用客戶端適當(dāng)分擔(dān)服務(wù)器壓力。
1、業(yè)務(wù)校驗
例如傳入訂單號,經(jīng)過數(shù)據(jù)庫層查詢,沒有訂單數(shù)據(jù),這里稱為業(yè)務(wù)性質(zhì)的異常,代碼本身沒有問題,但是業(yè)務(wù)邏輯無法正常執(zhí)行。
public InfoModel detail(Integer id){ BaseInfo baseInfo = baseInfoDao.selectByPrimaryKey(id) ; if (baseInfo != null){ DetailInfoEntity detailInfoEntity = detailInfoDao.getById(id); if (detailInfoEntity == null){ LOG.info("id="+id+"數(shù)據(jù)缺失 DetailInfo"); } return buildModel(baseInfo,detailInfoEntity) ; } LOG.info("id="+id+"數(shù)據(jù)完全缺失"); return null ; }
2、組裝業(yè)務(wù)邏輯
通常情況下服務(wù)層作為邏輯做復(fù)雜的一塊,用來拼接業(yè)務(wù)核心步驟,可以通過業(yè)務(wù)邏輯判定,一步一步執(zhí)行程序,避免在程序入口做大量可能用到的對象創(chuàng)建和需求數(shù)據(jù)查詢。
public int insert (BaseInfo record){ record.setCreateTime(new Date()); int insertFlag = baseInfoDao.insert(record); if (insertFlag > 0){ DetailInfoEntity detailInfoEntity = new DetailInfoEntity(); detailInfoEntity.setUserId(record.getId()); detailInfoEntity.setCreateTime(record.getCreateTime()); if(detailInfoDao.save(detailInfoEntity)){ return insertFlag ; } } return insertFlag; }
3、數(shù)據(jù)模型構(gòu)建
通常情況業(yè)務(wù)層是偏復(fù)雜的,如果想關(guān)快速理解業(yè)務(wù)層,可以對復(fù)雜的業(yè)務(wù)方法,在提供一個返參構(gòu)建的方法,用來處理服務(wù)層要向控制層回傳的參數(shù),這樣可以讓重度的服務(wù)層方法變的清晰。
private InfoModel buildModel (BaseInfo baseInfo,DetailInfoEntity detailInfo){ InfoModel infoModel = new InfoModel() ; infoModel.setBaseInfo(baseInfo); infoModel.setDetailInfoEntity(detailInfo); return infoModel ; }
1、逆向工程
這里以使用mybatis框架或者mybatis-plus框架作為參考。如果是mybatis框架,建議逆向工程的模板代碼不做自定義的修改,如果需要自定義方法,在mapper和xml層面再自定義一個擴展文件,用來存放自定義的方法和SQL邏輯,這樣避免表結(jié)構(gòu)變動大引發(fā)的強烈不適。
當(dāng)然現(xiàn)在大部分都會mybatis-plus作為持久層組件,可以避免上述問題。
2、數(shù)據(jù)交互
針對業(yè)務(wù)層的需要,提供相應(yīng)的數(shù)據(jù)查詢方法,只處理與數(shù)據(jù)庫交互的邏輯,避免出現(xiàn)業(yè)務(wù)邏輯,尤其在分布式架構(gòu)下,不同服務(wù)的數(shù)據(jù)查詢和組裝,不應(yīng)該出現(xiàn)在該層。
public interface BaseInfoDao { int insert(BaseInfo record); List<BaseInfo> selectByExample(BaseInfoExample example); int updateByPrimaryKey(BaseInfo record); BaseInfo selectByPrimaryKey(Integer id); int deleteByPrimaryKey(Integer id); BaseInfo getById (Integer id) ; }
到此,關(guān)于“Mvc模式下SSM環(huán)境是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。