SpringWebMVC的常用注解及應用分層架構詳解
一、什么是Spring Web MVC
SpringWebMVC是基于ServletAPI構建的原始Web框架,從?開始就包含在Spring框架中。它的正式名稱“SpringWebMVC”來?其源模塊的名稱(Spring-webmvc),但它通常被稱為)SpringMVC).
MVC是?種架構設計模式,也?種思想,?SpringMVC是對MVC思想的具體實現(xiàn).除此之外,SpringMVC還是?個Web框架.
總結來說,SpringMVC是?個實現(xiàn)了MVC模式的Web框架
MVC的定義
MVC是ModelViewController的縮寫,它是軟件?程中的?種軟件架構設計模式,它把軟件系統(tǒng)分為模型、視圖和控制器三個基本部分

- View(視圖)指在應?程序中專??來與瀏覽器進?交互,展?數(shù)據(jù)的資源.
- Model(模型)是應?程序的主體部分,?來處理程序中數(shù)據(jù)邏輯的部分.
- Controller(控制器)可以理解為?個分發(fā)器,?來決定對于視圖發(fā)來的請求,需要?哪?個模型來處理,以及處理完后需要跳回到哪?個視圖。即?來連接視圖和模型
二、Spring MVC中常用注解的使用
2.1@RequestMapping:地址映射
@RequestMapping既可修飾類,也可以修飾?法,當修飾類和?法時,訪問的地址是類路徑+?法路徑.
@RequestMapping標識?個類:設置映射請求的請求路徑的初始信息
@RequestMapping標識?個?法:設置映射請求請求路徑的具體信息
@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主要是用于客戶端上傳文件交給服務器進行處理
后端代碼實現(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;
}
可以得出結論:
- 使? @RequestParam 進?參數(shù)重命名時,請求參數(shù)只能和 @RequestParam 聲明的名稱?
- 致,才能進?參數(shù)綁定和賦值.使? @RequestParam 進?參數(shù)重命名時,參數(shù)就變成了必傳參數(shù).
2.6@RestController:數(shù)據(jù)控制器
是Contronller和ResponseBody的封裝,用于返回數(shù)據(jù)同時能夠將注解內容交給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 就相當于在所有的?法上添加了 @ResponseBody 注解.
同樣,如果類上有 @RestController 注解時:表?所有的?法上添加了 @ResponseBody 注解,也就是當前類下所有的?法返回值做為響應數(shù)據(jù)
設置狀態(tài)碼
SpringMVC會根據(jù)我們?法的返回結果?動設置響應狀態(tài)碼,程序員也可以?動指定狀態(tài)碼
通過SpringMVC的內置對象HttpServletResponse提供的?法來進?設置
@ResponseBody
public String setStatus(HttpServletResponse response) {
response.setStatus(401);
return "設置狀態(tài)碼成功";
}
2.8@CookieValue:獲取Cookie
Cook是用戶客戶端用于保存用戶的基本信息,以便于用戶在下一次登錄時可以直接進入

@RequestMapping("/getCookie")
public String cookie(@CookieValue("bite") String bite) {
return "bite:" + bite;
}
2.9@SessionAttribute:獲取Session
Session是服務器為了保存??信息?創(chuàng)建的?個特殊的對象

Session的本質就是?個"哈希表",存儲了?些鍵值對結構.Key就是SessionID,Value就是??信息(??信息可以根據(jù)需求靈活設計).
SessionId是由服務器?成的?個"唯?性字符串",從Session機制的?度來看,這個唯?性字符串稱為)SessionId).但是站在整個登錄流程中看待,也可以把這個唯?性字符串稱為)token).

