網(wǎng)站開發(fā)b2b網(wǎng)上推廣平臺有哪些
官方對于Spring MVC的描述為:
Spring Web MVC是基于Servlet API框架構(gòu)建的原始Web框架,從一開始就包含在Spring框架中。它的正式名稱“Spring Web MVC”來自其源模塊的名稱(Spring-webmvc),但它通常被稱為“Spring-MVC”。
目錄
Spring MVC 介紹
學(xué)習(xí)Spring MVC
連接
@RequestMapping
指定類型
獲取參數(shù)
獲取對象
參數(shù)重命名(參數(shù)映射)
接收J(rèn)son對象
從URL中獲取參數(shù)
上傳文件
獲取Cookie
獲取Session
獲取Header
?編輯
請求定向和請求轉(zhuǎn)發(fā)
Spring MVC 介紹
MVC 是Model View Controller的縮寫,是軟件工程中的一種軟件架構(gòu)模式,它把軟件系統(tǒng)分成模型、視圖和控制器三個(gè)部分。
MVC是一種思想,而Spring MVC是對MVC思想的具體實(shí)現(xiàn):
Spring MVC是一個(gè)實(shí)現(xiàn)了MVC模式,并繼承了Servlet API的Web框架。既然是Web框架,那么當(dāng)用戶在瀏覽器中輸入了url之后,我們的Spring MVC項(xiàng)目就可以感知到用戶的請求。
現(xiàn)在絕大多數(shù)的Java項(xiàng)目都是基于Spring 或Spring Boot,而Spring的核心就是Spring MVC。
在創(chuàng)建Spring Boot項(xiàng)目時(shí),我們勾選的Spring Web框架其實(shí)就是Spring MVC框架:
學(xué)習(xí)Spring MVC
學(xué)習(xí)Spring MVC需要掌握三個(gè)功能:
連接、獲取參數(shù)、輸入數(shù)據(jù)。
連接
在項(xiàng)目創(chuàng)建好之后,創(chuàng)建一個(gè)UserController類,實(shí)現(xiàn)用戶到Spring程序的互聯(lián)互通:
我們用到了三個(gè)注釋:@Controller @ResponseBody @RequestMapping
@Controller:五大類注解,表示把這個(gè)類添加到IoC容器中,供Spring拿到。
@ResponseBody:表示把這個(gè)Java對象轉(zhuǎn)換成json格式相關(guān)的內(nèi)容,表示返回非頁面數(shù)據(jù)
通過@RestController =?@Controller + @ResponseBody 可以完成兩個(gè)注釋的內(nèi)容合二為一。
@RequestMapping
@RequestMapping既可以修飾類也可以修飾方法,當(dāng)修飾類和方法時(shí),訪問的地址是類 + 方法。
并且也可以直接修飾方法。
指定類型
@RequestMapping可以為GET方法也可以為POST方法,如果不規(guī)定則兩個(gè)方法都可以用。但如果要求只能是POST或者只能是GET方法呢?
想只要GET方法,有兩種寫法:
- @RequestMapping(value = "/user",method = RequestMethod.GET)
- @GetMapping("/index")
想只要POST方法,有兩種寫法:
- @RequestMapping(value = "/user",method = RequestMethod.POST)
- @PostMapping("/user")
獲取參數(shù)
在Spring MVC中可以直接用方法中的參數(shù)來實(shí)現(xiàn)傳參,相比于Servlet中大費(fèi)周折的getParameter等方式簡單了很多。
在Spring MVC中,只需要方法的形參和前端傳入的變量名相同,就能夠直接獲取到相關(guān)的參數(shù)。
獲取對象
Spring MVC可以自動(dòng)實(shí)現(xiàn)參數(shù)對象的賦值:
并且當(dāng)有多個(gè)參數(shù)的時(shí)候,前后端匹配數(shù)據(jù)的時(shí)候以名稱進(jìn)行匹配的,因此參數(shù)的位置不影響后端獲取的參數(shù)的結(jié)果。
參數(shù)重命名(參數(shù)映射)
和前面提到的一樣,如果前后端名稱不一樣但是想要獲取到匹配的數(shù)據(jù),此時(shí)可以使用@RequestParam 來重命名前后端的參數(shù)值。
例如,前端傳來的參數(shù)為username,但是后端為name,此時(shí)給后端參數(shù)重命名:
并且如果某個(gè)參數(shù)是非必傳參數(shù)的話,可以設(shè)置@RequestParam中的requird=false來避免不傳遞時(shí)報(bào)錯(cuò):
接收J(rèn)son對象
這次我們不用表單的形式來傳對象,而是使用Json的格式來傳遞對象。只有使用了@RequestBody后才能正確的把對象解析出來。
從URL中獲取參數(shù)
對于前面的通過表單的形式拿數(shù)據(jù),主要是通過URL中?后面的值來傳遞?,F(xiàn)在還有一種方式可以傳遞,就是通過@PathVariable直接拿到URL中的參數(shù)。
例如:??localhost:8080/user/123/zhangsan/123456
這種方式和問號后面加上數(shù)據(jù)相對比有兩個(gè)優(yōu)點(diǎn):
1.對于搜索引擎來說,抓取關(guān)鍵字權(quán)重更高
2.URL更簡潔
@RequestMapping時(shí)需要加上相應(yīng)的屬性,在傳遞形參的時(shí)候使用@PathVarable來獲取,如果傳遞的參數(shù)和屬性名不同時(shí),也可以使用重命名。
如果RequestMapping和形參名稱不一樣就可以使用@PathVarable的重命名來表示。
- @PathVariable ->基礎(chǔ)URL里面的參數(shù)(?之前的參數(shù))
- @RequestParm->URL參數(shù)部分的參數(shù)(?之后的參數(shù))
上傳文件
使用@RequestPart來上傳文件。
之后使用Postman來模擬前端發(fā)來的圖片:
在新文件的地址中,可以看到新的文件已經(jīng)生成。但是有幾個(gè)問題,比如這樣重復(fù)一次,新文件會覆蓋舊文件。并且不能重命名文件。
最靠譜的保證文件名唯一的命名方法,是使用UUID。簡單說這個(gè)UUID是不會重復(fù)的。
UUID是Universally?Unique?Identifier的縮寫,它是在一定的范圍內(nèi)(從特定的名字空間到全球)唯一的機(jī)器生成的標(biāo)識符。
首先我們要解決文件格式的問題。之前我們使用的是png,如果原文件是jpg還好說,如果是gif等就會出錯(cuò)。所以我們需要獲取原生的文件名,把文件名的前部分使用UUID替換,文件名的后綴截取到再重命名。
這樣即使是上傳同樣的文件,也不會覆蓋之前的文件。
@RestController
public class UserController {@RequestMapping("/upload")public Object upload(@RequestPart("myimg") MultipartFile file){String fileName = UUID.randomUUID()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));File saveFile = new File("C:\\MyCode\\" + fileName);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;}
}
獲取Cookie
在之前的Servlet中,我們已經(jīng)使用過HttpServletResponse和HttpServletRequest來獲取cookie,我們現(xiàn)在使用更簡單的方法獲取:
通過@CookieValue注解來把獲取到的cookie得到,代碼中重命名的是java,所以當(dāng)我們自己偽造一個(gè)名字為java的cookie后就可以獲取到。
獲取Session
通過@SessionAttribute來方便的獲取到Session。
獲取Header
使用@RequestHeader獲取到Header。
請求定向和請求轉(zhuǎn)發(fā)
請求轉(zhuǎn)發(fā)和請求重定向有什么區(qū)別? | Java?? 面試突擊 (javacn.site)