
SpringMVC
1、什么是SpringMVC
Spring MVC是一個MVC的開源框架,Spring MVC = Struts2+spring,Spring MVC就相當于是Struts2加上Spring的整合,但是這里有一疑惑是Spring MVC和Spring是什么樣的關系呢。Spring MVC是Spring的一個后續產品,其實就是Spring在原有基礎上,又提供了Web應用的MVC模塊,可以簡單的把Spring MVC理解為是Spring的一個模塊(類似于AOP、IOC這樣的模塊)。
2、MVC模式
MVC:MVC是一種設計模式
MVC的原理圖:

M-Model 模型(完成業務邏輯:有JavaBean構成,service+dao+entity)
V-View 視圖(做界面的展示:jsp、html)
C-Controller (接收請求——>調用模型——>根據結果派發頁面(servlet))
3、SpringMVC的優點
- 它是基于組件技術的.全部的應用對象,無論控制器和視圖,還是業務對象之類的都是 java組件.并且和Spring提供的其他基礎結構緊密集成.
- 不依賴于Servlet API(目標雖是如此,但是在實現的時候確實是依賴于Servlet的)
- 可以任意使用各種視圖技術,而不僅僅局限于JSP
- 支持各種請求資源的映射策略
- 它應是易于擴展的
4、SpringMVC的工作原理

- 客戶端發送請求到DispatcherServlet
- DispatcherServlet查詢handlerMapping找到處理請求的Controller
- Controller調用業務邏輯后,返回ModelAndView
- DispatcherServlet查詢ModelAndView,找到指定視圖
- 視圖將結果返回到客戶端
5、各個組件的說明
- 前端控制器DispatcherServlet(不需要工程師開發,由框架提供)
作用:接收請求,響應結果,相當于轉發器,中央處理器。可以降低與其他組件之間的耦合度
- 處理器映射器HandllerMapping(不需要工程師開發),由框架提供
作用:根據請求的URL查找Handller,HandllerMapping負責根據用戶的請求找到Handller即處理器,Soring MVC提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,注解方式等
- 處理適配器HandllerAdapter
作用:按照特定規則(HandllerAdapter要求的規則)去執行Handler,通過HandllerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多烈性的處理器進行執行。
- 處理器Handler(需要工程師開發)
注意:編寫Handler時按照HandlerAdapter的要求去開發,這樣適配器才可以去正確執行Handller,Handler是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對據圖的用戶請求進行處理,由于Handller涉及到具體的用戶業務請求,所以一般情況需要工程師根據業務需求開發Handler
- 視圖解析器ViewResolver(不需要工程師開發),由框架提供
作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(View),ViewResolver負責將處理結果生成View視圖,ViewResovler首先根據邏輯實體名解析成物理實體名成物理視圖名即具體的頁面地址,在生成View視圖對象,最后對View進行渲染將處理結果通過頁面展示給用戶。Spring MVC框架提供了很多的View視圖類型,包括jstView、pdfView
- 視圖View(需要工程師開發)
View是一個接口,實現類支持不同的View類型(JSP、pdf)
6、SpringMVC 工作流程

- 用戶發起請求到前端控制器(DispatcherServlet)
- 前端控制器請求處理器映射器(HandlerMapping)去查找處理器(Handle):通過XML配置或者注解進行查找
- 找到以后處理器映射器(HandlerMapping)像前端控制器返回執行鏈
- 前端控制器(DispatcherServlet)調用處理器適配器(HandlerAdapter)去處理器(Handler)
- 處理器適配器去執行Handler
- Handler執行完給處理適配器返回ModelAndView
- 處理器適配器向前端控制器返回ModelAndView
- 前端控制器請求視圖解析器(ViewResolver)去執行視圖解析
- 視圖解析器像前端控制器返回View
- 前端控制器對視圖進行渲染
- 前端控制器向用戶響應結果
7、SpringMvc的控制器是不是單例模式,如果是,有什么問題,怎么解決?
是單例模式,所以在多線程訪問的時候有線程安全問題,不要用同步,會影響性能的,解決方案是在控制器里面不能寫字段。
8、簡單介紹SpringMVC和Struts2的區別有哪些?
- springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
- springmvc是基于方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基于類開發,傳遞參數是通過類的屬性,只能設計為多例。
- Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據,springmvc通過參數解析器是將request請求內容解析,并給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最后又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl。
9、SpringMvc怎么和AJAX相互調用的?
通過Jackson框架就可以把Java里面的對象直接轉化成Js可以識別的Json對象。 具體步驟如下:
- 加入Jackson.jar
- 在配置文件中配置json的映射
- 在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
10、 @RequestMapping注解用在類上面有什么作用?
是一個用來處理請求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。
本人會陸續整理出大數據和Java的高頻面試題,請持續關注大數據健身俠:
