目錄
學習Spring MVC
建立連接
@RequestMapping 注解介紹
@RequestMapping 使用
傳參介紹
傳遞單個參數(shù)
傳遞多個參數(shù)
傳遞對象
后端參數(shù)重命名(后端參數(shù)映射)@RequestParam
非必傳參數(shù)設置
傳遞數(shù)組
傳遞集合
傳遞JSON數(shù)據(jù)
獲取URL中參數(shù)@PathVariable
上傳文件@RequestPart
獲取Cookie/Session
響應
返回靜態(tài)頁面
返回數(shù)據(jù)@ResponseBody
返回HTML代碼片段
返回JSON
設置狀態(tài)碼
設置Content-Type
總結(jié)
學習Spring MVC
當我們在瀏覽器中輸入了url之后, Spring MVC項目就可以感知到用戶的請求, 并給予響應.
學習Spring MVC, 重點也就是學習如何通過瀏覽器和用戶程序進行交互.
主要分以下三個方面:
1.建立連接:? 將用戶(瀏覽器)和?java?程序連接起來,也就是訪問一個地址能夠調(diào)用到我們的Spring? ? ?程序。
2.請求:?用戶請求的時候會帶一些參數(shù),在程序中要想辦法獲取到參數(shù),所以請求這塊主要是獲取參? ? ?數(shù)的功能.
3.響應:?執(zhí)行了業(yè)務邏輯之后,要把程序執(zhí)行的結(jié)果返回給用戶,也就是響應.
建立連接
在Spring MVC中使用 @RequestMapping 來實現(xiàn)URL路由映射,也就是瀏覽器連接程序的作用
我們先來看看代碼怎么寫
創(chuàng)建一個UserController類,實現(xiàn)用戶通過瀏覽器和程序的交互,具體實現(xiàn)代碼如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping("sayHi")
public String hello() {
return "Hello SpringMVC!";
}
}
@RequestMapping 注解介紹
@RequestMapping?是 Spring Web?MVC 應用程序中最常被用到的注解之一, 它是用來注冊接口的路由映射的.
表示服務收到請求時, 路徑為 /sayHi 的請求就會調(diào)用 sayHi 這個方法的代碼.
路由映射: 當用戶訪問一個URL時,將用戶的請求對應到程序中某個類的某個方法的過程就叫路由映射.
既然 @RequestMapping? 已經(jīng)可以達到我們的?的了, 我們?yōu)槭裁催€要加 @RestController 呢? 我們把 @RestController 去掉, 再來訪問?次:
可以看到, 程序報了404, 找不到該頁?.
這就是 @RestController 起到的作用.
一個項目中,會有很多類,每個類可能有很多的方法, Spring 程序怎么知道要執(zhí)行哪個方法呢?
Spring 會對所有的類進行掃描,如果類加了注解 @RestController?, Spring 才會去看這個類里面的方法有沒有加 @RequestMapping? 這個注解, 當然他的作用不止這一點,我們先學會用.
@RequestMapping 使用
@RequestMapping 既可修飾類,也可以修飾方法,當修飾類和方法時,訪問的地址是類路徑+方
法路徑.
@RequestMapping?標識一個類: 設置映射請求的請求路徑的初始信息
@RequestMapping?標識一個方法: 設置映射請求請求路徑的具體信息
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("sayHi")
public String hello() {
return "Hello SpringMVC!";
}
}
訪問地址:http://127.0.0.1:8080/user/sayHi
注意:?@RequestMapping 的 URL?路徑最前面加不加 / (斜杠)都可以, Spring?程序啟動時,會進行判斷,如果前面沒有加 /?, Spring會拼接上一個?/?, 通常情況下, 我們加上/?? ??
@RequestMapping 的 URL?路徑也可以是多層路徑, 最終訪問時, 依然是 類路徑 + 方法路徑
@RequestMapping?既支持Get請求,又支持Post請求.同理,也支持其他的請求方式.
那如何指定GET或者POST類型呢?
我們可以顯示的指定@RequestMapping來接收POST的情況,如下所示:?
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping(value = "/getRequest",method= RequestMethod.POST)
public String sayHi(){
return "get request...";
}
}
傳參介紹
在測試傳參時, 我們需要借助一個后端開發(fā)常用的接口測試工具 Postman?, 這里就不對其進行過多的介紹了.
下載連接:?https://www.postman.com/downloads/
為了方便演示, 下面的傳參只放了其中核心部分的代碼, 如下圖紅色框內(nèi)部分:
傳遞單個參數(shù)
接收單個參數(shù),在Spring MVC中直接用方法中的參數(shù)就可以,比如以下代碼:
@RequestMapping("/r1")
public String r1(String name) {
return "接收到參數(shù), name= " + name;
}
使用 Postman 進行傳參測試:
也可使用瀏覽器發(fā)送請求并傳參:?http://127.0.0.1:8080/request/r1?name=zhangsan
可以看到,后端程序正確拿到了name參數(shù)的值.
Spring MVC會根據(jù)方法的參數(shù)名,找到對應的參數(shù),賦值給方法如果參數(shù)不一致, 是獲取不到參數(shù)的. 比如:
注意事項
使用基本類型來接收參數(shù)時,參數(shù)必須傳(boolean類型),否則會報500錯誤
類型不匹配時,會報400錯誤.
傳遞多個參數(shù)
如何接收多個參數(shù)呢?
和接收單個參數(shù)一樣,直接使用方法的參數(shù)接收即可.使用多個形參.
@RequestMapping("/r4")
public String r4(String name, Integer age) {
return "接收到參數(shù), name= " + name + ", age = " + age;
}
?使用 Postman 測試:
當有多個參數(shù)時,前后端進行參數(shù)匹配時,是以參數(shù)的名稱進行匹配的,因此參數(shù)的位置是不影響后端獲取參數(shù)的結(jié)果.
?
傳遞對象
如果參數(shù)比較多時,方法聲明就需要有很多形參. 并且后續(xù)每次新增一個參數(shù), 也需要修改方法聲明. 我們不妨把這些參數(shù)封裝為一個對象.
SpringMVC 也可以自動實現(xiàn)對象參數(shù)的賦值,比如Student對象:
class Student {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
傳遞對象代碼實現(xiàn):?
@RequestMapping("/r5")
public String r5(Student student) {
return "接收到參數(shù): " + student.toString();
}
??使用 Postman 測試:
Spring 會根據(jù)參數(shù)名稱自動綁定到對象的各個屬性上, 如果某個屬性未傳遞, 則賦值為 null (基本類型則賦值為默認初識值, 比如 int類型的屬性, 會被賦值為 0)
后端參數(shù)重命名(后端參數(shù)映射)@RequestParam
某些特殊的情況下,前端傳遞的參數(shù) key 和我們后端接收的 key 可以不一致,比如前端傳遞了一個 name?給后端,而后端是使用 username?字段來接收的,這樣就會出現(xiàn)參數(shù)接收不到的情況,如果出現(xiàn)這種情況,我們就可以使用 @RequestParam?來重命名前后端的參數(shù)值.
@RequestMapping("/r6")
public String r6(@RequestParam("name") String username, Integer age) {
return "接收到參數(shù), name= " + username + ", age = " + age;
}
??使用 Postman 測試:
可以看到, Spring 可以正確的把瀏覽器傳遞的參數(shù) time 綁定到了后端參數(shù) caretetime 參數(shù). 上
此時,如果使用 caretetime 進行參數(shù)傳遞呢?
使用 Postman 測試:
錯誤日志信息為:
控制臺打印日志顯示:請求參數(shù) 'username' 不存在
可以得出結(jié)論:
1.使用 @RequestParam 進行參數(shù)重命名時,請求參數(shù)只能和 @RequestParam 聲明的名稱一
? ?致,才能進行參數(shù)綁定和賦值.
2.使用 @RequestParam 進行參數(shù)重命名時,參數(shù)就變成了必傳參數(shù).
?
非必傳參數(shù)設置
如果我們的實際業(yè)務前端的參數(shù)是一個非必傳的參數(shù), 針對上述問題, 如何解決呢?
先來了解下參數(shù)必傳的原因,我們查看 @RequestParam 注解的實現(xiàn)細節(jié)就可以發(fā)現(xiàn)端倪,注解實現(xiàn)如下:
可以看到 required 的默認值為 true ,表示含義就是:該注解修飾的參數(shù)默認為必傳, 既然如此, 我們可以通過設置 @RequestParam 中的 required=false 來避免不傳遞時報錯.
具體實現(xiàn)如下:
@RequestMapping("/r7")
public String r7(@RequestParam(value = "name", required = false) String name) {
return "接收到參數(shù), name= " + name;
}
可以看到,添加 required=false 之后,time 前面也加了 key ,變成了 value = "time"
注解屬性賦值時,沒有指明 key 的話,默認為 value 屬性.
如果需要有多個屬性進行賦值時,需要寫上 key
傳遞數(shù)組
Spring MVC 可以自動綁定數(shù)組參數(shù)的賦值
后端實現(xiàn)代碼:
@RequestMapping("/r8")
public String r8(int[] array) {
return "接收到參數(shù)" + Arrays.toString(array);
}
?使用 Postman 測試:
傳遞集合
集合參數(shù):和數(shù)組類似,同一個請求參數(shù)名有為多個,且需要使用 @RequestParam 綁定參數(shù)關系
默認情況下,請求中參數(shù)名相同的多個值,是封裝到數(shù)組.如果要封裝到集合,要使用@RequestParam 綁定參數(shù)關系
請求方式和數(shù)組類似:
后端接收代碼:
@RequestMapping("/r9")
public String r9(@RequestParam List<String> list) {
return "接收到參數(shù)" + list;
}
?使用 Postman 測試:
傳遞JSON數(shù)據(jù)
JSON的語法:
- 數(shù)據(jù)在鍵值對 (Key/Value) 中
- 數(shù)據(jù)由逗號,分隔
- 對象用 { } 表示
- 數(shù)組用 [ ] 表示
- 值可以為對象, 也可以為數(shù)組,數(shù)組中可以包含多個對象
JSON的兩種結(jié)構(gòu)
1.對象: 大括號 { } 保存的對象是一個無序的鍵值對集合. 一個對象以左括號 { 開始,右括號 } 結(jié)束。每個"鍵"后跟一個冒號 : ,鍵值對使用逗號,分隔
2.數(shù)組: 中括號 [ ] 保存的數(shù)組是值(value) 的有序集合.一個數(shù)組以左中括號 [ 開始,右中括號 ] 結(jié)束,值之間使用逗號,分隔。
?
傳遞JSON對象
接收JSON對象,需要使用 @RequestBody 注解
RequestBody: 請求正文,意思是這個注解作用在請求正文的數(shù)據(jù)綁定,請求參數(shù)必須在寫在請求正文中.
后端實現(xiàn):
@RequestMapping("/r10")
public String r10(@RequestBody Student student) {
return "接收到參數(shù): " + student.toString();
}
使用 Postman 來發(fā)送 json 請求參數(shù):
可以看到,后端正確接收了
通過 Fiddler 觀察一下請求參數(shù):
如果去除掉 @RequestBody?,?后端會無法給 Student?對象賦值. 這里就不給大家演示了.?
?
獲取URL中參數(shù)@PathVariable
path variable: 路徑變量
和字面表達的意思一樣,這個注解主要作用在請求 URL 路徑上的數(shù)據(jù)綁定
默認傳遞參數(shù)寫在?URL?上,SpringMVC 就可以獲取到
后端實現(xiàn)代碼:
@RequestMapping("/article/{articleId}/{name}")
public String r12(@PathVariable("articleId") Integer articleId, @PathVariable("name") String name) {
return "接收到參數(shù), articleId:" + articleId + " , name: " + name;
}
?使用 Postman 測試:
可以看到,后端正確獲取到了URL中的參數(shù)
參數(shù)對應關系如下:
如果方法參數(shù)名稱和需要綁定的 URL 中的變量名稱一致時,可以簡寫,不用給 @PathVariable 的屬性賦值,如上述例子中的 articleId?變量
如果方法參數(shù)名稱和需要綁定的 URL 中的變量名稱不一致時, 需要 @PathVariable 的屬性 value賦值,如上述例子中的 articleName 變量.
上傳文件@RequestPart
后端實現(xiàn)代碼:
@RequestMapping("/r13")
public String r13(@RequestPart("file") MultipartFile imgFile) {
String originalFilename = imgFile.getOriginalFilename();
return "接收到文件, 文件名: " + originalFilename;
}
使用 Postman 測試:
獲取Cookie/Session
這部分的內(nèi)容比較多, 詳細介紹在下一篇文章.
響應
在我們前面的代碼例子中,都已經(jīng)設置了響應數(shù)據(jù), Http響應結(jié)果可以是數(shù)據(jù),也可以是靜態(tài)頁面,也可以針對響應設置狀態(tài)碼, Header 信息等.
?
返回靜態(tài)頁面
創(chuàng)建前端頁面index.html(注意路徑)
后端代碼:
運行結(jié)果:
結(jié)果卻發(fā)現(xiàn),頁面未正確返回, http 響應把 " / index. html" 當做了 http 響應正文的數(shù)據(jù)
那 Spring MVC 如何才能識別出來 index.html 是一個靜態(tài)頁面,并進行返回呢?
我們需要把 @RestController 改為@Controller
正確代碼如下:
?發(fā)現(xiàn)頁面正確展示了:
@RestController和@Controller有著什么樣的關聯(lián)和區(qū)別呢?
咱們前面講了MVC模式,后端會返回視圖,這是早期時的概念
隨著互聯(lián)網(wǎng)的發(fā)展,目前項目開發(fā)流行"前后端分離"模式, Java主要是用來做后端項目的開發(fā),所以也就不再處理前端相關的內(nèi)容了
MVC 的概念也逐漸發(fā)生了變化,View 不再返回視圖,而是返回顯示視圖時需要的數(shù)據(jù).
所以前面使用的 @RestController 其實是返回的數(shù)據(jù).
@RestController = @Controller + @ResponseBody
@Controller: 定義一個控制器, Spring 框架啟動時加載,把這個對象交給 Spring 管理.
@ResponseBody: 定義返回的數(shù)據(jù)格式為非視圖,返回一個 text/html 信息
如果想返回視圖的話, 只需要把 @ResponseBody 去掉就可以了,也就是 @Controller
返回數(shù)據(jù)@ResponseBody
我們上面講到, @ResponseBody 表示返回數(shù)據(jù).
@ResponseBody 既是類注解,又是方法注解
如果作用在類.上,表示該類的所有方法,返回的都是數(shù)據(jù),如果作用在方法上,表示該方法返回的是數(shù)據(jù).
也就是說: 在類上添加 @ResponseBody 就相當于在所有的方法上添加了 @ResponseBody 注解.
同樣,如果類.上有@RestController?注解時:表示所有的方法上添加了 @ResponseBody 注解,也就是當前類下所有的方法返回值做為響應數(shù)據(jù)
如果一個類的方法里,既有返回數(shù)據(jù)的,又有返回頁面的,就把 @ResponseBody 注解添加到對應的方法上即可.
返回HTML代碼片段
后端返回數(shù)據(jù)時,如果數(shù)據(jù)中有HTML代碼,也會被瀏覽器解析
@ResponseBody
@RequestMapping("/indexData2")
public String indexData2() {
return "<h1>我是中國人</h1>";
}
?運行結(jié)果:
通過Fiddler觀察響應結(jié)果,Content-Type為text/html
響應中的 Content-Type 常見取值有以下幾種:
● text/html|: body數(shù)據(jù)格式是 HTML
● text/css : body數(shù)據(jù)格式是 CSS
● application/j avascript : body 數(shù)據(jù)格式是 JavaScript
● application/json : body 數(shù)據(jù)格式是 JSON
返回JSON
Spring MVC 也可以返回 JSON
后端方法返回結(jié)果為對象
@ResponseBody
@RequestMapping("/getMap")
public HashMap<String,String> getMap() {
HashMap<String,String> map = new HashMap<>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");
map.put("k4","v4");
return map;
}
運行結(jié)果:?
設置狀態(tài)碼
Spring MVC 會根據(jù)我們方法的返回結(jié)果自動設置響應狀態(tài)碼,程序員也可以手動指定狀態(tài)碼通過Spring MVC 內(nèi)置對象 HttpServletResponse 提供的方法來進行設置
@ResponseBody
@RequestMapping("/setStat")
public String setStatus(HttpServletResponse response) {
response.setStatus(500);
return "設置狀態(tài)碼";
}
狀態(tài)碼不會影響頁面展示, 通過 FIddler 來觀察設置的結(jié)果:?
設置Content-Type
我們通過設置 produces 屬性的值,設置響應的報頭Content-Type
@RequestMapping(value = "/returnJson2",produces = "application/json")
@ResponseBody
public String returnJson2() {
return "{\"success\":true}";
}
?
總結(jié)
文章來源:http://www.zghlxwxcb.cn/news/detail-850807.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-850807.html
到了這里,關于【JavaEE進階】SpringMVC中的常用注解和用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!