在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    阿里云一面:詳解下Spring MVC 框架

    阿里云一面:詳解下Spring MVC 框架

    一、Spring MVC 是什么

    Spring MVC 全稱 “Spring Web MVC” 是一個(gè) 基于 Servlet API 構(gòu)建的原始 Web 框架 ,從一開始就包含在 Spring 框架中

    Web 框架

    在之前學(xué)習(xí) Servlet 的時(shí)候就已經(jīng)接觸到 Web 。所謂的 Web 框架,就是當(dāng)用戶輸入一個(gè) URL 地址后,將 URL 地址和程序進(jìn)行映射,然后通過程序獲取到用戶的請(qǐng)求,經(jīng)過請(qǐng)求的處理后,服務(wù)器發(fā)送的響應(yīng)能夠返回到客戶端,將結(jié)果展示給用戶

    Servlet API

    有關(guān) Servlet API 的介紹文章

    MVC 含義

    MVC 是一種軟件工程中的一種軟件架構(gòu)模式,將軟件系統(tǒng)分成了模型、視圖、控制器三部分

    M(Model) :指的是 模型 ,用于處理應(yīng)用程序數(shù)據(jù)邏輯部分

    V(View) :指的是 視圖 ,用于處理數(shù)據(jù)顯示部分

    C(Controller) :指的是 控制器 ,用于處理用戶交互的部分

    解釋

    用戶通過瀏覽器去訪問程序的時(shí)候,請(qǐng)求會(huì)先到 Controller(控制層),控制層驗(yàn)證參數(shù)的合法性,如果沒有問題的話,就會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給 Model(模型)進(jìn)行業(yè)務(wù)的處理,然后將結(jié)果(業(yè)務(wù)數(shù)據(jù))響應(yīng)給控制層,然后控制層再將數(shù)據(jù)發(fā)送給 View(視圖),視圖最后做合并和整理工作,組裝成了一個(gè) HTML 頁面,最后將頁面響應(yīng)給用戶

    總的來說, MVC 就是一種思想, Spring MVC 就是對(duì) MVC 這是一種思想的具體實(shí)現(xiàn)

    二、Spring MVC 具體使用

    2.1 Spring MVC 創(chuàng)建

    Spring MVC 使用 Spring Boot 的方式創(chuàng)建的,創(chuàng)建的 Spring Boot 項(xiàng)目過程中有勾選依賴這一環(huán)節(jié),勾選的 Spring Web 框架 就是 Spring MVC 框架,將該依賴給勾選上了,其余的就是正常的創(chuàng)建 Spring Boot 項(xiàng)目的步驟

    2.2 Spring MVC 連接

    Spring MVC 連接即將用戶和 Java 程序進(jìn)行連接,用戶通過一個(gè)地址就可以調(diào)用到 Spring 程序

    @RequestMapping 注解

    在 Spring MVC 中常常使用 @RequestMapping 注解實(shí)現(xiàn)路由映射

    路由映射就是用戶訪問 URL 時(shí),能夠?qū)⒂脩舻恼?qǐng)求和程序中的某個(gè)類中的某個(gè)方法對(duì)應(yīng)起來

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/hello”) public String func() { return “

    Hello Spring MVC

    “; }}

    解釋

  • 當(dāng)啟動(dòng)項(xiàng)目后,訪問地址 http://127.0.0.1:8080/index/hello 就能獲取到返回的內(nèi)容 “Hello Spring MVC”
  • @RestController 注解是 @Controller 和 @ResponseBody 這兩個(gè)注解的合體 。添加 @Controller 注解是為了項(xiàng)目啟動(dòng)后,該類放在了 Spring 容器中,被加載,方才能被訪問到。添加 @RequestBody 注解是因?yàn)槟J(rèn)情況下會(huì)返回一個(gè)靜態(tài)頁面,但是此時(shí)只是返回一個(gè)數(shù)據(jù),因此需要添加
  • @RequestMapping 注解是可以修飾類,也可以修飾方法,一定要在方法上添加注解,類上面不一定需要
  • 默認(rèn)情況下,@RequestMapping 接收 GET 方式 的請(qǐng)求,但是也可以接受 POST 方式 的請(qǐng)求
  • 顯示指定方法

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(value = “/hello”,method = RequestMethod.POST) public String func() { return “

    Hello Spring MVC

    “; }}

    通過 method 參數(shù) 內(nèi)容就可以指定具體的接收方法,此時(shí)該方法只能接收 POST 請(qǐng)求

    @GetMapping 和 @PostMapping

    除了在 @RequestMapping 注解中指定接收的方法之外,也可以直接使用 @GetMapping 和 @PostMapping 注解,前者使得方法只能接收 GET 請(qǐng)求,后者使得方法只能接受 POST 請(qǐng)求

    2.3 如何獲取參數(shù)

    2.3.1 通過 URL 傳遞參數(shù)

    例如URL:http://127.0.0.1:8080/index/getUser?userName=peter&passWord=123

    想要獲取 userName 和 passWord 對(duì)應(yīng)的內(nèi)容,可以直接使用方法中的參數(shù)來實(shí)現(xiàn)傳參

    代碼展示

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/getUser”) public String getUser(String userName,String passWord) { return “userName->”+ userName + ” | passWord->” + passWord; }}

    結(jié)果顯示

    注意

    2.3.2 通過表單傳遞參數(shù)

    通過表單進(jìn)行參數(shù)的傳遞方法也是和上面差不多的

    代碼同上面的代碼展示,通過 PostMan 進(jìn)行提交 form 表單,也需要注意參數(shù)的對(duì)應(yīng)

    結(jié)果展示

    2.3.3 傳遞對(duì)象

    在參數(shù)較少的情況下,會(huì)使用直接傳參的方式,如果參數(shù)較多時(shí),使用對(duì)象進(jìn)行傳參會(huì)更好

    代碼展示

    @Datapublic class User { private String userName; private String passWord;}@RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/getUser1”) public String gerUser1(User user) { String name = user.getUserName(); String word = user.getPassWord(); return “對(duì)象中的userName:” + name + ” | 對(duì)象中的passWord:” + word; }}

    結(jié)果顯示

    代碼參數(shù)是一個(gè) User 對(duì)象,說明待會(huì)需要接收的就是一個(gè)對(duì)象,然后就會(huì)拿著這個(gè)對(duì)象中的所有屬性,在請(qǐng)求中匹配參數(shù)

    2.3.4 補(bǔ)充

    后端參數(shù)的重命名

    后端參數(shù)名未必一定要和前端參數(shù)名一模一樣,可以通過 @RequestParam 注解來 重命名前后端的參數(shù)值

    @RequestMapping(“/getUser”)public String getUser(@RequestParam(“userName”) String name,String passWord) { return “userName->”+ name + ” | passWord->” + passWord;}

    前端的參數(shù) key 是 userName 和 passWord ,后端的參數(shù) key 是 name 和 passWord

    設(shè)置參數(shù)必傳/非必傳

    同樣是上面的代碼,如果參數(shù)中只傳了 userName 參數(shù)會(huì)怎樣,只傳了 passWord 參數(shù)會(huì)怎樣

    結(jié)果顯示

    如果沒有傳遞 passWord 參數(shù),影響不大

    如果沒有傳遞 userName 參數(shù),就會(huì)報(bào) 400 錯(cuò)誤

    原因就是 @RequestParam 中的 required 參數(shù)默認(rèn)值為 true ,表示 為必傳參數(shù)

    如果有參數(shù)需要使用 @RequestParam 注解且該參數(shù)是非必傳參數(shù),就需要將 required 參數(shù)值設(shè)置為 false

    @RequestMapping(“/getUser”)public String getUser(@RequestParam(value = “userName”,required = false) String name,String passWord) { return “userName->”+ name + ” | passWord->” + passWord;}

    2.3.5 接收 JSON 對(duì)象

    使用 @RequestBody 來接收 JSON 對(duì)象

    代碼展示

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/loginByJson”) public String loginByJson(@RequestBody User user) { return “userName:” + user.getUserName() + ” | passWord:” + user.getPassWord(); }}

    結(jié)果顯示

    2.3.6 獲取 URL 中的參數(shù)

    一般來說,獲取 URL 中的參數(shù)一般是指獲取 query String 中的參數(shù)值,但還有一種特殊的,就是從 URL 的 PATH 中獲取參數(shù)

    需要通過 @PathVariable 注解

    代碼展示

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/loginByPath/{userName}/{passWord}”) public String loginByPath(@PathVariable(“userName”) String name, @PathVariable String passWord) { return “userName:” + name + ” |passWord:” + passWord; }}

    注意

  • 路徑中的參數(shù)需要用花括號(hào)包裹
  • @PathVariable 中傳入?yún)?shù)也可以實(shí)現(xiàn)重命名
  • 注意參數(shù)名的一一對(duì)應(yīng)(不可少參數(shù))
  • 結(jié)果顯示

    2.3.7 文件上傳

    使用 @RequestPart 注解上傳圖片

    代碼展示

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/upLoad”) public String upLoadFile(String userName, @RequestPart(“picture”)MultipartFile file) throws IOException { //獲取文件后綴 String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(“.”)); //文件路徑 String filePath = System.getProperty(“user.dir”)+ “/src/main/resources/picture/” + UUID.randomUUID().toString(); //拼接路徑 String finallyPath = filePath + suffix; file.transferTo(new File(finallyPath)); return userName + “上傳了一張圖片”; }}

    注意

  • RequestPart 注解里對(duì)應(yīng)的是上傳圖片的參數(shù)名
  • 通過 file.getOriginalFilename() 方法獲取圖片的完整名,然后通過查找最后一個(gè) “.” ,來截取出后綴名
  • System.getProperty(“user.dir”) 為獲取當(dāng)前工程目錄
  • 拼接完路徑后,file.transferTo(new File(finallyPath)),創(chuàng)建文件實(shí)例并保存
  • 為了生成獨(dú)一無二的文件名,這里使用了 UUID
  • 結(jié)果顯示

    2.3.8 獲取 Cookie/Session/header

    獲取 Cookie

    通過 @CookieValue 注解

    @RequestMapping(“/getCookie”)public String getCookie(@CookieValue(“newCookie”) String value) { return “cookie:” + value;}

    最一開始訪問該方法時(shí)結(jié)果為 404 ,因?yàn)榇藭r(shí)沒有 key 為 newCookie 這樣的 Cookie

    通過瀏覽器端模擬該 Cookie 后,就可以獲取到 Cookie 的值

    獲取 Header

    通過 @RequestHeader 注解

    @RequestMapping(“/getHeader”)public String getHeader(@RequestHeader(“User-Agent”) String content) { return “User-Agent:” + content;}

    獲取 Session

    通過 @SessionAttribute 注解

    按照以前的方法來創(chuàng)建 Session

    @RequestMapping(“/setSession”)public String setSession(HttpServletRequest req) { HttpSession session = req.getSession(true); if(session != null) { session.setAttribute(“userName”,”Spring MVC”); } return “session 設(shè)置完成”;}

    獲取 Session 對(duì)象中的 key 為 userName 的值

    @RequestMapping(“/getSession”)public String getSession(@SessionAttribute(value = “userName”,required = false) String userName) { return “userName:” + userName;}

    2.4 如何返回參數(shù)

    2.4.1 返回靜態(tài)頁面

    默認(rèn)請(qǐng)求下,Spring Boot 返回的是靜態(tài)頁面

    代碼展示

    @Controller@RequestMapping(“/index”)public class UserController { @RequestMapping(“/getView”) public String getView() { return “/index.html”; }}

    index.html 中主要內(nèi)容為 Hello Spring MVC~

    2.4.2 返回 text/html

    在之前的各種例子中都是返回 text/html 類型,當(dāng)方法 返回值為 String 時(shí) ,并且有加上 @ResponseBody 注解,返回的就是 text/html 類型

    實(shí)例:計(jì)算機(jī)加法實(shí)現(xiàn)

    前端代碼展示

    計(jì)算機(jī) 數(shù)字1: 數(shù)字2:

    后端代碼展示

    @RestControllerpublic class CalcController { @RequestMapping(“/calc”) public String calc(Integer one, Integer two) { if(one == null || two == null) return “不可為空”; return String.format(“%d 加上 %d 等于 %d”,one,two,one+two); }}

    結(jié)果顯示

    2.4.3 返回 JSON

    通過 HashMap 返回?cái)?shù)據(jù)或者返回一個(gè) 對(duì)象 ,返回的數(shù)據(jù)類型就是 JSON

    代碼展示(Map)

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/getUserByJson”) public HashMap getUserByJson(String userName,String passWord) { HashMap map = new HashMap(); map.put(“userName”,userName); map.put(“passWord”,passWord); return map; }}

    結(jié)果顯示(Map)

    代碼展示(對(duì)象)

    @RestController@RequestMapping(“/index”)public class UserController { @RequestMapping(“/getUserByJson1”) public User getUserByJson1(String userName,String passWord) { User user = new User(); user.setUserName(userName); user.setPassWord(passWord); return user; }}

    結(jié)果顯示(對(duì)象)

    實(shí)例:實(shí)現(xiàn)登錄操作

    要求:

  • 用戶提交數(shù)據(jù)為 json 類型,返回結(jié)果為 json 類型
  • 指定用戶名為 “Json”,用戶密碼為 “123”為登錄成功
  • 前端代碼展示

    用戶登錄

    登錄

    用戶姓名: 用戶密碼:

    后端代碼展示

    @RestControllerpublic class LoginController { @RequestMapping(“/login”) public HashMap login(@RequestBody User user) { HashMap map = new HashMap(); String message = “”; //用戶名和密碼判斷,不得為null或”” if (StringUtils.hasLength(user.getUserName())&& StringUtils.hasLength(user.getPassWord())) { if (user.getUserName().equals(“Json”)&&user.getPassWord().equals(“123”)) { message = “”; }else { message = “用戶名或者密碼有誤,登錄失敗”; } }else { message = “請(qǐng)將信息填寫完整”; } map.put(“succ”,200); map.put(“message”,message); return map; }}

    結(jié)果展示

    2.4.4 請(qǐng)求轉(zhuǎn)發(fā)/請(qǐng)求重定向

    forward(請(qǐng)求轉(zhuǎn)發(fā))

    • 服務(wù)器進(jìn)行轉(zhuǎn)發(fā);
    • 請(qǐng)求轉(zhuǎn)發(fā)地址不會(huì)發(fā)生變化;
    • 請(qǐng)求轉(zhuǎn)發(fā)由于是服務(wù)器轉(zhuǎn)發(fā)的原來的外部資源可能訪問不到

    redirect(請(qǐng)求重定向)

    • 請(qǐng)求重新定位到資源;
    • 請(qǐng)求的地址發(fā)生變化;
    • 請(qǐng)求重定向和直接訪問新地址效果是一樣的,原來的外部資源可以順利訪問到

    代碼展示

    前端代碼展示

    Document

    Hello Spring MVC~

    CSS代碼展示

    h1 { color: red;}

    后端代碼展示

    @Controllerpublic class UserController { //請(qǐng)求轉(zhuǎn)發(fā)@RequestMapping(“/forward”) public String forward() { return “forward:/index.html”; } //請(qǐng)求重定向 @RequestMapping(“/redirect”) public String redirect() { return “redirect:/index.html”; }}

    結(jié)果顯示

    可以看出轉(zhuǎn)發(fā)的 URL 是不變的,重定向的 URL 是會(huì)變的

    如果在類上也添加路由映射會(huì)發(fā)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)獲取不到資源了

    后端代碼展示

    @Controller@RequestMapping(“/index”)public class UserController { //請(qǐng)求轉(zhuǎn)發(fā)@RequestMapping(“/forward”) public String forward() { return “forward:/index.html”; } //請(qǐng)求重定向 @RequestMapping(“/redirect”) public String redirect() { return “redirect:/index.html”; }}

    結(jié)果展示

    此時(shí)轉(zhuǎn)發(fā)的頁面路徑多了 index, 和資源沒有在同一級(jí)目錄下,導(dǎo)致資源獲取的失敗

    原文 https://blog.csdn.net/weixin_46103589/article/details/125430579

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年6月25日 18:44
    下一篇 2022年6月25日 18:45

    相關(guān)推薦

    • ios手游模擬器(手游模擬器ios)

      本文主要講的是ios手游模擬器,以及和手游模擬器ios相關(guān)的知識(shí),如果覺得本文對(duì)您有所幫助,不要忘了將本文分享給朋友。 哪個(gè)iOS模擬器能多開手游賬號(hào)?可以推薦個(gè)好用的模擬器給我嗎…

      2022年11月27日
    • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

      對(duì)于微商朋友來說,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營(yíng)一個(gè)朋友圈,有的微商看起來逼格滿滿,實(shí)際效果也不錯(cuò);而有的卻動(dòng)都不動(dòng)就被屏蔽甚至拉黑…

      2022年11月27日
    • 短視頻策劃內(nèi)容的3個(gè)要點(diǎn)(短視頻策劃內(nèi)容怎么做)

      短視頻在制作時(shí),內(nèi)容框架非常重要。如果直奔主題,然后結(jié)束,聚卓告訴你,這樣的短視頻已經(jīng)過時(shí)了。現(xiàn)在的短視頻需要框架的,但不是任何框架,它需要一種易于理解和消化的框架。而且,現(xiàn)在大多…

      2022年11月27日
    • 美團(tuán)第三季度實(shí)現(xiàn)營(yíng)收626億元,即時(shí)配送訂單量增至50億筆

      新京報(bào)訊(記者秦勝南)11月25日,美團(tuán)發(fā)布業(yè)績(jī)公告顯示,第三季度營(yíng)收為626億元,較去年同比增長(zhǎng)28.2%,凈利潤(rùn)為12.2億元。第三季度,美團(tuán)即時(shí)配送訂單數(shù)增長(zhǎng)至50億筆。截至…

      2022年11月27日
    • 存儲(chǔ)過程語法(sql server存儲(chǔ)過程語法)

      今天小編給各位分享存儲(chǔ)過程語法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過程基本語法…

      2022年11月26日
    • 個(gè)人怎么做抖音帶貨(個(gè)人做抖音帶貨能賺錢嗎)

      抖音如今是大家很熟悉的短視頻平臺(tái),不過現(xiàn)在的抖音卻不只是短視頻那么簡(jiǎn)單,它的功能非常豐富,其中一個(gè)就是可以帶貨,相信很多小伙伴都有在抖音上買過東西,抖音如今的變現(xiàn)能力也是不容小覷的…

      2022年11月25日
    • 《寶可夢(mèng)朱紫》夢(mèng)特性怎么獲得?隱藏特性獲取方法推薦

      寶可夢(mèng)朱紫里有很多寶可夢(mèng)都是擁有夢(mèng)特性會(huì)變強(qiáng)的寶可夢(mèng),很多玩家不知道夢(mèng)特性怎么獲得,下面就給大家?guī)韺毧蓧?mèng)朱紫隱藏特性獲取方法推薦,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 …

      2022年11月25日
    • 《寶可夢(mèng)朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

      寶可夢(mèng)朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)韺毧蓧?mèng)朱紫奇魯莉安進(jìn)化方法分享,感興趣的小伙伴一起來看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

      2022年11月25日
    • 拼多多百億補(bǔ)貼預(yù)售一般多久發(fā)貨(拼多多百億補(bǔ)貼預(yù)售)

      拼多多里面有很多優(yōu)惠活動(dòng),其中百億補(bǔ)貼活動(dòng)非?;鸨?,一些里面的東西價(jià)格比別的平臺(tái)便宜,質(zhì)量也有保障,還有預(yù)售的活動(dòng),那么拼多多百億補(bǔ)貼預(yù)售一般多久發(fā)貨?下面小編為大家?guī)砥炊喽喟賰|…

      2022年11月25日
    • 小紅書平臺(tái)的一些機(jī)制及玩法詳解(小紅書玩法有哪些)

      關(guān)于小紅書 一:小紅書平臺(tái)的一些機(jī)制 1. 筆記內(nèi)容的CES評(píng)分機(jī)制 2. 筆記流量入口與長(zhǎng)尾效應(yīng) 二:小紅書優(yōu)質(zhì)筆記的特點(diǎn)(分維度、類型分析) 1.筆記的本身架構(gòu)組成 維度 2.…

      2022年11月25日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息