概述
傳統(tǒng)開發(fā)中的控制層:
接收請求參數(shù) request.getParameter
封裝實(shí)體 new 實(shí)體類調(diào)用其set方法
訪問業(yè)務(wù)層
接收訪問結(jié)果
指派頁面 通過request和response對象進(jìn)行頁面跳轉(zhuǎn)
將共有行為進(jìn)行抽取成DispatcherServlet【SpringMVC內(nèi)部集成】,通過Spring-MVC.xml配置文件去配置。
Spring:
獲取請求參數(shù):形參與請求名一致或?qū)ο蟮膶傩耘c請求名一致即可自動獲取封裝,不一致時可用@RequestParam(“請求名”)獲取請求的參數(shù)
指派頁面:內(nèi)部可通過配置視圖解析器中前后綴的方式,簡化視圖名,可以直接返回字符串或者M(jìn)odelAndView對象
SpringMVC可以讓一個簡單的Java類成為處理請求的控制器,無需實(shí)現(xiàn)任何借口,支持RESTful編程風(fēng)格
執(zhí)行原理
?DispatcherServlet不執(zhí)行具體操作,負(fù)責(zé)的是相應(yīng)調(diào)度
1DispatcherServlet接收到請求后,調(diào)用HandlerMapping執(zhí)行請求解析,返回給DS一個處理器執(zhí)行鏈
2.拿到處理器執(zhí)行鏈后,DS本身并不執(zhí)行,找HandlerAdaptor幫助進(jìn)行執(zhí)行,由HandlerAdaptor調(diào)用執(zhí)行Handler,返回給DS一個ModelAndView
3.解析視圖時,會去調(diào)用ViewResolve進(jìn)行解析,返回一個View,最后進(jìn)行渲染視圖?
注意:ModelAndView中的View是一個字符串類型的視圖名,經(jīng)過ViewResolver解析后,返回真正的View對象
SpirngMVC中容器加載存在的兩個問題
存在問題1;
每個servlet中,都需要加載相應(yīng)的配置文件
弊端:配置文件加載多次,容器創(chuàng)建多個
解決辦法:將其放在filter中,將創(chuàng)建容器的代碼放在filter中。將容器對象存放在最大的域中【ServletContext域】
直接找對象拿,不通過屬性名更省心?
ServletContextLinstener中監(jiān)測到web應(yīng)用程序啟動
Spring【SpringMVC內(nèi)部集成】提供了ContextLoaderListener 導(dǎo)入其對應(yīng)的坐標(biāo)即可
存在問題2:應(yīng)用配置文件名寫死,解決方法:
1.使用全局初始化參數(shù)
<context-param>
??<param-mame>xxx </param>
???<param-value>classpath: xxx.xml <param-value>
</context-param>
獲取app時,通過WebAppliacationContextUtils的靜態(tài)方法,獲取應(yīng)用上下文對象
數(shù)據(jù)注入思想
方法誰調(diào)用誰負(fù)責(zé)傳入實(shí)參(MVC框架調(diào)用)常用的對象都進(jìn)行了封裝
靜態(tài)資源匹配
1.DispatcherServlet內(nèi)部是缺省的,所有的web請求都會通過DispatcherServlet,會將靜態(tài)資源當(dāng)作,requesmapping中去匹配,找不到時,便會報錯
解決辦法:開啟靜態(tài)資源訪問權(quán)限
<mvc:resources mapping = "/js/** ?location = "/js/">
可以有多個
解決辦法2:交由默認(rèn)的處理器進(jìn)行處理
<mvc: default-servlet-handler>
中文亂碼問題
1.tomcat8.5 get請求亂碼問題已解決(之前需要再tomcat目錄下修改相關(guān)配置)
2.post亂碼問題
post亂碼問題的兩個解決辦法:
辦法1:request對象設(shè)置
辦法2:配置全局過濾filter,內(nèi)部設(shè)置編碼格式
Spring框架已提供:CharacterEncodingFilter
映射地址改為 /*
@RequestMapping
請求url和請求的方法之間建立映射關(guān)系 ?可以用在類和方法上
注意:可以改變請求的方法類型,和限制必須攜代哪些請求參數(shù),內(nèi)部可以設(shè)置輸出字符串的編碼方式
@ResponseBody
告知SpringMVC框架進(jìn)行的是字符串的會寫,而不是進(jìn)行頁面的跳轉(zhuǎn)
注解補(bǔ)充
@RequestBody主要*用來接收前端傳遞給后端的json字符串中的數(shù)據(jù)的(請求體中的數(shù)據(jù))。由于GET方式?jīng)]有請求體,所以使用@RequestBody接受數(shù)據(jù)的時候,前端不能用GET方式提交數(shù)據(jù),而是用POST方式提交。
? 2、在后端的同一個接口中,@RequestBody和@ResquestParam()可以同時使用,@RequestBody最多只能有一個,而@ResquestParam()可以有多個。
? 3、@RequestBody 接收的是***請求體***里面的數(shù)據(jù);而@RequestParam接收的是***key-value***里面的參數(shù)。
4.用法 @RequestBody? 或@ResponseParanm("name名")
?
頁面跳轉(zhuǎn)
1.直接返回字符串 【和內(nèi)部資源視圖解析器拼接時,進(jìn)行返回,拼接是字符串內(nèi)部進(jìn)行拼接】
2.通過ModelAndView對象返回
通過ModelAndView的方法設(shè)置屬性名,里面同直接返回字符串一樣,會進(jìn)行拼接
數(shù)據(jù)響應(yīng)
1.直接返回字符串
需要添加@ResponseBody告知框架,不要進(jìn)行頁面跳轉(zhuǎn),進(jìn)行字符串的輸出 重點(diǎn)?。。。?!
需要指定格式
用到j(luò)son轉(zhuǎn)換工具
導(dǎo)包
jackson-core
jackson-databind
jackson-annnotations
new ObjectMapper
調(diào)用其write
默認(rèn)屬性
value屬性是默認(rèn)屬性,只有這一個可以省略不寫?
注解驅(qū)動
內(nèi)部集成了jackson json轉(zhuǎn)換工具
導(dǎo)入mvc命名空間后添加注解驅(qū)動如下
<mvc:annotation-driven>
監(jiān)聽器、過濾器、攔截器
監(jiān)聽器:當(dāng)事件發(fā)生時,執(zhí)行相關(guān)操作,比如服務(wù)器一啟動,加載Spring核心容器
過濾器:訪問目標(biāo)資源前,做干預(yù)操作,如post請求中文亂碼問題,配置在web.xml中的filter
攔截器:類似于Servlet開發(fā)中的Filter,用于對處理器進(jìn)行預(yù)處理和后處理
攔截器決定是否進(jìn)行放行操作,攔截器是AOP思想的體現(xiàn)
filter和Interceptor區(qū)別:
1.Filter是Servlet規(guī)范中的一部分,任何Java Web工程都可以使用 ?在url-pattern配置/* 后,對所有要訪問的資源攔截
2.Inteceptor:是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才可以使用,配置/** 后,可以對所有資源進(jìn)行攔截
使用方法
過濾器:實(shí)現(xiàn)filter接口,將實(shí)現(xiàn)類配置在web.xml中即可
攔截器:實(shí)現(xiàn)HandlerInteceptor接口,將實(shí)現(xiàn)類配置在Spring-mvc中
攔截器中的內(nèi)部方法
preHandler :返回false,后續(xù)Controller不再執(zhí)行
postHandler 目標(biāo)方法執(zhí)行完畢之后執(zhí)行,在視圖對象返回前進(jìn)行
afterCompletion : ?視圖對象返回之后,在流程執(zhí)行完畢后執(zhí)行,做收尾工作
異常處理
傳統(tǒng)開發(fā):
使用try-catch的方式,補(bǔ)獲和處理異常
異常處理和業(yè)務(wù)之間的代碼耦合度高
catch中的代碼相似度高
解決方法:
抽取,將異常向上拋出,由調(diào)用者負(fù)責(zé)相關(guān)處理,最終的調(diào)用者為DispatcherServlet
相關(guān)注意事項(xiàng)
return返回的資源加/ 表示從根目錄訪問
只有在一個Sevlet請求中才可以獲取ServletContext對象
所有的url請求到web端都是字符串
?
Resutful風(fēng)格
架構(gòu)風(fēng)格、設(shè)計風(fēng)格
url+請求方式
GET 獲取資源
POST 新建資源
PUT 更新資源
DELETE 刪除文章來源:http://www.zghlxwxcb.cn/news/detail-602566.html
前端請求在項(xiàng)目中的執(zhí)行鏈路
url請求-》tomcat服務(wù)器-》應(yīng)用程序->tomcat調(diào)用SpringMVC的service方法——》獲取到業(yè)務(wù)方法后,利用反射執(zhí)行方法文章來源地址http://www.zghlxwxcb.cn/news/detail-602566.html
到了這里,關(guān)于SpringMVC相關(guān)知識點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!