動態

詳情 返回 返回

吃透SpringMVC面試八股文 - 動態 詳情

説説你對 SpringMVC 的理解

SpringMVC是一種基於 Java 的實現MVC設計模型的請求驅動類型的輕量級Web框架,屬於Spring框架的一個模塊。

它通過一套註解,讓一個簡單的Java類成為處理請求的控制器,而無須實現任何接口。同時它還支持RESTful編程風格的請求。

什麼是MVC模式?

MVC的全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,是一種軟件設計典範。它是用一種業務邏輯、數據與界面顯示分離的方法來組織代碼,將眾多的業務邏輯聚集到一個部件裏面,在需要改進和個性化定製界面及用户交互的同時,不需要重新編寫業務邏輯,達到減少編碼的時間。

View,視圖是指用户看到並與之交互的界面。比如由html元素組成的網頁界面,或者軟件的客户端界面。MVC的好處之一在於它能為應用程序處理很多不同的視圖。在視圖中其實沒有真正的處理髮生,它只是作為一種輸出數據並允許用户操縱的方式。

model,模型是指模型表示業務規則。在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的數據是中立的,模型與數據格式無關,這樣一個模型能為多個視圖提供數據,由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重複性。

controller,控制器是指控制器接受用户的輸入並調用模型和視圖去完成用户的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處理請求,然後再確定用哪個視圖來顯示返回的數據。

SpringMVC 有哪些優點?

  1. 與 Spring 集成使用非常方便,生態好。
  2. 配置簡單,快速上手。
  3. 支持 RESTful 風格。
  4. 支持各種視圖技術,支持各種請求資源映射策略。

本文已經收錄到Github倉庫,該倉庫包含計算機基礎、Java基礎、多線程、JVM、數據庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分佈式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~

Github地址

如果訪問不了Github,可以訪問gitee地址。

gitee地址

Spring MVC和Struts的區別

  1. Spring MVC是基於方法開發,Struts2是基於類開發的。

    • Spring MVC會將用户請求的URL路徑信息與Controller的某個方法進行映射,所有請求參數會注入到對應方法的形參上,生成Handler對象,對象中只有一個方法;
    • Struts每處理一次請求都會實例一個Action,Action類的所有方法使用的請求參數都是Action類中的成員變量,隨着方法增多,整個Action也會變得混亂。
  2. Spring MVC支持單例開發模式,Struts只能使用多例

    • Struts由於只能通過類的成員變量接收參數,故只能使用多例。
  3. Struts2 的核心是基於一個Filter即StrutsPreparedAndExcuteFilter,Spring MVC的核心是基於一個Servlet即DispatcherServlet(前端控制器)。
  4. Struts處理速度稍微比Spring MVC慢,Struts使用了Struts標籤,加載數據較慢。

Spring MVC的工作原理

Spring MVC的工作原理如下:

  1. DispatcherServlet 接收用户的請求
  2. 找到用於處理request的 handler 和 Interceptors,構造成 HandlerExecutionChain 執行鏈
  3. 找到 handler 相對應的 HandlerAdapter
  4. 執行所有註冊攔截器的preHandler方法
  5. 調用 HandlerAdapter 的 handle() 方法處理請求,返回 ModelAndView
  6. 倒序執行所有註冊攔截器的postHandler方法
  7. 請求視圖解析和視圖渲染

Spring MVC的主要組件?

  • 前端控制器(DispatcherServlet):接收用户請求,給用户返回結果。
  • 處理器映射器(HandlerMapping):根據請求的url路徑,通過註解或者xml配置,尋找匹配的Handler。
  • 處理器適配器(HandlerAdapter):Handler 的適配器,調用 handler 的方法處理請求。
  • 處理器(Handler):執行相關的請求處理邏輯,並返回相應的數據和視圖信息,將其封裝到ModelAndView對象中。
  • 視圖解析器(ViewResolver):將邏輯視圖名解析成真正的視圖View。
  • 視圖(View):接口類,實現類可支持不同的View類型(JSP、FreeMarker、Excel等)。

