Java Web 面試中關於Spring MVC必問題,不看血虧!

前言

Spring MVC是Spring構建在Servlet API上的Web框架。目前大部分的Java Web 開發已經使用Spring MVC 來作。它提供了模型 - 視圖 - 控制器架構,可用於開發靈活的Web應用程序。在本教程中,咱們將重點關注與之相關的問題,由於它一般是Spring開發人員面試的主題。前端

爲何選擇Spring MVC

Spring MVC 實現了一些明確並且相對低耦合的概念,可讓開發者很容易開發和測試他們的Web應用。這些概念有:java

  • Dispatcher Servlet ——核心Servlet前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要本身定義,把攔截下來的請求,依據相應的規則分發到目標Controller來處理
  • Controllers ——具體的業務控制器,處理具體請求的業務並響應
  • View Resolvers ——視圖解析器,用於將響應的邏輯視圖解析爲真正的視圖View對象
  • Views, Models ——Views的主要做用是用於處理響應視圖,而後返回給客戶端,Models主要用於傳遞控制方法處理數據到響應視圖頁面
  • ModelAndView ——Model 和 View 的複合體
  • Model and Session Attributes ——對模型屬性和會話屬性的處理

這些概念都是徹底獨立並且職責單一。所以Spring MVC給了咱們很大的靈活性。它基於接口(提供的實現類),咱們可使用自定義接口配置框架的每一個部分。另外一個重要的事情是咱們再也不依賴於特定的視圖技術(例如,JSP),能夠選擇咱們最複合業務的視圖技術。此外,咱們不只僅在Web應用程序開發中使用Spring MVC,也能夠用它建立RESTful Web服務。web

SpringMVC的流程

  1. 用戶發送請求至前端控制器DispatcherServlet;
  2. DispatcherServlet收到請求後,調用HandlerMapping處理器映射器,請求獲取Handle;
  3. 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(若是有)一併返回給DispatcherServlet;
  4. DispatcherServlet 調用 HandlerAdapter處理器適配器;
  5. HandlerAdapter 通過適配調用 具體處理器(Handler,也叫後端控制器);
  6. Handler執行完成返回ModelAndView;
  7. HandlerAdapter將Handler執行結果ModelAndView返回給DispatcherServlet;
  8. DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進行解析;
  9. ViewResolver解析後返回具體View;
  10. DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)
  11. DispatcherServlet響應用戶。

流程圖:面試

@Autowired 註解的規則是什麼

@Autowired註解可使用在成員屬性上或方法上,按類型注入Spring bean。這個註解容許Spring解析協做的bean並注入到你業務須要的bean中。spring

簡述一下註解ModelAttribute

@ModelAttribute註解是Spring MVC中最重要的註解之一。它將方法參數或方法返回值綁定到命名中的Model屬性中,而後將其公開給Web視圖。若是咱們在方法級別使用它,則代表該方法的目的是添加一個或多個模型屬性。另外一方面,當用做方法參數時,它表示應從模型中檢索參數。若是不存在,咱們應該首先實例化它,而後將其添加到Model中。一旦出如今模型中,咱們應該填充全部具備匹配名稱的請求參數的參數字段。segmentfault

@Controller和@RestController之間有什麼區別

@Controller@RestController註釋之間的主要區別在於@ResponseBody註釋自動包含在@RestController中。這意味着咱們不須要使用@ResponseBody來註釋咱們的處理程序方法。後端

描述一下 @PathVariable

咱們可使用@PathVariable註解來從請求URI中提取一個特定模版變量的值來做爲咱們的請求參數。例如 從/user/123提取123/user/{id}控制器來獲取一個id=123的數據映射關係。須要特別指出的是經過此註解獲取的值不會被編碼。具體可經過個人文章來獲取緣由。api

如何在Spring MVC中校驗參數

Spring MVC 默認支持JSR-303校驗規範 。並在Spring-Boot-starter-web中提供了JSR-303規範實現Hibernate Validator。咱們可使用它來進行參數校驗。詳情可查看個人文章。跨域

@RequestBody 和 @ResponseBody 是幹嗎用的

  • @RequestBody註解用於控制器方法參數上,目的是將Http 請求體轉換爲領域對象(請求參數)。Spring 經過HttpMessageConverter將請求體反序列化到Java對象中,默認使用jackson類庫反序列化。
  • @ResponseBody註解使用於Spring MVC控制器中的處理程序方法上,它代表咱們將把方法的返回類型直接寫入HTTP響應主體而不會將它放在Model中,一樣不會將其解釋爲視圖名稱。

Spring MVC 攔截器有什麼用怎麼用

Spring MVC攔截器容許咱們攔截客戶端請求並在三個地方處理它 - 在處理以前,處理以後或完成以後(在呈現視圖時)。攔截器切面處理一些公共邏輯而避免重複處理程序代碼(如日誌記錄),也能夠用來更改Spring模型中全局使用的參數。經過如下方式:架構

  • org.springframework.web.servlet.handler.HandlerInterceptorAdapter ——繼承該類
  • org.springframework.web.servlet.HandlerInterceptor ——實現該接口

如何全局處理控制器異常?

經過@ControllerAdvice(也可以使用@RestControllerAdvice)註解和@ExceptionHandler註解組合,經過在方法入參中捕獲異常進行處理,舉例以下:

@Slf4j
@RestControllerAdvice("cn.felord.manage.api")
public class GlobalExceptionControllerAdvice {

    @ExceptionHandler(NullPointerException.class)
    public Rest nullPointHandler(HttpServletRequest request, NullPointerException e) {
        log.error("空指針啦,趕忙關注公衆號:Felordcn", e);
        return RestBody.failure(-1, "null point exception");
    }
}

如何處理Spring MVC 中的跨域問題?

Spring MVC 解決跨域問題主要有如下種辦法:

  • 經過Spring MVC 攔截器來處理,同理servlet中的filter也能夠處理。
  • 經過在控制層方法使用@CrossOrigin註解。 請注意該方案須要在Spring MVC 4.x 以上。
  • 經過在Spring MVC xml配置文件中的<mvc:cors> 標籤中配置。
  • 經過WebMvcConfigurer#addCorsMappings(CorsRegistry)來配置。

若是想具體深刻可經過公衆號:Felordcn 來獲取具體的教程。

如何格式化Spring MVC如參參數?

通常可經過兩種方式:

  • 實現org.springframework.core.convert.converter.Converter<S,T> ,並將實現注入Spring容器中。
  • 實現org.springframework.format.Formatter<T> ,並將實現注入Spring 容器中。

關注公衆號:碼農小胖哥 獲取更多資訊

相關文章
相關標籤/搜索