學(xué)習(xí)視頻:孫哥說SpringMVC:結(jié)合Thymeleaf,重塑你的MVC世界?。八从械腤eb開發(fā)探索之旅
銜接上文Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(一)
-
SpingMVC中request作用域的處理
-
代碼
# 基于Model的方式 @RequestMapping("view2") public String view2(Model model) { // 等同于 request.addAttribute(); model.addAttribute("name", "suns"); return "result1"; } # 基于ModelMap的方式 同上 @RequestMapping("view3") public String view3(ModelMap modelMap) { modelMap.addAttribute("name", "suns2"); return "result1"; }
-
Model、ModelMap相關(guān)細(xì)節(jié)分析
-
通過Model、ModelMap進(jìn)行作用域處理,可以解決視圖模板技術(shù)耦合的問題
因?yàn)镾pringMVC通過視圖解析器區(qū)別JSP、FreeMaker,再將Model、ModelMap的數(shù)據(jù)放到request或root里面運(yùn)行。
-
SpringMVC中提供Model和ModelMap兩種方式處理request作用域,他們的區(qū)別是什么
雖然兩者表現(xiàn)形式以及聲明的形參類型都不同,但是在運(yùn)行時(shí),SpringMVC會(huì)動(dòng)態(tài)提供對(duì)應(yīng)的實(shí)現(xiàn)類型,名字是BindingAwareModelMap。所以本質(zhì)上兩者相同。
-
為什么不直接使用BindingAwareModelMap?
在源碼中,Model接口會(huì)根據(jù)開發(fā)者使用SpringMVC或Spring WebFlux進(jìn)行自動(dòng)適配,使用MVC開發(fā)時(shí)會(huì)使用BindingAwareModelMap,而WebFlux開發(fā)時(shí)使用的是ConcurrentModel。
-
SpringMVC為什么會(huì)提供兩種開發(fā)方式?Model、ModelMap這兩種開發(fā)方式,更推薦哪種使用?
推薦使用Model,ModelMap是老系統(tǒng)使用的,為了兼容老系統(tǒng)所以留著。Model可以兼容傳統(tǒng)MVC也可以在WebFlux中使用,更有利于項(xiàng)目維護(hù)。
-
如果redirect跳轉(zhuǎn),數(shù)據(jù)如何跳轉(zhuǎn)
SpringMVC會(huì)自動(dòng)把Model或ModelMap中的數(shù)據(jù),通過?的形式在url上進(jìn)行拼接,從而傳遞數(shù)據(jù)
-
-
-
SpringMVC中Session作用域的處理
-
基本使用方式及其存在的問題
session.setAttribute("name","value"); @RequestMapping("view") public String view1(HttpSession session){ session.setAttribute("name","value"); return "result"; } 存在問題:與ServletAPI耦合,在SpringMVC中不建議使用。
-
@SessionAttributes注解
-
存儲(chǔ)數(shù)據(jù)
@Controller @RequestMapping("view3") **@SessionAttributes(value = "name") // 聲明name存在session作用域** public class View3Controller { @RequestMapping("view1") public String view1(Model model) { model.addAttribute("name", "xiaojr"); model.addAttribute("age", 10); return "result1"; } } // jsp中取值 <html> <body> <h1>session attribute is ${sessionScope.name}</h1> <h1>request attribute is ${requestScope.age}</h1> </body> </html>
-
注意
- Model、ModelMap把name的數(shù)據(jù)通過@SessionAttributes存儲(chǔ)在Session作用域中的同時(shí)在Request作用域中也會(huì)存儲(chǔ)。
- 此時(shí)Request作用域、Session作用域存儲(chǔ)的是一個(gè)對(duì)象的引用。
-
-
刪除Session作用域中的數(shù)據(jù)
-
-
SpringMVC中application作用域的處理
-
為什么SpringMVC沒有提供application作用域
因?yàn)閍pplication這個(gè)作用域是全局唯一,在開發(fā)中多用于存儲(chǔ)全局唯一的對(duì)象,被框架底層封裝,在開發(fā)時(shí),程序員基本不會(huì)使用其用于業(yè)務(wù)操作。
-
@ModelAttribute注解
-
SpringMVC通過@ModelAttribute注解:接受請(qǐng)求參數(shù)的同時(shí),把數(shù)據(jù)存儲(chǔ)到request作用域中。
@RequestMapping("view1") public String view1(@ModelAttribute("name") String name) { System.out.println("View4Controller.view1"); return "result2"; }
-
使用場(chǎng)景
傳遞頁(yè)碼時(shí)可以使用。 -
注意細(xì)節(jié)
-
細(xì)節(jié)一
如果傳遞的是簡(jiǎn)單變量參數(shù):則value屬性必須與超級(jí)鏈接或表單的key名稱保持一致。
如果傳遞的是POJO類型的請(qǐng)求參數(shù):則沒有上述要求,但是value屬性會(huì)作為request作用域的名稱。
-
細(xì)節(jié)二
-
@ModelAttribute
中value的值不能與@SessionAttributes
中value的值一致,如果一致則會(huì)產(chǎn)生異常 - 如果要把請(qǐng)求參數(shù)的數(shù)據(jù)也存在session作用域中,需要將request作用域存儲(chǔ)改為使用傳統(tǒng)做法:
model.addAttribute(”name”,name);
-
-
-
-
什么是ModelAndView【了解】
-
什么是ModelAndView
ModelAndView這個(gè)類型,實(shí)際上是一個(gè)復(fù)合類型,起到了2個(gè)方面的作用。
注意:ModelAndView里面只能使用ModelMap,這也是它的劣勢(shì)之一。
- Model 代表作用域的操作,就是前面的ModelMap。
- View 代表跳轉(zhuǎn)路徑(頁(yè)面),對(duì)應(yīng)前面的四種跳轉(zhuǎn)。
最終這兩方面的工作統(tǒng)一被ModelAndView進(jìn)行封裝,做為控制器方法的返回值使用。
-
總結(jié)目前控制器方法返回值
1. public String controller(); 2. public ModelAndView controller(); 注意:SpringMVC處理跳轉(zhuǎn)頁(yè)面和作用域時(shí),把相應(yīng)的內(nèi)容都會(huì)封裝到ModelAndView中, 所以ModelAndView返回值的這種處理更加底層,而返回值String的處理僅是簡(jiǎn)化開發(fā)。
-
5.5 視圖控制器
5.5.1 什么是視圖控制器
-
視圖控制器可以通過配置的方式,訪問受保護(hù)的視圖模板,簡(jiǎn)化開發(fā)。
-
什么是視圖模板?
JSP Thymeleaf FreeMarker Velocity
-
為什么需要保護(hù)視圖模板?
目前的開發(fā)方式都沒有對(duì)視圖模板進(jìn)行保護(hù),有可能導(dǎo)致程序在被用戶訪問時(shí)產(chǎn)生非預(yù)期效果(Bug)
-
如何保護(hù)視圖模板
將所有視圖模板放置在WEB-INF下,這樣用戶就無(wú)法通過地址直接訪問視圖模板了。
5.5.1 受保護(hù)的視圖模板如何訪問?
-
所有的視圖模板,只能通過控制器forward訪問:
return "result";
return "forward:/WEB-INF/jsp/result.jsp";
記得同時(shí)修改viewResolver
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" **value="/WEB-INF/jsp/"/>** <property name="suffix" value=".jsp"/> </bean>
5.5.2 視圖控制器
雖然可以通過控制器forward訪問視圖模板,但是直接訪問頁(yè)面也需要控制器,因此會(huì)變得繁瑣,所以有了視圖控制器的存在:通過在配置文件(dispatcher.xml)可以直接訪問
<mvc:view-controller path="/result3" view-name="result3"/>
注意:path不能和@RequestMapping的路徑?jīng)_突
5.5.3 視圖控制器的Redirect跳轉(zhuǎn)
@RequestMapping("view1")
public String view1() {
System.out.println("View6Controller.view1");
return "redirect:/result4";
}
<mvc:view-controller path="/result4" view-name="result4"/>
5.6 靜態(tài)資源處理
5.5.1 什么是靜態(tài)資源
- 所謂靜態(tài)資源,指的是項(xiàng)目中非java代碼部分的內(nèi)容,如 圖片、js文件、css文件。
- 目前SpringMVC的開發(fā)中,按照現(xiàn)有的配置內(nèi)容,是無(wú)法訪問靜態(tài)資源的。
g)
在SpringMVC底層,資源請(qǐng)求訪問DispatcherServlet后,會(huì)將其請(qǐng)求當(dāng)成控制器并調(diào)用對(duì)應(yīng)的控制器方法創(chuàng)建對(duì)象,但是在靜態(tài)資源訪問,第一步就走不通了,所以就報(bào)錯(cuò)404。
5.5.3 解決方式
-
方式一【DefaultServlet】
Tomcat提供了能夠訪問靜態(tài)資源的DefaultServlet(web.xml)
在web.xml添加DefaultServlet后的代碼:
-
方式二【default-servlet-handler】推薦
-
第一種開發(fā)方式的問題
-
-
default-servlet-handler開發(fā)方式
- 在SpringMVC的配置文件(dispatcher.xml)中,配置
<mvc:default-servlet-handler/>
即可
- 在SpringMVC的配置文件(dispatcher.xml)中,配置
-
實(shí)現(xiàn)原理
-
<mvc:default-servlet-handler/>
標(biāo)簽的底層也是調(diào)用了defaultServlet進(jìn)行的靜態(tài)資源處理。 -
<mvc:default-servlet-handler/>
標(biāo)簽他是如何調(diào)用defaultServlet進(jìn)行靜態(tài)資源處理的?他的底層是通過DefaultServletHttpRequestHandler,以forward的形式調(diào)用的DefaultServlet。
mvc:default-servlet-handler/完整運(yùn)行流程:用戶如果發(fā)起控制器的請(qǐng)求,首先會(huì)到DispatcherServlet,然后DispatcherServlet會(huì)通過RequestMappingHandlerMapiping查找控制器上@RequestMapping注解并進(jìn)行相應(yīng)的匹配,進(jìn)而查找,如果查找到則會(huì)通過HandlerAdapter進(jìn)行處理。對(duì)于靜態(tài)資源的操作,也就是使用了
<mvc:default-servlet-handler/>
的處理,它的請(qǐng)求也一樣會(huì)訪問DispatcherServlet,沒查找到則會(huì)通過SimpleUrlHandlerMapping調(diào)用DefaultServletHttpRequestHandler進(jìn)而調(diào)用DefaultServlet進(jìn)行靜態(tài)資源的處理。文章來源:http://www.zghlxwxcb.cn/news/detail-747853.html -
下一章:Spring MVC學(xué)習(xí)隨筆-文件下載和上傳(配置文件上傳解析器multipartResolver)文章來源地址http://www.zghlxwxcb.cn/news/detail-747853.html
到了這里,關(guān)于Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!