這個專欄給大家介紹一下 Java 家族的核心產(chǎn)品 - SSM 框架
JavaEE 進階專欄Java 語言能走到現(xiàn)在 , 仍然屹立不衰的原因 , 有一部分就是因為 SSM 框架的存在
接下來 , 博主會帶大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相關知識點
并且?guī)ьI大家進行環(huán)境的配置 , 讓大家真正用好框架、學懂框架
來上一篇文章復習一下吧
點擊即可跳轉(zhuǎn)到前置文章
一 . Spring MVC
1.1 什么是 Spring MVC?
我們先來看官方對于 Spring MVC 的解釋
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”.
Spring Web MVC 是基于 Servlet API 構(gòu)建的原始 Web 框架,從一開始就包含在 Spring 框架中。Spring Web MVC 的正式名稱“Spring Web MVC” , 來自于其源代碼模塊 (Spring -webmvc) 的名稱,但它更常用的名稱是“Spring MVC”。
剖析一下 :
Spring MVC 全稱 Spring Web MVC , 那么 Spring Web MVC 又被簡稱為 Spring MVC 或 Spring Web .
它是一個原始的基于 Servlet API 的 web 框架
那么我們之前就提出了一個問題 : Spring / Spring Boot / Spring MVC 有什么區(qū)別 ?
Spring : 全稱是 Spring Framework , 是一個包含了眾多工具 / 方法的 IoC 容器 , 它里面包含了很多模塊 , 它的最核心功能就是 IoC 容器 , 使用 IoC 容器可以降低代碼的耦合性
Spring Boot : 在創(chuàng)建之初的目的就是為了服務 Spring , 為了快速開發(fā) Spring 框架的 , 其本質(zhì)就是 Spring
Spring MVC : 是一個 Web 框架 , 在整個 Spring Framework 里面算是一個模塊
目前為止 , 我們已經(jīng)總結(jié)出了兩個非常關鍵的信息 :
- Spring MVC 是一個 Web 框架
- Spring MVC 是基于 Servlet API 構(gòu)建的
那么這個 MVC 怎樣理解呢 ?
MVC 定義
MVC 全稱是 Model View Controller , 翻譯過來就是 模型視圖控制器 , 它是軟件工程中的?種軟件架構(gòu)模式(設計思想),它把軟件系統(tǒng)分為模型、視圖和控制器三個基本部分
但是既然 Spring MVC 是前后端不分離的模式 , 我們還有必要學習嗎 ?
當然有必要啊 , 我們的 Spring MVC 也是會慢慢發(fā)展的 , 逐步的就把 View 模塊淡化了(現(xiàn)在都是采用的前后端分離模式)
Spring MVC 與 MVC 有什么關系呢 ?
MVC 是?種思想,而 Spring MVC 是對 MVC 思想的具體實現(xiàn)。
這就跟我們之前介紹的 IoC 與 DI 差不多
1.2 Spring MVC 學習內(nèi)容
- 連接的功能 : 將用戶 (瀏覽器) 和 Java 程序連接起來,也就是訪問?個地址能夠調(diào)用到我們的 Spring 程序
- 獲取參數(shù)的功能 : 用戶訪問的時候會帶?些參數(shù),在程序中要想辦法獲取到參數(shù)
- 輸出數(shù)據(jù)的功能 : 執(zhí)行了業(yè)務邏輯之后,要把程序執(zhí)行的結(jié)果返回給用戶
二 . Spring MVC 的創(chuàng)建和連接
2.1 創(chuàng)建 Spring MVC
其實我們創(chuàng)建 Spring Boot 的時候 , 就已經(jīng)創(chuàng)建了 Spring MVC 了
接下來 , 帶大家再走一遍流程
[外鏈圖片轉(zhuǎn)存中…(img-N1HXoG73-1691714953614)]
先在 Developer Tools 里面添加工具
然后在 Web 里面添加工具
[外鏈圖片轉(zhuǎn)存中…(img-4cZC0kUO-1691714953615)]
我們仔細看一下 IDEA 對于 Spring Web 的介紹
[外鏈圖片轉(zhuǎn)存中…(img-OQD36Siu-1691714953615)]
然后點擊 Next
接下來打開 Maven 窗口
方法一 :
[外鏈圖片轉(zhuǎn)存中…(img-8rYltOKb-1691714953616)]
[外鏈圖片轉(zhuǎn)存中…(img-nYmshUD2-1691714953616)]
方法二 :
在 pom.xml 里面右鍵 , 點擊 Add as Maven Project
[外鏈圖片轉(zhuǎn)存中…(img-FztgXH6Y-1691714953616)]
然后把無關文件刪掉即可
2.2 連接 HTTP 請求
我們需要使用一個注解 : @RequestMapping(“/xxx”) , 這個注解代表的就是我們的路由 , 通過括號中的地址我們可以訪問到特定的頁面
接下來我們創(chuàng)建一個 controller 包 , 里面創(chuàng)建 WebController 類
package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/web")
public class WebController {
@RequestMapping("/hi")
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
接下來運行一下 , 看一下效果
訪問不到 ? 我加了路由了啊 , 這怎么回事 ?
這是因為我們雖然加了路由 , 但是對應的類還沒有加載 (就是你雖然加這個功能了 , 但是沒有人調(diào)用) , 所以如果我們想要在 Spring Web 項目上啟動的時候 , 就需要加類注解把映射的路徑加載起來(添加 @Controller 注解 )
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/web")
public class WebController {
@RequestMapping("/hi")
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
不是吧 阿sir , 怎么還不好使 ?
其實這是因為我們最早的 Spring MVC 是將視圖返回給用戶 , 所以我們的 Spring MVC 會以為我們返回的是一個視圖 , 他就會找我們的視圖去了 , 但是我們只是返回一句話 , 并沒有返回視圖 , 所以沒找到 , 就會報了 404 , 他的解決辦法就是 : 加注解 @ResponseBody , 這個注解的作用意思就是告訴 Spring MVC 我們返回的不是一個視圖
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 啟動的時候加載并注冊
@ResponseBody // 告訴 Spring MVC 當前類返回的是非靜態(tài)頁面(非視圖)
@RequestMapping("/web") // 使用"/web"可以訪問到當前類
public class WebController {
@RequestMapping("/hi") //使用"/web/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
[外鏈圖片轉(zhuǎn)存中…(img-IF2kWYnB-1691714953617)]
我們的 @ResponseBody @RequestMapping 不光能修飾類 , 還可以修飾方法
我們可以把 @ResponseBody 移到方法上面
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 啟動的時候加載并注冊
@RequestMapping("/web") // 使用"/web"可以訪問到當前類
public class WebController {
@ResponseBody // 告訴 Spring MVC 當前方法返回的是非靜態(tài)頁面
@RequestMapping("/hi") //使用"/web/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
重新運行
也是可以成功運行的
我們的 @ResponseBody 也是可以不寫的 , 直接返回視圖 .
比如我們新建一個前端界面
[外鏈圖片轉(zhuǎn)存中…(img-bmS6Osqi-1691714953617)]
然后把這段代碼輸入進去
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>我是 index.html 頁面</h1>
</body>
</html>
接下來回到 WebController.java
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 啟動的時候加載并注冊
@RequestMapping("/web") // 使用"/web"可以訪問到當前類
public class WebController {
//@ResponseBody // 不加 @ResponseBody 默認返回視圖
@RequestMapping("/hi") //使用"/web/hi"可以訪問到當前方法
public Object sayHi() {
return "/index.html";
}
}
那么有的同學覺得寫 @ResponseBody @Controller 很麻煩 , 那么其實可以寫成一個注解 : @RestController
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller // 是一個控制類,要在 Spring 啟動的時候加載并注冊
@RestController // @RestController = @ResponseBody + @Controller
public class WebController {
@RequestMapping("/hi") //使用"/web/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
這樣的話我們地址欄就直接輸入方法的路由即可
目前為止 , 我們想要使用 Spring MVC , 我們需要加三個注解
- @Controller
- @RequestMapping
- @ResponseBody
其中 , 1 和 3 可以合并成 @RestController
[外鏈圖片轉(zhuǎn)存中…(img-IqKwITBn-1691714953617)]
@Controller 注解可以換成其他五大類注解嗎
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
@ResponseBody
public class WebController {
@RequestMapping("/hi") //使用"/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
目前程序是沒問題的
那么我們把 @Controller 換成其他注解呢 ?
package com.example.demo.controller;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Component
@ResponseBody
public class WebController {
@RequestMapping("/hi") //使用"/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
運行一下 , 看一下效果
艾瑪 , 報錯了
那試一下 @Service 呢 ?
package com.example.demo.controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Service
@ResponseBody
public class WebController {
@RequestMapping("/hi") //使用"/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
還是不行 , 那么基本就是只能使用 @Controller 了
那這是因為什么呢 ? 不知道大家是否還記得這張圖 ?
[外鏈圖片轉(zhuǎn)存中…(img-4XsdqcyQ-1691714953618)]
前端的數(shù)據(jù)是先傳給 @Controller 的 , 只有 @Controller 才能實現(xiàn)將類里面的方法和類進行數(shù)據(jù)注入
@RequestMapping 注解 Get 請求和 Post 請求都可以訪問嗎?
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
@ResponseBody
public class WebController {
@RequestMapping("/hi") //使用"/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
Get 請求一定是可以的 , 因為我們在地址欄輸入地址 , 就產(chǎn)生了 Get 請求 , 我們也可以抓個包看看
那么我們測試一下 Post 請求可不可以 , 那么怎么構(gòu)造請求呢 , 這就需要用到 Postman 了
也打印出來了內(nèi)容 , 這就說明 Post 請求也是沒問題的
@RequestMapping(value = “/hi”,method = RequestMethod.POST) 方式
這個注解的意思是該 方法/類 只支持使用 POST 方法訪問
那假如你的書背產(chǎn)品經(jīng)理提出了要求 : 我們的產(chǎn)品只支持 Post 請求 , 不支持 Get 請求 , 你該怎樣做呢 ?
我們就可以在 @RequestMapping 后面加參數(shù)
@RequestMapping(value = "/hi",method = RequestMethod.POST)
我們來試一下
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
public class WebController {
@RequestMapping(value = "/hi",method = RequestMethod.POST) //使用"/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
改成 Get 訪問呢 ?
也可以在瀏覽器地址欄來測試
所以這種寫法只支持 POST 請求 , 不支持 GET 請求
但是我們還有更好的寫法 , 來康康吧
@GetMapping 和 @PostMapping
我們測試一下 @PostMapping , 使用這個注解就可以實現(xiàn)只允許 POST 請求
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
public class WebController {
@PostMapping("/hi") //使用"/hi"可以訪問到當前方法
public Object sayHi() {
return "Hi,Spring MVC.";
}
}
在 Postman 里面發(fā)送 post 請求 , 能正常顯示結(jié)果
發(fā)送 Get 請求就會報錯
@GetMapping 同理
到目前為止 , 我們 Spring MVC 的連接可以用三個注解文章來源:http://www.zghlxwxcb.cn/news/detail-642587.html
- @RequestMapping : 支持所有類型的接口訪問(包含 Get/Post…)
- @PostMapping : 只支持 Post 請求
- @GetMapping : 只支持 Get 請求
注意 : 以上注解需要配合 @Controller 或者 @RestController 一起使用文章來源地址http://www.zghlxwxcb.cn/news/detail-642587.html
到了這里,關于Java EE 突擊 10 - Spring MVC 程序開發(fā) (1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!