Spring MVC處理響應(yīng)的案例詳解
一、配置視圖解析器
SpringMVC默認(rèn)情況下會(huì)在控制器執(zhí)行完成后跳轉(zhuǎn)到視圖頁面,視圖解析器能找到相應(yīng)的視圖,之前的404異常就是由于沒有配置視圖解析器導(dǎo)致找不到視圖。在SpringMVC中提供了13個(gè)視圖解析器,用于支持不同的視圖技術(shù)。InternalResourceViewResolver是SpringMVC的默認(rèn)視圖解析器,用來解析JSP視圖。
添加如下標(biāo)簽就算配置視圖解析器了
<!-- 視圖解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 視圖前綴 --> <property name="prefix" value="/"/> <!-- 視圖后綴 --> <property name="suffix" value=".jsp"/> </bean>
二、控制器方法的返回值
我們可以通過控制器方法的返回值設(shè)置跳轉(zhuǎn)的視圖,控制器方法支持以下返回值類型:
2.1 返回值為void
此時(shí)會(huì)跳轉(zhuǎn)到名字是 前綴+方法路徑名+后綴 的jsp頁面
2.1.1 控制器方法
/** * SpringMVC處理響應(yīng)——控制器方法(根據(jù)返回值) */ // 路徑是helloMVC,方法執(zhí)行完后會(huì)跳轉(zhuǎn)到/helloMVC.jsp @RequestMapping("helloMVC") public void helloMVC(){ System.out.println("hello SpringMVC!"); }
2.1.2 jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>MVC</title> </head> <body> <h1>歡迎來到SpringMVC!</h1> </body> </html>
2.1.3 測(cè)試結(jié)果
訪問路徑:http://localhost:8080/helloMVC
OK,確實(shí)返回了jsp頁面
2.2 返回值為String
此時(shí)會(huì)跳轉(zhuǎn)到名字是 前綴+返回值+后綴 的jsp頁面
2.2.1 控制器方法
// 返回值是String,此時(shí)會(huì)跳轉(zhuǎn)到名字是 前綴+返回值+后綴 的jsp頁面 @RequestMapping("c2/hello1") public String helloMVC1(){ System.out.println("Hello SpringMVC!"); return "helloMVC"; }
2.2.2 測(cè)試結(jié)果
訪問路徑:http://localhost:8080/c2/hello1
OK,這次返回的也不是helloMVC1頁面,確實(shí)成功實(shí)現(xiàn)了。
2.3 返回值為ModelAndView
這是SpringMVC提供的對(duì)象,該對(duì)象可以向request域設(shè)置數(shù)據(jù)并指定跳轉(zhuǎn)的頁面。該對(duì)象中包含Model對(duì)象和View對(duì)象。
- Model:向request域中設(shè)置數(shù)據(jù)。
- View:指定跳轉(zhuǎn)的頁面。
2.3.1 控制器方法
// 返回值為ModelAndView @RequestMapping("/c2/hello2") public ModelAndView useMAV(){ System.out.println("返回值類型為ModelAndView"); // 1.創(chuàng)建ModelAndView對(duì)象 ModelAndView modelAndView = new ModelAndView(); // 2.獲取Model對(duì)象,本質(zhì)是一個(gè)Map Map<String,Object> model = modelAndView.getModel(); // 3.使用Model對(duì)象向request域設(shè)置數(shù)據(jù) model.put("username","黃慶禧"); // 4.使用view對(duì)象設(shè)置跳轉(zhuǎn)的路徑 modelAndView.setViewName("lyl-HQX"); return modelAndView; }
OK,這里設(shè)置了一個(gè)username的屬性,屬性值為黃慶禧
2.3.2 JSP頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>lyl-HQX</title> </head> <body> <h1>name: 你好!${requestScope.name}</h1> <h1>username: 你好!${requestScope.username}</h1> <h1>request-Map 你好!${requestScope.usernameMap}</h1> <h1>session 地址是:${sessionScope.address}</h1> <h1>context 年齡是:${applicationScope.age}</h1> </body> </html>
OK,這里解釋一下,這里用到的參數(shù)是后面需要的。
2.3.3 測(cè)試結(jié)果
OK,確實(shí)可以成功打印出黃慶禧的名字了。
三、某些會(huì)話對(duì)象設(shè)置數(shù)據(jù)
當(dāng)控制器返回值為ModelAndView時(shí)我們可以向request域設(shè)置數(shù)據(jù),我們還有以下方法可以向request域設(shè)置數(shù)據(jù):
3.1 request域設(shè)置數(shù)據(jù)
3.1.1 使用參數(shù)為原生的HttpServletRequest
控制器方法
/** * SpringMVC處理響應(yīng)-request域 */ // 使用原生的HttpServletRequest @RequestMapping("/c2/hello3") public String setRequestModel(HttpServletRequest request){ request.setAttribute("username","會(huì)洗碗的CV工程師"); return "lyl-HQX"; }
OK,username屬性值為會(huì)洗碗的CV工程師,看一下能否成功獲取
測(cè)試結(jié)果
OK,可以看到確實(shí)成功獲取了。 接下來嘗試其他一些參數(shù)。
3.1.2 使用參數(shù)為Model和ModelMap
SpringMVC提供了Model接口和ModelMap類,控制器方法添加這兩個(gè)類型的參數(shù),使用該參數(shù)設(shè)置數(shù)據(jù),該數(shù)據(jù)就會(huì)存到request域中。
控制器方法
//使用Model、ModelMap @RequestMapping("/c2/hello4") public String setRequestModel2(Model model, ModelMap modelMap){ // 使用Model將數(shù)據(jù)存入request域 model.addAttribute("username","LYL"); // 使用ModelMap將數(shù)據(jù)傳入request域 modelMap.addAttribute("usernameMap","HQX"); return "lyl-HQX"; }
測(cè)試結(jié)果
OK,可以看得到兩個(gè)屬性都已經(jīng)成功獲取。
3.1.3 使用參數(shù)為Map集合
Model接口底層就是一個(gè)Map集合,我們可以給控制器方法設(shè)置Map類型的參數(shù),向Map中添加鍵值對(duì),數(shù)據(jù)也會(huì)存到request域中。
控制器方法
// 使用Map集合 @RequestMapping("/c2/hello5") public String setRequestModel3(Map map){ map.put("username","程序員"); map.put("usernameMap","程序員"); return "lyl-HQX"; }
測(cè)試結(jié)果
OK,可以看得出來和上面也是一樣可以使用的。
3.2 session域設(shè)置數(shù)據(jù)
Session作用域表示在當(dāng)前會(huì)話中有效。在SpringMVC中對(duì)于Session作用域傳值,只能使用HttpSession對(duì)象來實(shí)現(xiàn)。
3.2.1 控制器方法
/** * SpringMVC處理響應(yīng)-session域設(shè)置數(shù)據(jù) */ @RequestMapping("/c2/hello6") public String setSessionModel(HttpSession session){ session.setAttribute("address","北京"); return "lyl-HQX"; }
OK,這次是在session域設(shè)置了一個(gè)地址屬性,看一下能否成功獲取
3.2.2 測(cè)試結(jié)果
Ok,可以看到確實(shí)成功獲取了。
3.3 context域設(shè)置數(shù)據(jù)
context作用域表示在整個(gè)應(yīng)用范圍都有效。在SpringMVC中對(duì)context作用域傳值,只能使用ServletContext對(duì)象來實(shí)現(xiàn)。但是該對(duì)象不能直接注入到方法參數(shù)中,需要通過HttpSession對(duì)象獲取。
3.2.1 控制器方法
/** * SpringMVC處理響應(yīng)-context域設(shè)置數(shù)據(jù) */ @RequestMapping("/c2/hello7") public String setContextModel(HttpSession session){ ServletContext servletContext = session.getServletContext(); servletContext.setAttribute("age",10); return "lyl-HQX"; }
這次利用context域設(shè)置了一個(gè)年齡屬性,看一下能否獲取對(duì)應(yīng)的值。
3.2.2 測(cè)試結(jié)果
OK,確實(shí)成功獲取到了。
四、請(qǐng)求轉(zhuǎn)發(fā)&重定向
之前的案例,我們發(fā)現(xiàn)request域中的值可以傳到j(luò)sp頁面中,也就是通過視圖解析器跳轉(zhuǎn)到視圖的底層是請(qǐng)求轉(zhuǎn)發(fā)。
如果我們跳轉(zhuǎn)時(shí)不想使用視圖解析器,可以使用原生HttpServletRequest進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)或HttpServletResponse進(jìn)行重定向:
4.1 原生請(qǐng)求轉(zhuǎn)發(fā)重定向?qū)懛?/h3>
4.1.1 重定向控制器方法
/** * SpringMVC處理響應(yīng)-請(qǐng)求轉(zhuǎn)發(fā)&重定向 */ @RequestMapping("/c2/hello8") public void myForward1(HttpServletRequest request, HttpServletResponse response) throws Exception{ request.setAttribute("name","程序員"); // 請(qǐng)求轉(zhuǎn)發(fā) //request.getRequestDispatcher("/c2/hello9").forward(request,response); // 原生重定向 response.sendRedirect("/c2/hello9"); }
4.1.2 重定向測(cè)試結(jié)果
OK,可以看得到確實(shí)重定向去了。注意看,這里重定向出來后是無法獲取request域的屬性值的,待會(huì)試一下請(qǐng)求轉(zhuǎn)發(fā)可不可以。 重定向地址欄會(huì)發(fā)生變化,而請(qǐng)求轉(zhuǎn)發(fā)地址欄是不會(huì)變化的。
4.1.3 請(qǐng)求轉(zhuǎn)發(fā)測(cè)試結(jié)果
OK,,可以看得到請(qǐng)求轉(zhuǎn)發(fā)就可以獲取屬性值,并且地址欄沒有發(fā)生變化。
4.2 springmvc提供的請(qǐng)求轉(zhuǎn)發(fā)重定向?qū)懛?/h3>
// SpringMVC提供一種關(guān)于重定向和請(qǐng)求轉(zhuǎn)發(fā)更為簡(jiǎn)單的寫法
@RequestMapping("/c2/hello10")
public String myForward3(HttpServletRequest request){
request.setAttribute("name","程序員");
// 請(qǐng)求轉(zhuǎn)發(fā)
return "forward:/c2/hello9";
// 重定向
//return "redirect:/c2/hello9";
}
// SpringMVC提供一種關(guān)于重定向和請(qǐng)求轉(zhuǎn)發(fā)更為簡(jiǎn)單的寫法 @RequestMapping("/c2/hello10") public String myForward3(HttpServletRequest request){ request.setAttribute("name","程序員"); // 請(qǐng)求轉(zhuǎn)發(fā) return "forward:/c2/hello9"; // 重定向 //return "redirect:/c2/hello9"; }
以上就是Spring MVC處理響應(yīng)的案例詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC處理響應(yīng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于SpringBoot開機(jī)啟動(dòng)與@Order注解
這篇文章主要介紹了SpringBoot開機(jī)啟動(dòng)與@Order注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java?詳細(xì)分析四個(gè)經(jīng)典鏈表面試題
兄弟們,編程,當(dāng)我們學(xué)習(xí)完數(shù)據(jù)結(jié)構(gòu)的時(shí)候,你就會(huì)有一種豁然開朗的感覺。算是真正的入了編程的門,所以打好數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)是特別特別重要的2022-03-03SpringBoot+Redis哨兵模式的實(shí)現(xiàn)
本文主要介紹了SpringBoot+Redis哨兵模式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Spring如何基于注解顯式實(shí)現(xiàn)自動(dòng)裝配
這篇文章主要介紹了Spring如何基于注解顯式實(shí)現(xiàn)自動(dòng)裝配,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08java實(shí)現(xiàn)圖片轉(zhuǎn)ascii字符畫的方法示例
這篇文章主要介紹了java實(shí)現(xiàn)圖片轉(zhuǎn)ascii字符畫的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08IntelliJ?IDEA?2021.3?正式發(fā)布之支持遠(yuǎn)程開發(fā)、IDE故障排查等多項(xiàng)優(yōu)化改進(jìn)
IntelliJ?IDEA?2021.3?正式發(fā)布:支持遠(yuǎn)程開發(fā)、IDE故障排查等多項(xiàng)優(yōu)化改進(jìn)問題,在這個(gè)版本中的遠(yuǎn)程開發(fā)還不是一個(gè)正式版本,而是BETA版,但通過這個(gè)BETA版本,也可以體驗(yàn)IDEA“遠(yuǎn)程開發(fā)”給我們帶來的全新體驗(yàn)2021-12-12SpringCloud2020整合Nacos-Bootstrap配置不生效的解決
這篇文章主要介紹了SpringCloud2020整合Nacos-Bootstrap配置不生效的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01深入解析Jdk8中Stream流的使用讓你脫離for循環(huán)
這篇文章主要介紹了Jdk8中Stream流的使用,讓你脫離for循環(huán),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Java 程序里transient關(guān)鍵字使用方法示例
這篇文章主要為大家介紹了Java 程序里transient關(guān)鍵字使用方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11