Spring MVC的常用註解由有哪些?

  • @Controller:用於標識此類的實例是一個控制器。
  • @RequestMapping:映射Web請求(訪問路徑和參數)。
  • @ResponseBody:註解返回數據而不是返回頁面
  • @RequestBody:註解實現接收 http 請求的 json 數據,將 json 數據轉換為 java 對象。
  • @PathVariable:獲得URL中路徑變量中的值
  • @RestController:@Controller+@ResponseBody
  • @ExceptionHandler標識一個方法為全局異常處理的方法。

@Controller 註解有什麼用?

@Controller 註解標記一個類為 Spring Web MVC 控制器。Spring MVC 會將掃描到該註解的類,然後掃描這個類下面帶有 @RequestMapping 註解的方法,根據註解信息,為這個方法生成一個對應的處理器對象,在上面的 HandlerMapping 和 HandlerAdapter組件中講到過。

當然,除了添加 @Controller 註解這種方式以外,你還可以實現 Spring MVC 提供的 Controller 或者 HttpRequestHandler 接口,對應的實現類也會被作為一個處理器對象

本文已經收錄到Github倉庫,該倉庫包含計算機基礎、Java基礎、多線程、JVM、數據庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分佈式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~

Github地址:https://github.com/Tyson0314/Java-learning

@RequestMapping 註解有什麼用?

@RequestMapping 註解,用於配置處理器的 HTTP 請求方法,URI等信息,這樣才能將請求和方法進行映射。這個註解可以作用於類上面,也可以作用於方法上面,在類上面一般是配置這個控制器的 URI 前綴。

@RestController 和 @Controller 有什麼區別?

@RestController 註解,在 @Controller 基礎上,增加了 @ResponseBody 註解,更加適合目前前後端分離的架構下,提供 Restful API ,返回 JSON 數據格式。

@RequestMapping 和 @GetMapping 註解有什麼不同?

  1. @RequestMapping:可註解在類和方法上;@GetMapping 僅可註冊在方法上
  2. @RequestMapping:可進行 GET、POST、PUT、DELETE 等請求方法;@GetMapping@RequestMapping 的 GET 請求方法的特例。

@RequestParam 和 @PathVariable 兩個註解的區別

兩個註解都用於方法參數,獲取參數值的方式不同,@RequestParam 註解的參數從請求攜帶的參數中獲取,而 @PathVariable 註解從請求的 URI 中獲取

@RequestBody和@RequestParam的區別

@RequestBody一般處理的是在ajax請求中聲明contentType: "application/json; charset=utf-8"時候。也就是json數據或者xml數據。

@RequestParam一般就是在ajax裏面沒有聲明contentType的時候,為默認的x-www-form-urlencoded格式時。

Spring MVC的異常處理

可以將異常拋給Spring框架,由Spring框架來處理;我們只需要配置簡單的異常處理器,在異常處理器中添視圖頁面即可。

  • 使用系統定義好的異常處理器 SimpleMappingExceptionResolver
  • 使用自定義異常處理器
  • 使用異常處理註解

好東西應該要分享出來!我把自己學習計算機多年以來的書籍分享出來了,彙總到一個計算機經典編程書籍倉庫了,一共300多本,包括C語言、C++、Java、Python、前端、數據庫、操作系統、計算機網絡、數據結構和算法、機器學習、編程人生等,可以star一下,下次找書直接在上面搜索,倉庫持續更新中~

Github地址

SpringMVC 用什麼對象從後台向前台傳遞數據的?

  1. 將數據綁定到 request;
  2. 返回 ModelAndView;
  3. 通過ModelMap對象,可以在這個對象裏面調用put方法,把對象加到裏面,前端就可以通過el表達式拿到;
  4. 綁定數據到 Session中。

SpringMvc的Controller是不是單例模式?

單例模式。在多線程訪問的時候有線程安全問題,解決方案是在控制器裏面不要寫可變狀態量,如果需要使用這些可變狀態,可以使用ThreadLocal,為每個線程單獨生成一份變量副本,獨立操作,互不影響。

介紹下 Spring MVC 攔截器?

