欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringWebMVC的常用注解及應(yīng)用分層架構(gòu)詳解

 更新時(shí)間:2024年05月04日 08:59:26   作者:從零開(kāi)始的-CodeNinja之路  
這篇文章主要介紹了SpringWebMVC的常用注解及應(yīng)用分層架構(gòu),SpringWebMVC是基于ServletAPI構(gòu)建的原始Web框架,從?開(kāi)始就包含在Spring框架中,感興趣的朋友可以參考下

一、什么是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)

    本文主要介紹了SpringBoot多種環(huán)境自由切換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • MyBatis傳入List集合查詢數(shù)據(jù)問(wèn)題

    MyBatis傳入List集合查詢數(shù)據(jù)問(wèn)題

    這篇文章主要介紹了MyBatis傳入List集合查詢數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • SpringSecurity數(shù)據(jù)庫(kù)進(jìn)行認(rèn)證和授權(quán)的使用

    SpringSecurity數(shù)據(jù)庫(kù)進(jìn)行認(rèn)證和授權(quán)的使用

    本文主要介紹了用戶的賬號(hào)、密碼以及角色信息在數(shù)據(jù)庫(kù)中的認(rèn)證和授權(quán),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringCloud Config分布式配置中心使用教程介紹

    SpringCloud Config分布式配置中心使用教程介紹

    springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用
    2022-12-12
  • java發(fā)送javax.mail郵件實(shí)例講解

    java發(fā)送javax.mail郵件實(shí)例講解

    這篇文章主要為大家介紹了java發(fā)送javax.mail郵件實(shí)例講解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Java中的CountDownLatch閉鎖詳解

    Java中的CountDownLatch閉鎖詳解

    這篇文章主要介紹了Java中的CountDownLatch閉鎖詳解,CountDownLatch用給定的計(jì)數(shù)初始化,await屬于阻塞方法,直到當(dāng)前計(jì)數(shù)達(dá)到零,由于countDown方法被調(diào)用,然后釋放所有await等待的線程,并立即返回線程后續(xù)的await調(diào)用邏輯,需要的朋友可以參考下
    2023-12-12
  • java實(shí)現(xiàn)發(fā)牌小程序

    java實(shí)現(xiàn)發(fā)牌小程序

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)發(fā)牌小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 在IDEA中配置tomcat并創(chuàng)建tomcat項(xiàng)目的圖文教程

    在IDEA中配置tomcat并創(chuàng)建tomcat項(xiàng)目的圖文教程

    這篇文章主要介紹了在IDEA中配置tomcat并創(chuàng)建tomcat項(xiàng)目的圖文教程,需要的朋友可以參考下
    2020-07-07
  • IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決

    IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決

    這篇文章主要介紹了IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • maven-assembly-plugin報(bào)紅無(wú)法加載報(bào)錯(cuò):Plugin?‘maven-assembly-plugin:‘?not?found

    maven-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

最新評(píng)論