- 當??登陸的時候,服務器在Session中新增?個新記錄,并把sessionId返回給客?端.(通過HTTP響應中的Set-Cookie字段返回).
- 客?端后續(xù)再給服務器發(fā)送請求的時候,需要在請求中帶上sessionId.(通過HTTP請求中的Cookie字段帶上).
- 服務器收到請求之后,根據(jù)請求中的sessionId在Session信息中獲取到對應的??信息,再進?后續(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是服務器端保存??信息的?種機制.
- Cookie和Session之間主要是通過SessionId關聯(lián)起來的,SessionId是Cookie和Session之間的
橋梁
- Cookie和Session經常會在?起配合使?.但是不是必須配合.
- 完全可以?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 | ?動添加?參構造?法 |
| @AllArgsConstructor | ?動添加全屬性構造?法,順序按照屬性的定義順序 |
| @NonNull | 屬性不能為null |
| @RequiredArgsConstructor | ?動添加必需屬性的構造?法,final+@NonNull的屬性為必需 |
@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsConstructor
因此可以說明在創(chuàng)建類對象時可以通過引入lambok工具包中的@Data注解,可以自動為我們添加其很多常用的賦值方法
三、應用分層-三層架構
?前現(xiàn)在更主流的開發(fā)?式是"前后端分離"的?式,后端開發(fā)?程師不再需要關注前端的實現(xiàn),所以對
于Java后端開發(fā)者,?有了?種新的分層架構:把整體架構分為表現(xiàn)層、業(yè)務邏輯層和數(shù)據(jù)層.這種分層
?式也稱之為"三層架構".
- 表現(xiàn)層:就是展?數(shù)據(jù)結果和接受??指令的,是最靠近??的?層;
- 業(yè)務邏輯層:負責處理業(yè)務邏輯,??有復雜業(yè)務的具體實現(xiàn);
- 數(shù)據(jù)層:負責存儲和管理與應?程序相關的數(shù)據(jù)可以看到,咱們前?的代碼,并不符合這種設計思想,?是所有的代碼堆砌在?起
按照上?的層次劃分,SpringMVC站在后端開發(fā)?員的?度上,也進?了?持,
- 請求處理、響應數(shù)據(jù):負責,接收??的請求,給??響應數(shù)據(jù).
- 邏輯處理:負責業(yè)務邏輯處理的代碼.
- 數(shù)據(jù)訪問:負責業(yè)務數(shù)據(jù)的維護操作,包括增、刪、改、查等操作

- Controller:控制層。接收前端發(fā)送的請求,對請求進?處理,并響應數(shù)據(jù)。
- Service:業(yè)務邏輯層。處理具體的業(yè)務邏輯。
- Dao:數(shù)據(jù)訪問層,也稱為持久層。負責數(shù)據(jù)訪問操作,包括數(shù)據(jù)的增、刪、改、查
MVC和三層架構的區(qū)別和聯(lián)系
關于?者的關系,?直存在不同的觀點.有?認為三層架構是MVC模式的?種實現(xiàn),也有?認為MVC是三層架構的替代?案,等等各種說法都有.根本原因是?家站在不同的?度來看待這個問題的.
JavaEE部分的學習重在"實踐",?家根據(jù)??的理解,能夠?圓其說,說出??的觀點即可,也不建議?家去背書.
從概念上來講,?者都是軟件?程領域中的架構模式.
MVC架構模式由三部分組成,分別是:模型(Model),視圖(View)和控制器(Controller).
三層架構將業(yè)務應?劃分為:表現(xiàn)層,業(yè)務邏輯層,數(shù)據(jù)訪問層.

MVC中,視圖和控制器合起來對應三層架構中的表現(xiàn)層.模型對應三層架構中的業(yè)務邏輯層,數(shù)據(jù)層,以及實體類
?者其實是從不同?度對軟件?程進?了抽象.
MVC模式強調數(shù)據(jù)和視圖分離,將數(shù)據(jù)展?和數(shù)據(jù)處理分開,通過控制器對兩者進?組合.
三層架構強調不同維度數(shù)據(jù)處理的?內聚和低耦合,將交互界?,業(yè)務處理和數(shù)據(jù)庫操作的邏輯分開.
?度不同也就談不上互相替代了,在?常的開發(fā)中可以經??吹絻煞N共存的情況,?如我們設計模型層的時候往往也會拆分出業(yè)務邏輯層(Service層)和數(shù)據(jù)訪問層(Dao層)
四、總結
學習SpringMVC,其實就是學習各種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是服務端機制.?者通過SessionId來關聯(lián).SpringMVC內置HttpServletRequest,HttpServletResponse兩個對象.需要使?時,直接在?法中添加對應參數(shù)即可,Cookie和Session可以從HttpServletRequest中來獲取,也可以直接使?HttpServletResponse設置Http響應狀態(tài)碼.
以上就是SpringWebMVC的常用注解及應用分層架構詳解的詳細內容,更多關于SpringWebMVC注解與架構的資料請關注腳本之家其它相關文章!
相關文章
Spring的@Value如何從Nacos配置中心獲取值并自動刷新
這篇文章主要介紹了Spring的@Value如何從Nacos配置中心獲取值并自動刷新,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
淺析如何利用Spring AI構建一個簡單的問答系統(tǒng)
Spring AI是Spring生態(tài)系統(tǒng)的最新成員,旨在簡化AI服務與Spring應用的集成過程,本文小編就來和大家簡單介紹一下如何利用Spring AI構建一個簡單的問答系統(tǒng)吧2025-05-05
使用Spring?Batch實現(xiàn)大數(shù)據(jù)處理的操作方法
通過使用Spring?Batch,我們可以高效地處理大規(guī)模數(shù)據(jù),本文介紹了如何配置和實現(xiàn)一個基本的Spring?Batch作業(yè),包括讀取數(shù)據(jù)、處理數(shù)據(jù)和寫入數(shù)據(jù)的全過程,感興趣的朋友跟隨小編一起看看吧2024-07-07

