javascript
SpringMVC相关面试题
1. 對MVC模式的理解
? ? ? ?MVC 是 Model — View — Controler 的簡稱,它是一種架構模式,它分離了表現與交互。它被分為三個核心部件:模型、視圖、控制器。
? ? ? ? ? ? ? ? ? ??
Model(模型):是程序的主體部分,主要包含業務數據和業務邏輯。在模型層,還會涉及到用戶發布的服務,在服務中會根據不同的業務需求,更新業務模型中的數據。
View(視圖):是程序呈現給用戶的部分,是用戶和程序交互的接口,用戶會根據具體的業務需求,在 View 視圖層輸入自己特定的業務數據,并通過界面的事件交互,將對應的輸入參數提交給后臺控制器進行處理。
Controller(控制器):Controller 是用來處理用戶輸入數據,以及更新業務模型的部分。控制器中接收了用戶與界面交互時傳遞過來的數據,并根據數據業務邏輯來執行服務的調用和更新業務模型的數據和狀態。
2.?SpringMVC 的工作原理/執行流程
SpringMVC運行流程
1. 用戶向服務器發送請求,請求被 Spring 前端控制Servelt DispatcherServlet 捕獲;
2. DispatcherServlet 對請求 URL 進行解析,得到請求資源標識符(URI)。然后根據該 URI,調用 HandlerMapping 獲得該 Handler 配置的所有相關的對象(包括 Handler 對象以及 Handler 對象對應的攔截器),最后以 HandlerExecutionChain 對象的形式返回;
3. DispatcherServlet 根據獲得的 Handler,選擇一個合適的HandlerAdapter;(附注:如果成功獲得 HandlerAdapter 后,此時將開始執行攔截器的 preHandler(...)方法)
4. 提取 Request 中的模型數據,填充 Handler 入參,開始執行Handler(Controller)。在填充 Handler 的入參過程中,根據你的配置,Spring 將幫你做一些額外的工作:
? ?(1)HttpMessageConveter:將請求消息(如:Json、xml 等數據)轉換成一個對象,將對象轉換為指定的響應信息;
? ?(2)數據轉換:對請求消息進行數據轉換。如:String 轉換成 Integer、Double 等;
? ?(3)數據格式化:對請求消息進行數據格式化。如:將字符串轉換成格式化數字或格式化日期等;
? ?(4)數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到 BindingResult 或 Error 中;
5. Handler 執行完成后,向 DispatcherServlet 返回一個 ModelAndView 對象;
6. 根據返回的 ModelAndView,選擇一個適合的 ViewResolver(必須是已經注冊到 Spring 容器中的 ViewResolver)返回給DispatcherServlet;?
7. ViewResolver 結合 Model 和 View,來渲染視圖;
8. 將渲染結果返回給客戶端。
3. SpringMVC的核心組件
-
前端控制器 DispatcherServlet
作用:Spring MVC 的入口函數。接收請求,響應結果,相當于轉發器,中央處理器。有了 DispatcherServlet 減少了其它組件之間的耦合度。用戶請求到達前端控制器,它就相當于 MVC 模式中的 C,DispatcherServlet 是整個流程控制的中心,由它調用其它組件處理用戶的請求,DispatcherServlet 的存在降低了組件之間的耦合性。
-
處理器映射器 HandlerMapping
作用:根據請求的 url 查找 Handler。HandlerMapping 負責根據用戶請求找到 Handler 即處理器(Controller),SpringMVC 提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,注解方式等。
-
處理器適配器 HandlerAdapter
作用:按照特定規則(HandlerAdapter 要求的規則)去執行 Handler。通過 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
-
處理器 Handler
注意:編寫 Handler 時按照 HandlerAdapter 的要求去做,這樣適配器才可以去正確執行 Handler。Handler 是繼 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下 Handler 對具體的用戶請求進行處理。由于 Handler 涉及到具體的用戶業務請求,所以一般情況需要工程師根據業務需求開發 Handler。
-
視圖解析器 View resolver
作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(View )。View Resolver 負責將處理結果生成 View 視圖,View Resolver 首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成 View 視圖對象,最后對 View 進行渲染將處理結果通過頁面展示給用戶。SpringMVC 框架提供了很多的 View 視圖類型,包括:jstlView、freemarkerView、pdfView 等。一般情況下需要通過頁面標簽或頁面模版技術將模型數據通過頁面展示給用戶,需要由工程師根據業務需求開發具體的頁面。
-
視圖 View
View 是一個接口,實現類支持不同的 View 類型(jsp、freemarker...)。
注意:處理器 Handler(也就是我們平常說的 Controller 控制器)以及視圖層 View 都是需要我們自己手動開發的。其他的一些組件比如:前端控制器 DispatcherServlet、處理器映射器 HandlerMapping、處理器適配器 HandlerAdapter 等等都是框架提供給我們的,不需要自己手動開發。4. 常用的注解
1. @RequestMapping:用于處理請求 url 映射的注解,可用于類或方法上。用于類上,則表示類中的所有響應請求的方法都是以該地址作為父路徑;
2. @RequestBody:注解實現接收 HTTP 請求的 json 數據,將 json 轉換為 Java 對象;
3. @ResponseBody:注解實現將 Controller 方法返回對象轉化為 json 對象響應給客戶。
5、@RequestMapping 的作用
? ? ? ?RequestMapping 是一個用來處理請求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。RequestMapping 注解有六個屬性,下面我們把它分成三類進行說明。
-
value、method:
1. value:指定請求的實際地址,指定的地址可以是 URI Template 模式;
2. method:指定請求的method類型, GET、POST、PUT、DELETE 等;
-
consumes、produces:
1. consumes:指定處理請求的提交內容類型(Content-Type),例如 application/json、text/html;
2. produces:指定返回的內容類型,僅當 request 請求頭中的(Accept)類型中包含該指定類型才返回;
-
params、header:
1. params:指定 request 中必須包含某些參數值是,才讓該方法處理。
2. headers:指定 request 中必須包含某些指定的 header 值,才能讓該方法處理請求。
6、如何解決 POST 請求中文亂碼問題,GET 的又如何處理
1.解決 POST 請求亂碼問題:在 web.xml 中配置一個 CharacterEncodingFilter 過濾器,設置成 utf-8;
2. GET 請求中文參數出現亂碼解決方法有兩個:
(1)修改 tomcat 配置文件添加編碼與工程編碼一致,如下:
<ConnectorURIEncoding="utf-8"?connectionTimeout="20000"?port="8080"?protocol="HTTP/1.1"?redirectPort="8443"/>(2)對參數進行重新編碼:
String?userName =?new?String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")7、SpringMVC 的控制器是不是單例模式,如果是會有什么問題,怎么解決?
? ? 是單例模式,所以在多線程訪問的時候有線程安全問題。但是不要使用同步,會影響性能,解決方案是在控制器里面不能寫字段。
8、SpringMVC 怎么樣設定重定向和轉發的?
1. 轉發:在返回值前面加 "forward:",例如:
"forward:user.do?name=method2"2. 重定向:在返回值前面加 "redirect:",例如:
"redirect:http://www.zju.com"?9、SpringMVC 里面攔截器是怎么寫的?
方法一:實現 HandlerInterceptor 接口;
方法二:繼承適配器類,接著在接口方法當中,實現處理邏輯,然后在 SpringMVC 的配置文件中配置攔截器即可。
10、SpringMVC 和 Struts2 的區別有哪些?
1. SpringMVC 的入口是一個 Servlet 即前端控制器(DispatchServlet),而 Struts2 入口是一個 filter 過慮器(StrutsPrepareAndExecuteFilter);
2. SpringMVC 是基于方法開發(一個 url 對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),Struts2 是基于類開發,傳遞參數是通過類的屬性,只能設計為多例;
3. Struts2 采用值棧存儲請求和響應的數據,通過 OGNL 存取數據;SpringMVC 通過參數解析器是將 request 請求內容解析,并給方法形參賦值,將數據和視圖封裝成 ModelAndView 對象,最后又將 ModelAndView 中的模型數據通過 request 域傳輸到頁面。jsp 視圖解析器默認使用 jstl。
參考:https://mp.weixin.qq.com/s/Yu52G2mgQzhJ3PNyAX8vag
總結
以上是生活随笔為你收集整理的SpringMVC相关面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OV7670 STM32驱动 YUYV格
- 下一篇: SpringMVC知识整理