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