一脑蠕、MVC是一種設(shè)計模式
分析:
- M~Model 模型(完成業(yè)務(wù)邏輯:由javaBean構(gòu)成玖翅,service+dao+entity)
- V~View 視圖(做界面的展示 jsp艘刚,html……)
- C~Controller 控制器(接收請求—>調(diào)用模型—>根據(jù)結(jié)果派發(fā)頁面)
二横漏、SpringMVC是什么
SpringMVC是一個MVC的開源框架穴吹。SpringMVC和spring有什么樣的關(guān)系呢氢惋?百度百科上有一個很好的解釋:SpringMVC是spring的一個后續(xù)產(chǎn)品桶良,其實就是spring在原有基礎(chǔ)上座舍,又提供了web應(yīng)用的MVC模塊,可以簡單的把SpringMVC理解為是spring的一個模塊(類似AOP陨帆,IOC這樣的模塊)曲秉,常說SpringMVC與spring無縫集成,其實SpringMVC就是spring的一個子模塊疲牵,所以根本不需要同spring進(jìn)行整合承二。
SpringMVC的解析圖:
這里主要理解springMVC中的幾個組件:
前端控制器(DispatcherServlet):整個流程控制的中心,控制其它組件執(zhí)行纲爸,統(tǒng)一調(diào)度亥鸠,降低組件之間的耦合性,提高每個組件的擴(kuò)展性识啦。相當(dāng)于電腦的CPU负蚊。
處理器映射器(HandlerMapping):根據(jù)URL去查找處理器。通過擴(kuò)展處理器映射器實現(xiàn)不同的映射方式颓哮,例如:配置文件方式家妆,實現(xiàn)接口方式冕茅,注解方式等伤极。
處理器(Handler):即后端控制器蛹找,用controller表示。(需要程序員去寫代碼處理邏輯的)
處理器適配器(HandlerAdapter):會把處理器包裝成適配器哨坪,這樣就可以支持多種類型的處理器庸疾,類比筆記本的適配器(適配器模式的應(yīng)用)
視圖解析器(ViewResovler):進(jìn)行視圖解析,多返回字符串齿税,進(jìn)行處理彼硫,可以解析成對應(yīng)的頁面炊豪,展示給用戶凌箕。視圖中通常需要標(biāo)簽語言展示模型數(shù)據(jù)。支持更多類型的視圖解析词渤,例如:jsp牵舱、freemarker、pdf缺虐、excel等芜壁。(需要程序員去寫代碼處理邏輯的)
三、SpringMVC工作原理
SpringMVC工作原理圖
SpringMVC流程
用戶發(fā)送請求至前端控制器DispatcherServlet高氮。
DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器慧妄。
處理器映射器找到具體的處理器(可以根據(jù)xml配置、注解進(jìn)行查找)剪芍,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet塞淹。
DispatcherServlet調(diào)用HandlerAdapter處理器適配器。
HandlerAdapter經(jīng)過適配調(diào)用具體的處理器(Controller罪裹,也叫后端控制器)饱普。
Controller執(zhí)行完成返回ModelAndView。
HandlerAdapter將Controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet状共。
DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器套耕。
ViewReslover解析后返回具體View。
DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)峡继。
DispatcherServlet響應(yīng)用戶冯袍。
組件說明:
前端控制器DispatcherServlet(不需要工程師開發(fā)),由框架提供
作用:接收請求,響應(yīng)結(jié)果碾牌,相當(dāng)于轉(zhuǎn)發(fā)器康愤,中央處理器。有了dispatcherServlet減少了其它組件之間的耦合度小染。
用戶請求到達(dá)前端控制器翘瓮,它就相當(dāng)于mvc模式中的c,dispatcherServlet是整個流程控制的中心裤翩,由它調(diào)用其它組件處理用戶的請求资盅,dispatcherServlet的存在降低了組件之間的耦合性调榄。處理器映射器HandlerMapping(不需要工程師開發(fā)),由框架提供
作用:根據(jù)請求的url查找Handler
HandlerMapping負(fù)責(zé)根據(jù)用戶請求找到Handler即處理器呵扛,SpringMVC提供了不同的映射器實現(xiàn)不同的映射方式每庆,例如:配置文件方式,實現(xiàn)接口方式今穿,注解方式等缤灵。處理器適配器HandlerAdapter
作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler
通過HandlerAdapter對處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用蓝晒,通過擴(kuò)展適配器可以對更多類型的處理器進(jìn)行執(zhí)行腮出。處理器Handler(需要工程師開發(fā))
注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler
Handler 是繼DispatcherServlet前端控制器的后端控制器芝薇,在DispatcherServlet的控制下Handler對具體的用戶請求進(jìn)行處理胚嘲。
由于Handler涉及到具體的用戶業(yè)務(wù)請求,所以一般情況需要工程師根據(jù)業(yè)務(wù)需求開發(fā)Handler洛二。視圖解析器View resolver(不需要工程師開發(fā))馋劈,由框架提供
作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)
View Resolver負(fù)責(zé)將處理結(jié)果生成View視圖晾嘶,View Resolver首先根據(jù)邏輯視圖名解析成物理視圖名即具體的頁面地址妓雾,再生成View視圖對象,最后對View進(jìn)行渲染將處理結(jié)果通過頁面展示給用戶垒迂。SpringMVC框架提供了很多的View視圖類型械姻,包括:jstlView、freemarkerView娇斑、pdfView等策添。
一般情況下需要通過頁面標(biāo)簽或頁面模版技術(shù)將模型數(shù)據(jù)通過頁面展示給用戶,需要由工程師根據(jù)業(yè)務(wù)需求開發(fā)具體的頁面毫缆。視圖View(需要工程師開發(fā)jsp…)
View是一個接口唯竹,實現(xiàn)類支持不同的View類型(jsp、freemarker苦丁、pdf…)
核心架構(gòu)的具體流程步驟如下:
- 首先用戶發(fā)送請求——>DispatcherServlet浸颓,前端控制器收到請求后自己不進(jìn)行處理,而是委托給其他的解析器進(jìn)行處理旺拉,作為統(tǒng)一訪問點(diǎn)产上,進(jìn)行全局的流程控制;
- DispatcherServlet——>HandlerMapping蛾狗, HandlerMapping 將會把請求映射為HandlerExecutionChain 對象【包含一個Handler 處理器(頁面控制器)對象晋涣、多個HandlerInterceptor 攔截器對象】。通過這種策略模式沉桌,很容易添加新的映射策略谢鹊;
- DispatcherServlet——>HandlerAdapter算吩,HandlerAdapter 將會把處理器包裝為適配器,從而支持多種類型的處理器佃扼,即適配器設(shè)計模式的應(yīng)用偎巢,從而很容易支持很多類型的處理器;
- HandlerAdapter——>處理器功能處理方法的調(diào)用兼耀,HandlerAdapter 將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法压昼,完成功能處理;并返回一個ModelAndView 對象(包含模型數(shù)據(jù)瘤运、邏輯視圖名)窍霞;
- ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析為具體的View尽超,通過這種策略模式官撼,很容易更換其他視圖技術(shù);
- View——>渲染似谁,View會根據(jù)傳進(jìn)來的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實際是一個Map數(shù)據(jù)結(jié)構(gòu)掠哥,因此很容易支持其他視圖技術(shù)巩踏;
- 返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶续搀,到此一個流程結(jié)束塞琼。
四、Spring MVC 的優(yōu)點(diǎn)
- 它是基于組件技術(shù)的禁舷。全部的應(yīng)用對象彪杉,無論控制器和視圖,還是業(yè)務(wù)對象之類的都是組件牵咙,并且和 Spring 提供的其他基礎(chǔ)結(jié)構(gòu)緊密集成派近。
- 不依賴于 Servlet API(目標(biāo)雖是如此,但是在實現(xiàn)的時候確實是依賴于 Servlet 的)洁桌。
- 可以任意使用各種視圖技術(shù)渴丸,而不僅僅局限于 JSP。
- 支持各種請求資源的映射策略另凌。
- 它應(yīng)是易于擴(kuò)展的谱轨。
五、SpringMVC 的控制器是不是單例模式吠谢?如果是有什么問題土童,怎么解決?
答:是單例模式工坊,所以在多線程訪問的時候有線程安全問題献汗,不要用同步错沃,會影響性能的。解決方案是在控制器里面不能寫字段雀瓢。
六枢析、SpingMVC 中的控制器的注解一般用哪個,有沒有別的注解可以替代刃麸?
答:一般用@Conntroller 注解醒叁,表示是控制層,該注解表明該類扮演控制器的角色泊业。不能用別的注解代替把沼。
七、 @RequestMapping 注解用在類上面有什么作用吁伺?
答:是一個用來處理請求地址映射的注解饮睬,可用于類或方法上。用于類上篮奄,表示類中響應(yīng)請求的方法都是以該地址作為父路徑捆愁。
八、怎么樣把某個請求映射到特定的方法上面窟却?
答:直接在方法上面加上注解@RequestMapping昼丑,并且在這個注解里面寫上要攔截的路徑。
九夸赫、怎么配置菩帝,才能在攔截請求中攔截 get 方式提交的方法?
答:可以在@RequestMapping 注解里面加上 method=RequestMethod.GET
十茬腿、怎么樣在方法里面得到 Request或者 Session呼奢?
答:直接在方法的形參中聲明 request,SpringMVC 就自動把 request 對象傳入了切平。
十一握础、怎么在攔截的方法里面得到從前臺傳入的參數(shù)?
答:直接在形參里面聲明這個參數(shù)就可以揭绑,但必須名字和傳過來的參數(shù)一樣弓候。
十二、如果前臺有很多個參數(shù)傳入他匪,并且這些參數(shù)都是一個對象的菇存,那么怎么樣快速得到這象?
答:直接在方法中聲明這個對象邦蜜,SpringMVC 就自動會把屬性賦值到這個對象里面鹏秋。
十三碱鳞、SpringMVC 中函數(shù)的返回值是什么苔埋?
答:返回值可以有很多類型,有 String姐扮、ModelAndView。一般用 String 比較好衣吠。
十四茶敏、SpringMVC 怎么樣設(shè)定轉(zhuǎn)發(fā)和重定向的?
- 在返回值前面加"forward:"就可以讓結(jié)果轉(zhuǎn)發(fā)缚俏,比如"forward:user.do?name=method4"
- 在返回值前面加"redirect:"就可以讓返回值重定向惊搏,比如"redirect:百度一下,你就知道"
十五忧换、SpringMVC 用什么對象從后臺向前臺傳遞數(shù)據(jù)的恬惯?
答:通過 ModelMap 對象,可以在這個對象里面用 put 方法亚茬,把對象加到里面酪耳,前臺就可以過 el 表達(dá)式拿到。
十六刹缝、SpringMVC 中有個類把視圖和數(shù)據(jù)都合并的一起的碗暗,叫什么?
答:叫 ModelAndView赞草。
十七讹堤、怎么樣把 ModelMap 里面的數(shù)據(jù)放入Session 里面?
答:可以在類上面加上@SessionAttributes 注解厨疙,里面包含的字符串就是要放入 session 的 key。
十八疑务、SpringMVC 怎么和 AJAX 相互調(diào)用的沾凄?
答:通過 Jackson 框架就可以把 Java 里面的對象直接轉(zhuǎn)化成 Js 可以識別的 Json 對象。具體步驟如下 :
- 加入 Jackson.jar
- 在配置文件中配置 json 的映射
- 在接受 Ajax 方法里面可以直接返回 Object知允、List 等撒蟀,但方法前面要加上@ResponseBody注解
十九、當(dāng)一個方法向 AJAX 返回特殊對象温鸽,比如 Object保屯、List 等,需要做什么處理涤垫?
答:要加上@ResponseBody 注解
二十姑尺、SpringMVC 攔截器是怎么寫的?
- 一種是實現(xiàn)接口蝠猬。
- 另外一種是繼承適配器類切蟋,然后在 SpringMVC 的配置文配置攔截器即可:
<mvc:interceptors>
<mvc:mapping path="/modelMap.do" />
</mvc:interceptor></mvc:interceptors>