SpringWebMVC的常用注解及應(yīng)用分層架構(gòu)詳解
一、什么是Spring Web MVC
SpringWebMVC是基于ServletAPI構(gòu)建的原始Web框架,從?開始就包含在Spring框架中。它的正式名稱“SpringWebMVC”來?其源模塊的名稱(Spring-webmvc),但它通常被稱為)SpringMVC).
MVC是?種架構(gòu)設(shè)計模式,也?種思想,?SpringMVC是對MVC思想的具體實現(xiàn).除此之外,SpringMVC還是?個Web框架.
總結(jié)來說,SpringMVC是?個實現(xiàn)了MVC模式的Web框架
MVC的定義
MVC是ModelViewController的縮寫,它是軟件?程中的?種軟件架構(gòu)設(shè)計模式,它把軟件系統(tǒng)分為模型、視圖和控制器三個基本部分
- View(視圖)指在應(yīng)?程序中專??來與瀏覽器進?交互,展?數(shù)據(jù)的資源.
- Model(模型)是應(yīng)?程序的主體部分,?來處理程序中數(shù)據(jù)邏輯的部分.
- Controller(控制器)可以理解為?個分發(fā)器,?來決定對于視圖發(fā)來的請求,需要?哪?個模型來處理,以及處理完后需要跳回到哪?個視圖。即?來連接視圖和模型
二、Spring MVC中常用注解的使用
2.1@RequestMapping:地址映射
@RequestMapping既可修飾類,也可以修飾?法,當(dāng)修飾類和?法時,訪問的地址是類路徑+?法路徑.
@RequestMapping標(biāo)識?個類:設(shè)置映射請求的請求路徑的初始信息
@RequestMapping標(biāo)識?個?法:設(shè)置映射請求請求路徑的具體信息
@RequestMapping("/user") @RestController public class UserController { @RequestMapping("/sayHi") public String sayHi(){ return "hello,Spring MVC"; } }
2.2@RequestBody:請求正文
RequestBody:請求正?,意思是這個注解作?在請求正?的數(shù)據(jù)綁定,請求參數(shù)必須在寫在請求正?中
@RequestMapping(value = "/m7") public Object method7(@RequestBody Person person) { return person.toString(); }
2.3@PathVariable:路徑變量
pathvariable:路徑變量
和字?表達的意思?樣,這個注解主要作?在請求URL路徑上的數(shù)據(jù)綁定
默認傳遞參數(shù)寫在URL上,SpringMVC就可以獲取到
后端實現(xiàn)代碼:
@RequestMapping("/m8/{id}/{name}") public String method8(@PathVariable Integer id, @PathVariable("name") StringuserName){ return "解析參數(shù)id:"+id+",name:"+userName; }
如果?法參數(shù)名稱和需要綁定的URL中的變量名稱?致時,可以簡寫,不?給@PathVariable的屬性賦值,如上述例?中的id變量
如果?法參數(shù)名稱和需要綁定的URL中的變量名稱不?致時,需要@PathVariable的屬性value賦值,如上述例?中的userName變量
2.4@RequestPart:上傳文件
RequestPart主要是用于客戶端上傳文件交給服務(wù)器進行處理
后端代碼實現(xiàn):
@RequestMapping("/m9") public String getfile(@RequestPart("file") MultipartFile file) throwsIOException { //獲取?件名稱 String fileName = file.getOriginalFilename(); //?件上傳到指定路徑 file.transferTo(new File("D:/temp/" + file.getOriginalFilename())); return "接收到?件名稱為: "+fileName; }
2.5@RequestParam:重命名
某些特殊的情況下,前端傳遞的參數(shù)key和我們后端接收的key可以不?致,?如前端傳遞了?個time給后端,?后端是使?createtime字段來接收的,這樣就會出現(xiàn)參數(shù)接收不到的情況,如果出現(xiàn)這種情況,我們就可以使? @RequestParam 來重命名前后端的參數(shù)值
后端實現(xiàn)代碼:
@RequestMapping("/m4") public Object method_4(@RequestParam("time") String createtime) { return "接收到參數(shù)createtime:" + createtime; }
可以得出結(jié)論:
- 使? @RequestParam 進?參數(shù)重命名時,請求參數(shù)只能和 @RequestParam 聲明的名稱?
- 致,才能進?參數(shù)綁定和賦值.使? @RequestParam 進?參數(shù)重命名時,參數(shù)就變成了必傳參數(shù).
2.6@RestController:數(shù)據(jù)控制器
是Contronller和ResponseBody的封裝,用于返回數(shù)據(jù)同時能夠?qū)⒆⒔鈨?nèi)容交給Spring進行管理
@RestController = @Controller + @ResponseBody
@Controller :定義?個控制器,Spring框架啟動時加載,把這個對象交給Spring管理.
@ResponseBody :定義返回的數(shù)據(jù)格式為?視圖,返回?個text/html信息
2.7@ResponseBody:數(shù)據(jù)格式
@ResponseBody :定義返回的數(shù)據(jù)格式為?視圖,返回?個text/html信息
@ResponseBody public class IndexController { @RequestMapping("/index") public Object index(){ return "/index.html"; } }
@ResponseBody 既是類注解,?是?法注解
如果作?在類上,表?該類的所有?法,返回的都是數(shù)據(jù),如果作?在?法上,表?該?法返回的是數(shù)據(jù).
也就是說:在類上添加 @ResponseBody 就相當(dāng)于在所有的?法上添加了 @ResponseBody 注解.
同樣,如果類上有 @RestController 注解時:表?所有的?法上添加了 @ResponseBody 注解,也就是當(dāng)前類下所有的?法返回值做為響應(yīng)數(shù)據(jù)
設(shè)置狀態(tài)碼
SpringMVC會根據(jù)我們?法的返回結(jié)果?動設(shè)置響應(yīng)狀態(tài)碼,程序員也可以?動指定狀態(tài)碼
通過SpringMVC的內(nèi)置對象HttpServletResponse提供的?法來進?設(shè)置
@ResponseBody public String setStatus(HttpServletResponse response) { response.setStatus(401); return "設(shè)置狀態(tài)碼成功"; }
2.8@CookieValue:獲取Cookie
Cook是用戶客戶端用于保存用戶的基本信息,以便于用戶在下一次登錄時可以直接進入
@RequestMapping("/getCookie") public String cookie(@CookieValue("bite") String bite) { return "bite:" + bite; }
2.9@SessionAttribute:獲取Session
Session是服務(wù)器為了保存??信息?創(chuàng)建的?個特殊的對象
Session的本質(zhì)就是?個"哈希表",存儲了?些鍵值對結(jié)構(gòu).Key就是SessionID,Value就是??信息(??信息可以根據(jù)需求靈活設(shè)計).
SessionId是由服務(wù)器?成的?個"唯?性字符串",從Session機制的?度來看,這個唯?性字符串稱為)SessionId).但是站在整個登錄流程中看待,也可以把這個唯?性字符串稱為)token).
- 當(dāng)??登陸的時候,服務(wù)器在Session中新增?個新記錄,并把sessionId返回給客?端.(通過HTTP響應(yīng)中的Set-Cookie字段返回).
- 客?端后續(xù)再給服務(wù)器發(fā)送請求的時候,需要在請求中帶上sessionId.(通過HTTP請求中的Cookie字段帶上).
- 服務(wù)器收到請求之后,根據(jù)請求中的sessionId在Session信息中獲取到對應(yīng)的??信息,再進?后續(xù)操作.找不到則重新創(chuàng)建Session,并把SessionID返回
@RequestMapping("/getSess2") public String sess2(@SessionAttribute(value = "username",required = false)String username) { return "username:"+username; }
Cookie和Session的區(qū)別
- Cookie是客?端保存??信息的?種機制.Session是服務(wù)器端保存??信息的?種機制.
- Cookie和Session之間主要是通過SessionId關(guān)聯(lián)起來的,SessionId是Cookie和Session之間的
橋梁
- Cookie和Session經(jīng)常會在?起配合使?.但是不是必須配合.
- 完全可以?Cookie來保存?些數(shù)據(jù)在客?端.這些數(shù)據(jù)不?定是???份信息,也不?定是
SessionId
- Session中的sessionId也不需要?得通過Cookie/Set-Cookie傳遞,?如通過URL傳遞.
2.10@Data:類注解
Lombok是?個Java?具庫,通過添加注解的?式,簡化Java的開發(fā)其中@Data 注解會幫助我們?動?些?法,包含getter/setter,equals,toString等
Lombok的作?如下圖所?:
如果覺得@Data?較粗暴(?成?法太多),lombok也提供了?些更精細粒度的注解
注解 | 作? |
---|---|
@Getter | ?動添加getter?法 |
@Setter | ?動添加setter?法 |
@ToString | ?動添加toString?法 |
@EqualsAndHashCode | ?動添加equals和hashCode?法 |
@NoArgsConstructor | ?動添加?參構(gòu)造?法 |
@AllArgsConstructor | ?動添加全屬性構(gòu)造?法,順序按照屬性的定義順序 |
@NonNull | 屬性不能為null |
@RequiredArgsConstructor | ?動添加必需屬性的構(gòu)造?法,final+@NonNull的屬性為必需 |
@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsConstructor
因此可以說明在創(chuàng)建類對象時可以通過引入lambok工具包中的@Data注解,可以自動為我們添加其很多常用的賦值方法
三、應(yīng)用分層-三層架構(gòu)
?前現(xiàn)在更主流的開發(fā)?式是"前后端分離"的?式,后端開發(fā)?程師不再需要關(guān)注前端的實現(xiàn),所以對
于Java后端開發(fā)者,?有了?種新的分層架構(gòu):把整體架構(gòu)分為表現(xiàn)層、業(yè)務(wù)邏輯層和數(shù)據(jù)層.這種分層
?式也稱之為"三層架構(gòu)".
- 表現(xiàn)層:就是展?數(shù)據(jù)結(jié)果和接受??指令的,是最靠近??的?層;
- 業(yè)務(wù)邏輯層:負責(zé)處理業(yè)務(wù)邏輯,??有復(fù)雜業(yè)務(wù)的具體實現(xiàn);
- 數(shù)據(jù)層:負責(zé)存儲和管理與應(yīng)?程序相關(guān)的數(shù)據(jù)可以看到,咱們前?的代碼,并不符合這種設(shè)計思想,?是所有的代碼堆砌在?起
按照上?的層次劃分,SpringMVC站在后端開發(fā)?員的?度上,也進?了?持,
- 請求處理、響應(yīng)數(shù)據(jù):負責(zé),接收??的請求,給??響應(yīng)數(shù)據(jù).
- 邏輯處理:負責(zé)業(yè)務(wù)邏輯處理的代碼.
- 數(shù)據(jù)訪問:負責(zé)業(yè)務(wù)數(shù)據(jù)的維護操作,包括增、刪、改、查等操作
- Controller:控制層。接收前端發(fā)送的請求,對請求進?處理,并響應(yīng)數(shù)據(jù)。
- Service:業(yè)務(wù)邏輯層。處理具體的業(yè)務(wù)邏輯。
- Dao:數(shù)據(jù)訪問層,也稱為持久層。負責(zé)數(shù)據(jù)訪問操作,包括數(shù)據(jù)的增、刪、改、查
MVC和三層架構(gòu)的區(qū)別和聯(lián)系
關(guān)于?者的關(guān)系,?直存在不同的觀點.有?認為三層架構(gòu)是MVC模式的?種實現(xiàn),也有?認為MVC是三層架構(gòu)的替代?案,等等各種說法都有.根本原因是?家站在不同的?度來看待這個問題的.
JavaEE部分的學(xué)習(xí)重在"實踐",?家根據(jù)??的理解,能夠?圓其說,說出??的觀點即可,也不建議?家去背書.
從概念上來講,?者都是軟件?程領(lǐng)域中的架構(gòu)模式.
MVC架構(gòu)模式由三部分組成,分別是:模型(Model),視圖(View)和控制器(Controller).
三層架構(gòu)將業(yè)務(wù)應(yīng)?劃分為:表現(xiàn)層,業(yè)務(wù)邏輯層,數(shù)據(jù)訪問層.
MVC中,視圖和控制器合起來對應(yīng)三層架構(gòu)中的表現(xiàn)層.模型對應(yīng)三層架構(gòu)中的業(yè)務(wù)邏輯層,數(shù)據(jù)層,以及實體類
?者其實是從不同?度對軟件?程進?了抽象.
MVC模式強調(diào)數(shù)據(jù)和視圖分離,將數(shù)據(jù)展?和數(shù)據(jù)處理分開,通過控制器對兩者進?組合.
三層架構(gòu)強調(diào)不同維度數(shù)據(jù)處理的?內(nèi)聚和低耦合,將交互界?,業(yè)務(wù)處理和數(shù)據(jù)庫操作的邏輯分開.
?度不同也就談不上互相替代了,在?常的開發(fā)中可以經(jīng)??吹絻煞N共存的情況,?如我們設(shè)計模型層的時候往往也會拆分出業(yè)務(wù)邏輯層(Service層)和數(shù)據(jù)訪問層(Dao層)
四、總結(jié)
學(xué)習(xí)SpringMVC,其實就是學(xué)習(xí)各種Web開發(fā)需要?的到注解
- @RequestMapping:路由映射
- @RequestParam:后端參數(shù)重命名
- @RequestBody:接收JSON類型的參數(shù)
- @PathVariable:接收路徑參數(shù)
- @RequestPart:上傳?件
- @ResponseBody:返回數(shù)據(jù)
- @CookieValue:從Cookie中獲取值
- @SessionAttribute:從Session中獲取值
- @RequestHeader:從Header中獲取值
- @Controller:定義?個控制器,Spring框架啟動時加載,把這個對象交給Spring管理.默認返回視圖
- @RestController:@ResponseBody+@Controller返回數(shù)據(jù)
Cookie和Session都是會話機制,Cookie是客?端機制,Session是服務(wù)端機制.?者通過SessionId來關(guān)聯(lián).SpringMVC內(nèi)置HttpServletRequest,HttpServletResponse兩個對象.需要使?時,直接在?法中添加對應(yīng)參數(shù)即可,Cookie和Session可以從HttpServletRequest中來獲取,也可以直接使?HttpServletResponse設(shè)置Http響應(yīng)狀態(tài)碼.
以上就是SpringWebMVC的常用注解及應(yīng)用分層架構(gòu)詳解的詳細內(nèi)容,更多關(guān)于SpringWebMVC注解與架構(gòu)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot多種環(huán)境自由切換的實現(xiàn)
本文主要介紹了SpringBoot多種環(huán)境自由切換的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08MyBatis傳入List集合查詢數(shù)據(jù)問題
這篇文章主要介紹了MyBatis傳入List集合查詢數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02SpringSecurity數(shù)據(jù)庫進行認證和授權(quán)的使用
本文主要介紹了用戶的賬號、密碼以及角色信息在數(shù)據(jù)庫中的認證和授權(quán),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08SpringCloud Config分布式配置中心使用教程介紹
springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內(nèi)容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-12-12在IDEA中配置tomcat并創(chuàng)建tomcat項目的圖文教程
這篇文章主要介紹了在IDEA中配置tomcat并創(chuàng)建tomcat項目的圖文教程,需要的朋友可以參考下2020-07-07IDEA中程序包Org.Springframework.Boot不存在問題及解決
這篇文章主要介紹了IDEA中程序包Org.Springframework.Boot不存在問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07maven-assembly-plugin報紅無法加載報錯:Plugin?‘maven-assembly-plugin
maven-assembly-plugin是一個常用的打包插件,但是在使用過程中經(jīng)常會遇到各種報錯,本文就來介紹一下maven-assembly-plugin報紅無法加載報錯,具有一定的參考價值2023-08-08