Spring MVC 攔截器對應HandlerInterceor接口,該接口位於org.springframework.web.servlet的包中,定義了三個方法,若要實現該接口,就要實現其三個方法:

  1. 前置處理(preHandle()方法):該方法在執行控制器方法之前執行。返回值為Boolean類型,如果返回false,表示攔截請求,不再向下執行,如果返回true,表示放行,程序繼續向下執行(如果後面沒有其他Interceptor,就會執行controller方法)。所以此方法可對請求進行判斷,決定程序是否繼續執行,或者進行一些初始化操作及對請求進行預處理。
  2. 後置處理(postHandle()方法):該方法在執行控制器方法調用之後,且在返回ModelAndView之前執行。由於該方法會在DispatcherServlet進行返回視圖渲染之前被調用,所以此方法多被用於處理返回的視圖,可通過此方法對請求域中的模型和視圖做進一步的修改。
  3. 已完成處理(afterCompletion()方法):該方法在執行完控制器之後執行,由於是在Controller方法執行完畢後執行該方法,所以該方法適合進行一些資源清理,記錄日誌信息等處理操作。

可以通過攔截器進行權限檢驗,參數校驗,記錄日誌等操作

SpringMvc怎麼配置攔截器?

有兩種寫法,一種是實現HandlerInterceptor接口,另外一種是繼承適配器類,接着在接口方法當中,實現處理邏輯;然後在SpringMvc的配置文件中配置攔截器即可:

<!-- 配置SpringMvc的攔截器 -->
<mvc:interceptors>
    <bean id="myInterceptor" class="com.dabin.MyHandlerInterceptor"></bean>
 
    <!-- 只攔截部分請求 -->
    <mvc:interceptor>
       <mvc:mapping path="/xxx.do" />
       <bean class="com.dabin.MyHandlerInterceptorAdapter" />
    </mvc:interceptor>
</mvc:interceptors>

Spring MVC 的攔截器和 Filter 過濾器有什麼差別?

有以下幾點:

  • 功能相同:攔截器和 Filter 都能實現相應的功能
  • 容器不同:攔截器構建在 Spring MVC 體系中;Filter 構建在 Servlet 容器之上
  • 使用便利性不同:攔截器提供了三個方法,分別在不同的時機執行;過濾器僅提供一個方法

什麼是REST?

REST,英文全稱,Resource Representational State Transfer,對資源的訪問狀態的變化通過url的變化表述出來。

Resource:資源。資源是REST架構或者説整個網絡處理的核心。

Representational:某種表現形式,比如用JSON,XML,JPEG等。

State Transfer:狀態變化。通過HTTP method實現。

REST描述的是在網絡中client和server的一種交互形式。用大白話來説,就是通過URL就知道要什麼資源,通過HTTP method就知道要幹什麼,通過HTTP status code就知道結果如何

舉個例子:

GET /tasks 獲取所有任務
POST /tasks 創建新任務
GET /tasks/{id} 通過任務id獲取任務
PUT /tasks/{id} 更新任務
DELETE /tasks/{id} 刪除任務

GET代表獲取一個資源,POST代表添加一個資源,PUT代表修改一個資源,DELETE代表刪除一個資源。

server提供的RESTful API中,URL中只使用名詞來指定資源,原則上不使用動詞。用HTTP Status Code傳遞server的狀態信息。比如最常用的 200 表示成功,500 表示Server內部錯誤等。

使用REST有什麼優勢呢?

第一,風格統一了,不會出現delUser/deleteUser/removeUser各種命名的代碼了。

第二,面向資源,一目瞭然,具有自解釋性。

第三,充分利用 HTTP 協議本身語義


最後給大家分享一個Github倉庫,上面有大彬整理的300多本經典的計算機書籍PDF,包括C語言、C++、Java、Python、前端、數據庫、操作系統、計算機網絡、數據結構和算法、機器學習、編程人生等,可以star一下,下次找書直接在上面搜索,倉庫持續更新中~

Github地址:https://github.com/Tyson0314/java-books

Add a new 評論

Some HTML is okay.