觀前提示:本篇博客演示使用的 IDEA 版本為2021.3.3版本,使用的是Java8(又名jdk1.8)
電腦使用的操作系統(tǒng)版本為 Windows 10
?
目錄
?前言
Spring Boot
Spring MVC
1. MVC
1.1 MVC 和 Spring MVC 之間的關(guān)系
2. 創(chuàng)建 Spring MVC 項(xiàng)目
創(chuàng)建一個(gè) SpringMVC 項(xiàng)目
1. new project
2. 選擇 SpringBoot 項(xiàng)目, 選擇合適的 jdk 版本, 設(shè)置創(chuàng)建項(xiàng)目源
3. 項(xiàng)目的參數(shù)
4. 選擇Spring Boot 版本, 添加項(xiàng)目依賴
5. 設(shè)置項(xiàng)目名稱和保存路徑
6. 確保 idea 正常加載Spring Boot 項(xiàng)目
7. 刪除無用文件(可刪可不刪)
8. Spring Boot 目錄說明
3. SpringMVC 中的常用注解和用法
3.1 實(shí)現(xiàn)連接
@RequestMapping 支持 GET 和 POST
@GetMapping 只支持 Get 請(qǐng)求
@PostMapping?只支持 Post 請(qǐng)求
3.2 獲取參數(shù)
1. 獲取單個(gè)參數(shù)
獲取多個(gè)參數(shù)
2. 獲取對(duì)象
3. 獲取 JSON 對(duì)象
4. 從基礎(chǔ) URL 中獲取參數(shù)(不是從 URL 的參數(shù)部分獲取參數(shù))
5. 獲取上傳文件
6. 獲取 Cookie
7. 獲取 Header
8. 獲取 Session
3.3 返回?cái)?shù)據(jù)?
1. 返回靜態(tài)頁(yè)面
2. 跳轉(zhuǎn)地址: 請(qǐng)求轉(zhuǎn)發(fā)(forward)和請(qǐng)求重定向(redirect)
forward 和 redirect 具體區(qū)別如下:
前言
前面兩篇博客介紹了 Spring 的 Bean 的作用域和生命周期, 本篇博客將開始介紹 Spring MVC 的常用注解以及用法
在認(rèn)識(shí) Spring MVC之前,先認(rèn)識(shí)一下 Spring Boot
Spring Boot
Spring 的誕?是為了簡(jiǎn)化 Java 程序的開發(fā)的,? Spring Boot 的誕?是為了簡(jiǎn)化 Spring 程序開發(fā)的。它是為了快速開發(fā) Spring 框架?誕?的。
Spring MVC
Spring Web MVC 是基于 Servlet API 構(gòu)建的原始 Web 框架,從?開始就包含在 Spring 框架中。它的正式名稱“Spring Web MVC”來?其源模塊的名稱
(Spring-webmvc),但它通常被稱為“Spring MVC"。
從上述定義我們可以得出兩個(gè)關(guān)鍵信息:
1. Spring MVC 是?個(gè) Web 框架。
2. Spring MVC 是基于 Servlet API 構(gòu)建的。
然?要真正的理解什么是 Spring MVC?我們?先要搞清楚什么是 MVC?
1. MVC
MVC 是 Model View Controller 的縮寫,它是軟件?程中的?種軟件架構(gòu)模式,它把軟件系統(tǒng)分為模型、視圖和控制器三個(gè)基本部分。
Model(模型)是應(yīng)?程序中?于處理應(yīng)?程序數(shù)據(jù)邏輯的部分。通常模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)。
View(視圖)是應(yīng)?程序中處理數(shù)據(jù)顯示的部分。通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
Controller(控制器)是應(yīng)?程序中處理?戶交互的部分。通??刂破髫?fù)責(zé)從視圖讀取數(shù)據(jù),控制?戶輸?,并向模型發(fā)送數(shù)據(jù)。
1.1 MVC 和 Spring MVC 之間的關(guān)系
MVC 是?種思想,? Spring MVC 是對(duì) MVC 思想的具體實(shí)現(xiàn)。
總結(jié)來說,Spring MVC 是?個(gè)實(shí)現(xiàn)了 MVC 模式,并繼承了 Servlet API 的 Web 框架。既然是 Web框架,那么當(dāng)?戶在瀏覽器中輸?了 url 之后,我們的
Spring MVC 項(xiàng)?就可以感知到?戶的請(qǐng)求。
2. 創(chuàng)建 Spring MVC 項(xiàng)目
現(xiàn)在絕?部分的 Java 項(xiàng)?都是基于 Spring(或 Spring Boot)的,? Spring 的核?就是 SpringMVC。也就是說 Spring MVC 是 Spring 框架的核?模塊,
? Spring Boot 是 Spring 的腳?架,因此我們可以推斷出,現(xiàn)在市?上絕?部分的 Java 項(xiàng)?約等于 Spring MVC 項(xiàng)?。
在創(chuàng)建 Spring Boot 項(xiàng)?時(shí),我們勾選的 Spring Web 框架其實(shí)就是 Spring MVC 框架,如下所示:
創(chuàng)建一個(gè) SpringMVC 項(xiàng)目
1. new project
2. 選擇 SpringBoot 項(xiàng)目, 選擇合適的 jdk 版本, 設(shè)置創(chuàng)建項(xiàng)目源
3. 項(xiàng)目的參數(shù)
?我選擇 JDK 8 是因?yàn)槲已b的就是 JDK 8?
4. 選擇Spring Boot 版本, 添加項(xiàng)目依賴
?
在勾選的時(shí)候,可以注意看, Spring Web 下面有 Spring MVC, 這就是使用 Spring Boot 創(chuàng)建 Spring MVC
5. 設(shè)置項(xiàng)目名稱和保存路徑
6. 確保 idea 正常加載Spring Boot 項(xiàng)目
啟動(dòng)項(xiàng)目, 沒有出現(xiàn) debug, 并且控制臺(tái)打印了啟動(dòng)所用的時(shí)間, 說明 Spring Boot項(xiàng)目已經(jīng)創(chuàng)建好了?
7. 刪除無用文件(可刪可不刪)
這里面存儲(chǔ)的是一些對(duì)我們幫助不大的文件
其中? .mvn目錄 和 mvnw 文件以及 mvnw.cmd 文件,?是一個(gè)用來幫助在沒有安裝 Maven 的情況下運(yùn)行 Maven 項(xiàng)目的腳本。
help.md
文件是 Spring Boot 項(xiàng)目的幫助文檔,它包含了當(dāng)前項(xiàng)目的基本信息、可用命令以及如何使用這些命令等重要內(nèi)容。
是否刪除看你個(gè)人選擇,不做強(qiáng)制要求
是否刪除看你個(gè)人選擇,不做強(qiáng)制要求
是否刪除看你個(gè)人選擇,不做強(qiáng)制要求
8. Spring Boot 目錄說明
3. SpringMVC 中的常用注解和用法
3.1 實(shí)現(xiàn)連接
@RequestMapping 是 Spring Web 應(yīng)?程序中最常被?到的注解之?,它是?來注冊(cè)接?的路由映射的。
先建立 com.example.demo.Controller, 在里面建立 UserController類
package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller //讓 Spring 框架啟動(dòng)時(shí),加載
@ResponseBody //返回非頁(yè)面數(shù)據(jù)
@RequestMapping("/user") // 路由器規(guī)則注冊(cè),此時(shí)是一級(jí)路由
public class UserController {
@RequestMapping("/hello") // 路由器規(guī)則注冊(cè),此時(shí)是二級(jí)路由,可以一直往下套,無限層
public String Hello() {
return "<h1>Hello,World<h1>";
}
}
運(yùn)行程序,訪問?http://localhost:8080/user/hello
此時(shí)完成了程序員的經(jīng)典操作輸出 Hello World
對(duì)于 @Controller 和 @ResponseBody 可以使用 @RestController 取代,因?yàn)辄c(diǎn)開 @RestController 的源碼會(huì)發(fā)現(xiàn),他有這兩位的注解
@RequestMapping 支持 GET 和 POST
打開 Postman, 進(jìn)行測(cè)試即可知道答案
@GetMapping 只支持 Get 請(qǐng)求
?給 get 發(fā)送 POST 請(qǐng)求就會(huì)報(bào)錯(cuò)405?
@PostMapping?只支持 Post 請(qǐng)求
?給 POST 發(fā)送 Get?請(qǐng)求就會(huì)報(bào)錯(cuò)405?
上面三個(gè)的測(cè)試代碼
package com.example.demo.Controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user") // 路由器規(guī)則注冊(cè),此時(shí)是一級(jí)路由
public class UserController {
@RequestMapping("/hello") // 路由器規(guī)則注冊(cè),此時(shí)是二級(jí)路由,可以一直往下套,無限層
public String Hello() {
return "<h1>Hello,World<h1>";
}
@PostMapping("/post")
public String post() {
return "post";
}
@GetMapping("/get")
public String get() {
return "get";
}
}
3.2 獲取參數(shù)
1. 獲取單個(gè)參數(shù)
package com.example.demo.Controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping
public String name(String name){
return "hi " + name;
}
}
注意: url 里面的 name 必須和 idea 里面?zhèn)鲄⒌?name 保持一致
獲取多個(gè)參數(shù)
@RequestMapping("/name")
public String name(String name, String password) {
return "name: " + name + " " + "password: " + password;
}
在不輸入name以及 password的情況下,默認(rèn)是 null?
2. 獲取對(duì)象
獲取對(duì)象之前需要先創(chuàng)建一個(gè)對(duì)象出來
新建?com.example.demo.enity ,再建一個(gè) Userinfo 類
package com.example.demo.enity;
import lombok.Data;
@Data
public class Userinfo {
private int id;
private String name;
private String password;
private int age;
}
其中, @Data 是 lombok 他會(huì)幫我處理 get,set
@RequestMapping("/reg")
public Object reg(Userinfo userinfo){
System.out.println(userinfo);
return userinfo;
}
?
注意: 框架會(huì)實(shí)現(xiàn)自動(dòng)的參數(shù)映射?
3. 獲取 JSON 對(duì)象
@RequestMapping("/reg2")
public Object reg2(@RequestBody Userinfo userinfo){
System.out.println(userinfo);
return userinfo;
}
繼續(xù)使用 Postman?
4. 從基礎(chǔ) URL 中獲取參數(shù)(不是從 URL 的參數(shù)部分獲取參數(shù))
@PathVariable: 基礎(chǔ) URL 里面的參數(shù)(? 之前的參數(shù))
@RequestParm: URL 參數(shù)部分的參數(shù)(? 之后的參數(shù))
package com.example.demo.enity;
import lombok.Data;
@Data
public class Userinfo {
private int id;
private String name;
// private String password;
private String pwd;
private int age;
}
將 password 修改成 pwd
@RequestMapping("/reg3/{name}/{pwd}")
public Object reg3(@PathVariable String name, @PathVariable(required = false, name = "pwd") String password) {
return "name=" + name + " " + "password=" + password;
}
上述代碼中,我們使用 @RequestMapping
注解將請(qǐng)求映射到 /reg3/{name}/{pwd}
路徑上,并使用 @PathVariable
注解綁定 URL 路徑變量到方法參數(shù)上。
具體來說,@PathVariable String name
表示將 URL 路徑中的 {name}
變量映射到方法參數(shù) name
上;而 @PathVariable(required = false, name = "pwd") String password
表示將 URL 路徑中的 {pwd}
變量映射到方法參數(shù) password
上。其中,required=false
表示 {pwd}
變量是可選的,如果請(qǐng)求 URL 中不包含該變量,則 password
參數(shù)的值為 null
;name="pwd"
表示將 {pwd}
變量與 password
方法參數(shù)名稱進(jìn)行映射,即使它們名稱不匹配。
在方法體內(nèi)部,我們使用字符串拼接的方式將 name
和 password
變量的值組合成一個(gè)響應(yīng)字符串,并返回給客戶端。
小結(jié): 該方法的作用是根據(jù)傳入的用戶名和密碼,在服務(wù)器端生成響應(yīng)字符串并返回給客戶端。如果請(qǐng)求 URL 中不包含密碼變量,則返回的字符串中不包含密碼信息。
5. 獲取上傳文件
@RequestMapping("/myupload")
public Object upload(@RequestPart("hero") MultipartFile file) {
File saveFile = new File("D:\\blogTest\\hero.jpg");
try {
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
使用 Postman 進(jìn)行模擬
注意: 你要上傳的圖片和你要保存的圖片不能再一個(gè)文件夾里面,因?yàn)榭床怀鰜韰^(qū)別,看不出來是因?yàn)橛袀€(gè)缺陷
上面這段代碼有個(gè)缺陷,就是你新上傳的圖片會(huì)覆蓋上一張圖片,這里面始終只有一張圖片
@RequestMapping("/myupload")
public Object upload(@RequestPart("hero") MultipartFile file) {
String fileName = UUID.randomUUID() + // 文件名
file.getOriginalFilename().substring( // 文件后綴
file.getOriginalFilename().lastIndexOf("."));
File saveFile = new File("D:\\blogTest\\" + fileName);
try {
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
還是使用 Postman 進(jìn)行測(cè)試?
現(xiàn)在就不會(huì)覆蓋上一張圖片了
6. 獲取 Cookie
獲取單一的 cooking
@RequestMapping("/cookie")
public Object cookie(@CookieValue(value = "java",required = false)String java){
return java;
}
輸入 URL 進(jìn)行訪問
發(fā)現(xiàn)一片空白,不要慌
F12 打開開發(fā)者工具: 點(diǎn)擊應(yīng)用, 點(diǎn)擊 Cookie, 點(diǎn)擊他下面的
然后開始偽造 Cookie,必須名稱是 java, 因?yàn)?idea 寫的就是 java. 后面的值看你自己
刷新就得到了結(jié)果
7. 獲取 Header
@RequestMapping("/header")
public Object getHeader(@RequestHeader("Host") String ht) {
return "Host ->" + ht;
}
標(biāo)頭里面的東西全都可以獲取?
8. 獲取 Session
//存儲(chǔ) Session, 只有存了才能讀取
//先調(diào)用 set 在調(diào)用 get
private static final String SESSION_KEY = "USERINFO_SESSION_KEY";
@RequestMapping("/setsession")
public void setSess(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute(SESSION_KEY, "zhangsan");
}
@RequestMapping("/getsession")
public Object getSession(@SessionAttribute(SESSION_KEY) String name) {
return "session->" + name;
}
3.3 返回?cái)?shù)據(jù)?
1. 返回靜態(tài)頁(yè)面
先弄一個(gè)前端返回
在 resource 下面的 static 里面建一個(gè) index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>index.html</title>
</head>
<body>
<h1>hello index</h1>
</body>
</html>
在?com.example.demo.Controller 新建一個(gè) TestController
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/index")
public Object getIndex(){
return "/index.html";
}
}
?
?
2. 跳轉(zhuǎn)地址: 請(qǐng)求轉(zhuǎn)發(fā)(forward)和請(qǐng)求重定向(redirect)
請(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";
}
?
?
請(qǐng)求重定向:百度
@RequestMapping("/redirect2")
public void redirect2(HttpServletResponse response) throws IOException {
response.sendRedirect("https://www.baidu.com");
}
使用 Fiddler 抓包演示
先輸入網(wǎng)址,但是不要按下回車,打開 Fiddler 在按下回車
?
通過抓包軟件可以看到, 原本的localhost:8080/test/redirect2 狀態(tài)碼是302. 請(qǐng)求重定向成功
forward 和 redirect 具體區(qū)別如下:
1. 請(qǐng)求重定向(redirect)將請(qǐng)求重新定位到資源;請(qǐng)求轉(zhuǎn)發(fā)(forward)服務(wù)器端轉(zhuǎn)發(fā)。
2. 請(qǐng)求重定向地址發(fā)?變化,請(qǐng)求轉(zhuǎn)發(fā)地址不發(fā)生變化。
3. 請(qǐng)求重定向與直接訪問新地址效果?直,不存在原來的外部資源不能訪問;請(qǐng)求轉(zhuǎn)發(fā)服務(wù)器端轉(zhuǎn)發(fā)有可能造成原外部資源不能訪問。
本文完,感謝觀看,不足之處請(qǐng)?jiān)谠u(píng)論區(qū)指出 !文章來源:http://www.zghlxwxcb.cn/news/detail-489602.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-489602.html
到了這里,關(guān)于SpringMVC 中的常用注解和用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!