SpringMVC全稱Spring Web MVC,Spring Web MVC又簡稱Spring Web或Spring MVC,它是一個基于Servlet API的框架
一個經(jīng)典問題:Spring/SpringBoot/SpringMVC的區(qū)別
1.1 MVC定義答:我們說的Spring就是Spring farmework ,Spring farmework它里面包含很多模塊,它的最早核心功能就是IOC容器,能夠去除代碼的一個耦合性,SpringBoot在創(chuàng)建之初的目的就是為Spring服務(wù)的,就是為了快速開發(fā)Spring框架嘛,相比于Spring來說,SpringBoot有很多優(yōu)點,比如說它內(nèi)置了tomcat容器,可以更容易地添加依賴,發(fā)布也很簡單,可以擺脫xml文件,它將Spring的功能升上了一個層次,所以后面大家都很喜歡SpringBoot了,都用SpringBoot了,后面很多插件也都是專門為SpringBoot去做的,但是SpringBoot底層還是基于Spring實現(xiàn)的;SpringMVC全稱Spring Web MVC,Spring Web MVC又簡稱Spring Web或Spring MVC,它是一個基于Servlet API的框架,SpringMVC是隨著Spring的誕生而誕生的,它最早是Spring里的一個外部模塊而已,就是說Spring它有很多很多模塊,其中就有一個是基于http協(xié)議,那些request,response這些http請求,這個就是SpringMVC
MVC 是 Model View Controller 的縮寫,它是軟件?程中的?種軟件架構(gòu)模式,它把軟件系統(tǒng)分 為模型、視圖和控制器三個基本部分。
Model(模型)是應(yīng)?程序中?于處理應(yīng)?程序數(shù)據(jù)邏輯的部分。通常模型對象負責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù)。
View(視圖)是應(yīng)?程序中處理數(shù)據(jù)顯示的部分。通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
Controller(控制器)是應(yīng)?程序中處理?戶交互的部分。通??刂破髫撠?zé)從視圖讀取數(shù)據(jù), 控制?戶輸?,并向模型發(fā)送數(shù)據(jù)。
最早SpringMvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面; 現(xiàn)在前后端分離了,要返回數(shù)據(jù)了,現(xiàn)在要加注解才能返回數(shù)據(jù),
MVC和SpringMVC的聯(lián)系
MVC是一種思想,SpringMVC是對MVC思想的具體實現(xiàn),總結(jié)來說SpringMVC是一個實現(xiàn)了MVC模式并繼承了Servlet API的web框架。
1.2 創(chuàng)建SpringMVC項目在創(chuàng)建 Spring Boot 項?時,我們勾選的 Spring Web 框架其實就是 Spring MVC 框架,如下圖所 示:
學(xué)習(xí) Spring MVC 是因為它是?切項?的基礎(chǔ),我們以后創(chuàng)建的所有 Spring、Spring Boot 項?基本都是基于 Spring MVC 的。
3.SpringMVC的主要三個功能連接的功能:將?戶(瀏覽器)和 Java 程序連接起來,也就是訪問?個地址能夠調(diào)?到我們的 Spring 程序。
獲取參數(shù)的功能:?戶訪問的時候會帶?些參數(shù),在程序中要想辦法獲取到參數(shù)。
輸出數(shù)據(jù)的功能:執(zhí)?了業(yè)務(wù)邏輯之后,要把程序執(zhí)?的結(jié)果返回給?戶。
對于 Spring MVC 來說,掌握了以上 3 個功能就相當(dāng)于掌握了 Spring MVC。
3.1SpringMVC的連接功能在 Spring MVC 中使? @RequestMapping 來實現(xiàn) URL 路由映射,也就是瀏覽器連接程序的作?。 接下來要實現(xiàn)的功能是訪問地址:http://127.0.0.1:8080/web/hi,能打印“Hi springMvc”信息。
代碼如下:
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")//路由注冊,當(dāng)使用/web可以訪問到當(dāng)前類
public class WebController {@RequestMapping("/hi")//路由注冊,當(dāng)使用/web/hi可以訪問到當(dāng)前方法
public Object sayHi() {return "Hi springMvc";
}
}
3.1.2注解介紹@RequestMapping 是 Spring Web 應(yīng)?程序中最常被?到的注解之?,它是?來注冊接?的路由映射的。
路由映射:所謂的路由映射指的是,當(dāng)?戶訪問?個 url 時,將?戶的請求對應(yīng)到程序中某個類 的某個?法的過程就叫路由映射。
@RequestMapping 即可修飾類,也可以修飾?法,當(dāng)修飾類和?法時,訪問的地址是類 + ? 法。
@ResponseBody 表示當(dāng)前類返回的是非靜態(tài)頁面,而是數(shù)據(jù)
@Controller 表示是一個控制器,要在spring啟動時加載并注冊
3.1.3 @RequestMapping默認可以接收所有http請求@ResponseBody和@Controller有一個組合注解@RestController,使用@RestController可以代替@ResponseBody和@Controller
如果沒有指定請求方式,@RequestMapping將接收GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT所有的HTTP請求方式。
下面展示 @RequestMapping設(shè)置只接收post請求
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping(value = "/hello" ,method = RequestMethod.POST)
public Object sayHello() {return "Hi SpringMVC";
}
}
3.1.4@GetMapping 和 PostMapping只能默認是GET和POST@RequestMapping(value = “/hello” ,method = RequestMethod.POST),這個是關(guān)鍵
GET請求三種寫法
// 寫法1
@RequestMapping("/index")
// 寫法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 寫法3
@GetMapping("/index")
Post請求兩種寫法
// 寫法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 寫法2
@PostMapping("/index")
3.2 獲取參數(shù)功能
3.2.1 傳遞單個參數(shù)寫法一:基于servlet的request來獲取參數(shù)(不推薦這么寫)
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping("/get1_0")
public Object getParam1_0(HttpServletRequest request, HttpServletResponse response) {return "Hi" + request.getParameter("name");//通過servlet里的request獲取參數(shù),但是不推薦這樣用
}
}
特殊說明:在Spring MVC中默認內(nèi)置隱藏了兩個參數(shù),一個是Request(HttpServletRequest),一個是Response(HttpServletResponse)對象,所以如果想要使用這兩個參數(shù),只需要在方法中申明即可獲取到
寫法二:在 Spring MVC 中可以直接??法中的參數(shù)來實現(xiàn)傳參(推薦寫法)
?如以下代碼:
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping("/get1")
public Object getParam1(Integer age) { return "value: "+age;
}
}
3.2.2 獲取多個參數(shù)@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {
@RequestMapping("/get2")
public Object getParam2(String name,Integer age) {
return "name:: "+name + " | age:"+ age;
}
}
Spring MVC中當(dāng)傳遞多個參數(shù)的時候,傳遞參數(shù)的順序是不影響程序的執(zhí)行的,獲取參數(shù)結(jié)果和參數(shù)的名稱有關(guān),和順序無關(guān)
3.2.3獲取對象Spring MVC 可以?動實現(xiàn)參數(shù)對象的賦值,但是要設(shè)置getter和setter方法,但是只要加@Data注解就自動加了
@Data
public class Student {private Integer id;
private String name;
private Integer age;
private String sex;
}
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping("/get3")
public String getParam3(Student student) {return student.toString();
}
}
在沒有其他注解下,傳的參數(shù)要和Student里屬性名字一樣
3.2.4獲取表單參數(shù)參數(shù)請求的類型:
這里以form表單傳參為例
用參數(shù)來接收form表單的參數(shù)
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController { @RequestMapping("/login")
public String login(String name,String password) {return "用戶名:" +name+" | 密碼:"+password+"";
}
}
用對象來獲取form表單的參數(shù)
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping("/req")
public String req(User user) {return user.toString();
}
}
3.2.5@RequestBody接收JSON對象@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping("/login3")
public Maplogin3(@RequestBody User user) {Mapresult = new HashMap<>();
result.put("name",user.getName());
result.put("password",user.getPassword());
return result;
}
}
@RequestBody可以用來獲取JSON對象
3.2.6 上傳文件@RequestPart使用postman上傳文件
后端寫代碼來接收
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping("/req2")
public String req2(String name, @RequestPart("myfile")MultipartFile file) throws IOException {//保存文件
file.transferTo(new File("D:/1/img.pong"));
return "success";
}
}
3.2.7獲取Cookie/Session/Header瀏覽器會默認將當(dāng)前網(wǎng)站的所有cookie發(fā)送給后端
原因:http協(xié)議無狀態(tài)
傳統(tǒng)獲取 header/cookie
@RequestMapping("/param10")
@ResponseBody
public String param10(HttpServletResponse response, HttpServletRequest requ
est) {String name = request.getParameter("name");
// 獲取所有 cookie 信息
Cookie[] cookies = request.getCookies();
String userAgent = request.getHeader("User-Agent");
return name + ":"+userAgent;
}
使用注解獲取 Cookie—@CookieValue
@Controller //我是一個控制器,我要在spring啟動時加載并注冊
@ResponseBody //當(dāng)前類返回的是非靜態(tài)頁面,因為最早springmvc設(shè)計時是返回一個視圖,所以默認是返回一個靜態(tài)頁面,要加注解才能返回數(shù)據(jù);但是現(xiàn)在前后端分離了,要返回數(shù)據(jù)了
@RequestMapping("/web")
public class WebController {@RequestMapping("/cookie")
public String cookie(@CookieValue("name") String name) {return "cookie"+name;
}
}
獲取Header——@RequestHeader
@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;
}
Session 存儲和獲取
Session 存儲和 Servlet 類似,是使? HttpServletRequest 中獲取的,如下代碼所示:
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {// 獲取 HttpSession 對象,參數(shù)設(shè)置為 true 表示如果沒有 session 對象就創(chuàng)建session
HttpSession session = request.getSession(true);
if(session!=null){session.setAttribute("username","小盧");
}
return "session 存儲成功";
}
獲取Session可以使? HttpServletRequest
@RequestMapping("/sess")
@ResponseBody
public String sess(HttpServletRequest request) {// 如果 session 不存在,不會?動創(chuàng)建
HttpSession session = request.getSession(false);
String username = "";
if(session!=null && session.getAttribute("username")!=null){username = (String) session.getAttribute("username");
}
return "username:"+username;
}
也可以使用注解@SessionAttribute
@RequestMapping("/getSession")
public String getSession(@SessionAttribute(value = "username",required = false) String name) {return "username: " + name;
}
**@SessionAttribute(value = “username”,required = false **:required不設(shè)置它,默認是true,如果這個session不存在會報錯;如果設(shè)置為false,session沒有就沒有了,不會去報錯
3.2.8 使用參數(shù)重命名@RequestMapping("/gettime")
public String getTime(@RequestParam(value = "t",required = false)String time) {return "time: "+time;//此時只能識別t參數(shù),并將參數(shù)t的值,設(shè)置給time變量,此時即使使用time參數(shù),也是讀取不到前端的參數(shù)的,它現(xiàn)在只認參數(shù)名為t的參數(shù)
}
required設(shè)置參數(shù)是否必傳,如果是true就需要必傳,不然就會報錯;設(shè)置為false不傳不會報錯
3.2.9 特殊的URL地址和獲取參數(shù)的方式:使用@PathVariable從url中獲取參數(shù)
@RequestMapping("/login4/{name}/{password}")
public String login4(@PathVariable("name") String name,@PathVariable("password") String password) {return "name: "+name+" | password"+ password;
}
3.3返回數(shù)據(jù)返回數(shù)據(jù)比較簡單,基本上上面獲取完代碼后都會返回,這里就不展開,主要講請求重定向和請求轉(zhuǎn)發(fā)
3.3.1請求重定向和請求轉(zhuǎn)發(fā)forward VS redirect
return 不但可以返回?個視圖,還可以實現(xiàn)跳轉(zhuǎn),跳轉(zhuǎn)的?式有兩種:
// 請求重定向
@RequestMapping("/index")
public String index(){return "redirect:/index.html";
}
// 請求轉(zhuǎn)發(fā)
@RequestMapping("/index2")
public String index2(){return "forward:/index.html";
}
舉個例子說明一下forward和redirect吧
比如說,小盧同學(xué)告訴他媽媽說我想要買新鍵盤,如果小盧他媽媽說好,我?guī)湍闳ベI,這就是forward請求轉(zhuǎn)發(fā);如果他媽媽給他個地址讓他自己去買,這就是請求redirect重定向
也就是說,轉(zhuǎn)發(fā)是服務(wù)器幫轉(zhuǎn)的,而重定向是讓瀏覽器重新請求另一個地址
forward和redirect具體區(qū)別:
舉個例子forward不能訪問到外部資源
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping(value = "/index")
public String sayHi(){return "forward:/index.html";
}
}
在目錄中當(dāng)請求轉(zhuǎn)向到index.html后,因為hello.js和index.html不在同一個目錄,所以會導(dǎo)致獲取不到hello.js;改成請求重定向就能獲取到
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:SpingMVC詳解-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://aaarwkj.com/article30/gdopo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、標(biāo)簽優(yōu)化、微信公眾號、網(wǎng)站改版、網(wǎng)站策劃、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容