SpringBoot與SpringMVC第一講
什么是springMVC
SpringMVC
首先想要知道什么是SpringMVC我們就要先知道它的意思,首先什么是MVC呢?MVC即
模型,視圖,控制器
其實(shí)SpringMVC全名應(yīng)該叫做SpringWebMVC,它其實(shí)是基于servlet來(lái)構(gòu)建的一個(gè)原始web框架從一開(kāi)始就包含在了spring框架中。
那么通過(guò)上面的介紹我們知道SpringMVC的兩個(gè)基本信息
第一個(gè):它是一個(gè)web礦建
第二個(gè):它是基于servlet的api構(gòu)建出的一個(gè)框架
什么是模型、視圖、控制器
模型視圖控制器其實(shí)是我們軟件架構(gòu)模式中的一種,它把軟件系統(tǒng)分為了這三個(gè)部分我們來(lái)分別進(jìn)行解析一下
Model(模型):是應(yīng)用程序中負(fù)責(zé)存取程序和數(shù)據(jù)邏輯的部分,一般是在數(shù)據(jù)庫(kù)中負(fù)責(zé)數(shù)據(jù)的存取
Controller(控制器):是應(yīng)用程序中負(fù)責(zé)用戶交互的部分通??刂破髫?fù)責(zé)從視圖中讀取,用戶需要的數(shù)據(jù)并返回給用戶。
View(視圖):是應(yīng)用程序中用來(lái)顯示出數(shù)據(jù)的部分通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
MVC和SpringMVC的關(guān)系
我們上面說(shuō)到MVC其實(shí)是實(shí)現(xiàn)一個(gè)應(yīng)用的一種架構(gòu),那么SpringMVC呢?其實(shí)就是對(duì)這種架構(gòu)的具體實(shí)現(xiàn),也就是說(shuō)MVC是一種思想,SpringMVC是實(shí)現(xiàn)這種思想的其中一種方式,
SpringMVC的使用
那么我們說(shuō)了既然SpringMVC是一個(gè)web框架,并且還是MVC架構(gòu)的一種實(shí)現(xiàn),并且還是基于servlet的API創(chuàng)造出的,那么我們代入一下,學(xué)習(xí)Servlet的過(guò)程,我們可以推測(cè)出他肯定也是獲取連接,并且根據(jù)連接請(qǐng)求,建立與數(shù)據(jù)庫(kù)的交互并且返回?cái)?shù)據(jù),那么Servlet是根據(jù)@WebServlet(“/xxx”)來(lái)進(jìn)行解析連接的,那么SpringMVC是怎么使用的呢?我們來(lái)看一下。
第一個(gè)SpringMVC程序
首先我們先寫一個(gè)類
@RestController public class hello { }
我們來(lái)看一下映入眼簾中的第一個(gè)讓我們懵逼的東西那就是這個(gè)類上的注解@RestController,我們接下來(lái)就來(lái)解釋一下這個(gè)注解
@RestController
什么是@RestController呢?他是一個(gè)注解,或者說(shuō)叫做組合注解,那么我們先搞懂一個(gè)概念,什么是注解?
什么是注解
我們可以類比于注釋的概念去理解,這兩者最大的區(qū)別就是注釋主要是給人看的,而注解是給機(jī)器看的,比如說(shuō)我們?cè)趯W(xué)習(xí)多態(tài)那里的時(shí)候如果細(xì)心的同學(xué)應(yīng)該在重寫了父類的方法子類方法中見(jiàn)到過(guò)@Override這個(gè)注解,這個(gè)注解的作用就是告訴編譯器我的 這個(gè)方法是重寫了父類的方法,那么當(dāng)編譯器看到這個(gè)注解的時(shí)候他會(huì)多做一些事情,首先要做的就是要先看看你到底有沒(méi)有重寫父類的方法你要是沒(méi)有寫那你就是欺騙我的感情,是渣男,渣女人渣,這時(shí)候編譯器直接不留情面的給你來(lái)個(gè)報(bào)錯(cuò)。那么專業(yè)些的說(shuō)法是什么呢?
注解是提供一種為程序元素設(shè)置元數(shù)據(jù)的方法,理解起來(lái)還是一樣的,程序元素就是指接口、類、屬性、方法,這些都是屬于程序的元素,那啥叫元數(shù)據(jù)呢?就是描述數(shù)據(jù)的數(shù)據(jù)(data about data),舉個(gè)簡(jiǎn)單的例子,系統(tǒng)上有一個(gè)sm.png文件,這個(gè)文件才是我們真正需要的數(shù)據(jù)本身,而這個(gè)文件的屬性則可以稱之為sm.png的元數(shù)據(jù),是用來(lái)描述png文件的創(chuàng)建時(shí)間、修改時(shí)間、分辨率等信息的,這些信息無(wú)論是有還是沒(méi)有都不影響它作為圖片的性質(zhì),都可以使用圖片軟件打開(kāi)。
那么@RestController到底是干嘛的呢?
我們有了上面概念的基礎(chǔ)我們?cè)賮?lái)說(shuō)一下,到底@RestController是干嘛的,他想告訴編譯器什么?大家不要急要想知道這個(gè)問(wèn)題我們要先搞明白,為什么說(shuō)他是組合注解它組合了誰(shuí),它組合 的就是@Controller和@ResponseBody兩個(gè)注解的功能。那么組合之后有什么功能呢?@RestController注解的類接下來(lái)類中的方法返回的數(shù)據(jù)都是json數(shù)據(jù),也就是說(shuō)當(dāng)我們使用了@RestController這個(gè)注解之后我們就不需要在要返回json數(shù)據(jù)的方法中添加@ResponseBody注解了。
那么接下來(lái)我們就要繼續(xù)寫代碼了。
package com.example.test_spring2.controller; import org.springframework.boot.SpringApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class hello { @RequestMapping("sayHi") public String hello(){ return "hello Spring MVC"; } }
這一次我們加入了新的方法和注解那就是@RequestMapping那么接下來(lái)我們?cè)俅蝸?lái)學(xué)習(xí)一下這個(gè)注解
@RequestMapping
這個(gè)注解的作用是什么呢?這個(gè)注解的作用我們可以參考一下@WebServlet這個(gè)注解,我們知道@WebServlet這個(gè)注解是為了映射連接的說(shuō)白了我們想要訪問(wèn)被這個(gè)注解修飾的方法就必須要輸入這個(gè)注解中的值作為url,那么@RequestMapping也一樣也是為了去進(jìn)行地址映射的,那么這個(gè)注解除了修飾方法之外還能修飾類嗎?答案是可以的。那么我們來(lái)寫一個(gè)代碼試試把
package com.example.test_spring2.controller; import org.springframework.boot.SpringApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/sayicll") public class hello { @RequestMapping("sayHiIicll") public String hello(){ return "hello Spring MVC"; } }
那么如果代碼這樣寫的話我們的url該怎么寫呢?如下
http://127.0.0.1:8080/sayicll/sayHiIicll
也就是說(shuō)我們需要先將描述類的那層@RequestMapping寫在前面然后寫描述方法的@RequestMapping,此時(shí)可能就會(huì)用同學(xué)有疑問(wèn),既然這樣子的話那我發(fā)送什么請(qǐng)求可以被接收呢?我們來(lái)測(cè)試一下就可以了這里我們使用的軟件是postman
這里我們發(fā)現(xiàn)無(wú)論是get還是post請(qǐng)求我們都能發(fā)送別接受其返回,那么這時(shí)候可能會(huì)用同學(xué)有疑問(wèn)那么如果我就是想要讓他特定的接收其中一個(gè)請(qǐng)求怎么辦呢?當(dāng)然也可以,這就需要用到method了如下
@RestController @RequestMapping("/sayicll") public class hello { @RequestMapping(value = "sayHiIicll",method = RequestMethod.POST) public String hello(){ return "hello Spring MVC"; } }
這就表示他只能使用post進(jìn)行那么還有別的形式嗎?也是有的如下代碼我們來(lái)構(gòu)建一下請(qǐng)求
@RestController @RequestMapping("/sayicll") public class hello { @PostMapping("helloIicll") public String hello(){ return "hello Spring MVC"; } @PostMapping("hiIicll") public String hi(){ return "hi I i cll"; } }
那么如上這個(gè)注解就可以幫助我們這個(gè)方法只能,接收post請(qǐng)求那么我們按照相同的思路就能猜測(cè)到肯定有個(gè)注解叫做@GetMapping,那么這個(gè)注解肯定就是幫助我們的方法只能接收Get請(qǐng)求了。
如何接收來(lái)自請(qǐng)求中的querystrying
首先我們來(lái)看一下我們的后端代碼
@RequestMapping("/h1") public String h1(String name){ return "name="+name; }
有了上面的基礎(chǔ)我們來(lái)嘗試一下接收來(lái)自請(qǐng)求中querystring中的參數(shù),這里的參數(shù)如何獲取呢?其實(shí)也很簡(jiǎn)單就是保證我們這個(gè)方法中的參數(shù)和我們querystring中的參數(shù)一致這樣spring可以幫助我們自動(dòng)匹配,那么我們來(lái)看一下結(jié)果驗(yàn)證一下吧。
這里我們發(fā)現(xiàn)我們只需要做到前端的querystring和后端方法中設(shè)置的參數(shù)名一致就可以保證我們的請(qǐng)求序列中的參數(shù)被準(zhǔn)確的接收到了。那么假如說(shuō)我不希望和前端的保持一致呢?也就是我如何才能跟前端發(fā)給我的參數(shù)名稱進(jìn)行重命名呢?這時(shí)候就需要學(xué)習(xí)到一個(gè)新的注解了。
@RequestParam
我們來(lái)解釋一下@RequestParam這個(gè)注解,這個(gè)注解的作用就是重命名前端傳來(lái)的參數(shù),用法是如何呢?我們來(lái)看一下代碼
@RequestMapping("/h1") public String h1(@RequestParam("name") String username){ return "name="+username; }
我們來(lái)看一下結(jié)果如下圖
那么這時(shí)候我們來(lái)思考一個(gè)問(wèn)題那就是這里有什么不同呢?其實(shí)很明顯的一個(gè)就是我們的代碼中原來(lái)返回的是name現(xiàn)在返回的參數(shù)是username了,其實(shí)這就是因?yàn)閚ame是前端發(fā)送給我們的數(shù)據(jù)參數(shù),username才是我們后端自己命名的參數(shù)那么你想在后端代碼中使用這個(gè)值你肯定用的是自己定義的參數(shù)才對(duì)嘛。此外我們需要注意的是這樣寫的話這個(gè)name就是一個(gè)必傳參數(shù),也就是說(shuō)必須要有這個(gè)name值才可以那么如果我不想設(shè)置這個(gè)參數(shù)呢?
@RequestMapping("/h1") public String h1(@RequestParam(value = "name",required = false) String username){ return "name="+username; }
這里我們只需要設(shè)置一下request=false就可以了。
@RequestMapping(“/m9/{userId}/{name}”)
這里我們想一下一些url的一些我們需要的屬性可能即不在query string中也不在body中而是在url中那么這時(shí)候我們?cè)撛趺崔k呢?這里 @RequestMapping給我們提供了更多的用法也就是上面的那種我們只需要將我們需要的參數(shù)提前在 @RequestMapping中設(shè)置好就可以了,此外我們還需要搭配著另外的一個(gè)屬性,@PathVariable 進(jìn)行使用那么代碼如下
@RequestMapping("/m9/{userId}/{name}") public String m9(@PathVariable Integer userId,@PathVariable("name") String userame){ return "userId:"+userId + ",userame:"+userame; }
到此這篇關(guān)于SpringBoot與SpringMVC第一講的文章就介紹到這了,更多相關(guān)SpringBoot與SpringMVC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cache相關(guān)知識(shí)總結(jié)
今天帶大家學(xué)習(xí)Spring的相關(guān)知識(shí),文中對(duì)Spring Cache作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)Java Spring的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05如何在JDK 9中更簡(jiǎn)潔使用 try-with-resources 語(yǔ)句
本文詳細(xì)介紹了自 JDK 7 引入的 try-with-resources 語(yǔ)句的原理和用法,以及介紹了 JDK 9 對(duì) try-with-resources 的改進(jìn),使得用戶可以更加方便、簡(jiǎn)潔的使用 try-with-resources 語(yǔ)句。,需要的朋友可以參考下2019-06-06Spring引入外部屬性文件配置數(shù)據(jù)庫(kù)連接的步驟詳解
這篇文章主要介紹了Spring引入外部屬性文件配置數(shù)據(jù)庫(kù)連接的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Spring IOC創(chuàng)建對(duì)象的兩種方式
這篇文章主要給大家介紹了關(guān)于Spring IOC創(chuàng)建對(duì)象的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Springboot mybatis-plus配置及用法詳解
這篇文章主要介紹了Springboot mybatis-plus配置及用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09maven打包zip包含bin下啟動(dòng)腳本的完整代碼
這篇文章主要介紹了maven打包zip包含bin下啟動(dòng)腳本,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10