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