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響應用戶。
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是一種表現層的架構
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中