SpringMVC常見經典面試題

SpringMVC常見經典面試題

1. Springmvc 工作原理是什麼?

  • 客戶端發送請求到 DispatcherServlet
  • DispatcherServlet 查詢 handlerMapping 找到處理請求的 Controller
  • Controller 調用業務邏輯後,返回 ModelAndView
  • DispatcherServlet 查詢 ModelAndView,找到指定視圖
  • 視圖將結果返回到客戶端

2. Springmvc 執行流程是什麼?

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

img


3. Springmvc 中如何解決 GET | POST請求中文亂碼問題?

  • GET方式:

    • 每次發生請求之前對URL進行編碼:

      例如:Location.href="/encodeURI"(“http://localhost/test/s?name=中文&sex=女”);

    • 更簡便的方法,在服務器端配置URL編碼格式:修改tomcat的配置文件server.xml:

      只需增加 URIEncoding=“UTF-8” 這一句,然後重啓tomcat即可。

      <ConnectorURIEncoding="UTF-8" 
          port="8080"  maxHttpHeaderSize="8192"  maxThreads="150" 
          minSpareThreads="25"  maxSpareThreads="75"connectionTimeout="20000" 		
          disableUploadTimeout="true" URIEncoding="UTF-8" />
      
  • POST方式:

    可以每次在request解析數據時設置編碼格式:request.setCharacterEncoding(“utf-8”);

    也可以使用編碼過濾器來解決,最常用的方法是使用Spring提供的編碼過濾器:

    在Web.xml中增加如下配置(要注意的是它的位置一定要是第一個執行的過濾器):

    <filter>
        <filter-name>charsetFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    

    該過濾器要做的其實就是強制爲所有請求和響應設置編碼格式:

    request.setCharacterEncoding(“utf-8”);
    response.setCharacterEncoding(“utf-8”);


4. Springmvc 怎麼樣設定重定向和轉發的?

  • 在返回值前面加"forward:“就可以讓結果轉發,譬如"forward:user.do?name=method4”
  • 在返回值前面加"redirect:“就可以讓返回值重定向,譬如"redirect:http://www.baidu.com

5. Springmvc 怎麼和AJAX相互調用的?

通過Jackson框架就可以把Java裏面的對象直接轉化成Js可以識別的Json對象。具體步驟如下 :

  • 加入Jackson.jar
  • 在配置文件中配置json的映射
  • 在接受Ajax方法裏面可以直接返回Object,List等,但方法前面要加上@ResponseBody註解。

6. Springmvc 如何做異常處理 ?

可以將異常拋給Spring框架,由Spring框架來處理;自定義實現spring的全局異常解析器HandlerExceptionResolver,在異常處理器中添視圖頁面即可。


7. Springmvc 的控制器是不是單例模式,如果是,有什麼問題,怎麼解決?

  • 是單例模式,所以在多線程訪問的時候有線程安全問題,不要用同步,會影響性能的,解決方案是在控制器裏面不能寫字段。

8. Springmvc 中 如果攔截get方式提交的方法,怎麼配置?

  • 可以在@RequestMapping註解裏面加上method=RequestMethod.GET

9. Springmvc 怎麼樣把ModelMap裏面的數據放入Session裏面?

  • 可以在類上面加上@SessionAttributes註解,裏面包含的字符串就是要放入session裏面的key。

10. Springmvc 中系統如何分層 ?

系統分爲表現層(UI):數據的展現,操作頁面,請求轉發。
業務層(服務層):封裝業務處理邏輯
持久層(數據訪問層):封裝數據訪問邏輯

各層之間的關係: 表示層通過接口調用業務層,業務層通過接口調用持久層,這樣,當下一層發生變化改變,不影響上一層的數據。 MVC是一種表現層的架構

img


11. Springmvc 和struts2的區別有哪些?

  • springmvc的入口是一個servlet即前端控制器(DispatchServlet),而struts2入口是一個filter過慮器(StrutsPrepareAndExecuteFilter)。
  • springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計爲多例。
  • Struts採用值棧存儲請求和響應的數據,通過OGNL存取數據,springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl。

12. Springmvc 用什麼對象從後臺向前臺傳遞數據的?

答:通過ModelMap對象,可以在這個對象裏面用put方法,把對象加到裏面,前臺就可以通過el表達式拿到。


13. springmvc 中當一個方法向AJAX返回特殊對象,譬如Object,List等,需要做什麼處理?

  • 要加上@ResponseBody註解。

14. Springmvc 中對於文件的上傳有哪些需要注意

  • 在頁面form中提交enctype="multipart/form-data"的數據時,需要springmvc對multipart類型的數據進行解析。
  • 在springmvc.xml中配置multipart類型解析器。
  • 方法中使用:MultipartFile attach (單個文件上傳) 或者 MultipartFile[] attachs (多個文件上傳)

15. Springmvc 中攔截器如何使用

  • 定義攔截器,實現HandlerInterceptor接口。接口中提供三個方法。
    • preHandle :進入 Handler方法之前執行,用於身份認證、身份授權,比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
    • postHandle:進入Handler方法之後,返回modelAndView之前執行,應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一指定視圖
    • afterCompletion:執行Handler完成執行此方法,應用場景:統一異常處理,統一日誌處理
  • 攔截器配置
    • 針對HandlerMapping配置(不推薦):springmvc攔截器針對HandlerMapping進行攔截設置,如果在某個HandlerMapping中配置攔截,經過該 HandlerMapping映射成功的handler最終使用該 攔截器。(一般不推薦使用)
    • 類似全局的攔截器:springmvc配置類似全局的攔截器,springmvc框架將配置的類似全局的攔截器注入到每個HandlerMapping中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章