有粉絲朋友去培訓機構了,花了兩三萬,結果了?
也沒學多少東西。
好多培訓機構都在盜我的專案,可惜我時間有限,沒時間追究他們。
其實培訓機構的東西就那樣,談不上不好,只是多個學習的氛圍。
很多的技術知識點、路線和專案我已經整理好了,幫你省去2w的費用。
首先看下整理的Java的學習路線:
這套路線包含了基礎到就業,基本是全棧的路線,有前端、後端、微服務、小程式、安卓。到最後手撕原始碼。
如果你能搞完,你就是大神中的大神了。
前面分享了一個Redis的面試題:
今天覆習下SpringMVC的面試題。
目錄
3,可以描述一下 DispatcherServlet 的工作流程嗎?
7,SpringMVC 制器是不是單例模式,如果是,有什麼問題,怎麼解決?
11,怎麼樣把ModelMap裡面的資料放入Session裡面?
Spring Web MVC 框架提供 模型-檢視-控制器 架構和隨時可用的元件,用於開發靈活且鬆散耦合的 Web 應用程式。
MVC 模式有助於分離應用程式的不同方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在所有這些元素之間提供鬆散耦合。
Web 容器啟動時會通知 Spring 初始化容器,載入 Bean 的定義資訊並初始化所有單例 Bean,然後遍歷容器中的 Bean,獲取每⼀個 Controller 中的所有⽅法存取的 URL,將 URL 和對應的 Controller 儲存 到⼀個 Map 集合中。
所有的請求會轉發給 DispatcherServlet 前端處理器處理,DispatcherServlet 會請求 HandlerMapping
找出容器中被Controler註解修飾的 Bean 以及被RequestMapping修飾的⽅法和類,⽣成Handler 和 HandlerInterceptor 並以⼀個 HandlerExcutionChain 處理器執⾏鏈的形式返回。
之後 DispatcherServlet 使⽤ Handler 找到對應的 HandlerApapter,通過 HandlerApapter 調⽤Handler 的⽅法,將請求引數繫結到⽅法的形參上,執⾏⽅法處理請求並得到 ModelAndView。
最後 DispatcherServlet 根據使⽤ ViewResolver 試圖解析器對得到的 ModelAndView 邏輯檢視進⾏解析得到 View 物理檢視,然後對檢視渲染,將資料填充到檢視中並返回給使用者端。
DispatcherServlet 的工作流程可以用一幅圖來說明:
1,向伺服器傳送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲。
2,DispatcherServlet 根據 -servlet.xml 中的設定對請求的 URL 進行解析,得到請求資源識別符號(URI)。然後根據該 URI,呼叫 HandlerMapping 獲得該 Handler 設定的所有相關的物件(包括 Handler 物件以及 Handler 物件對應的攔截器),最後以HandlerExecutionChain 物件的形式返回。
3,DispatcherServlet 根據獲得的Handler,選擇一個合適的 HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的 preHandler(…)方法)。
4,提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的設定,Spring 將幫你做一些額外的工作:
HttpMessageConveter:將請求訊息(如 Json、xml 等資料)轉換成一個物件,將物件轉換為指定的響應資訊。
資料轉換:對請求訊息進行資料轉換。如String轉換成Integer、Double等。
資料根式化:對請求訊息進行資料格式化。如將字串轉換成格式化數位或格式化日期等。
資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中。
5. Handler(Controller)執行完成後,向 DispatcherServlet 返回一個 ModelAndView 物件;
6. 根據返回的ModelAndView,選擇一個適合的 ViewResolver(必須是已經註冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。
7. ViewResolver 結合Model和View,來渲染檢視。
8. 檢視負責將渲染結果返回給使用者端。
DispatcherServlet :SpringMVC 中的前端控制器,是整個流程控制的核⼼,負責接收請求並轉發給對應的處理元件。
Handler :處理器,完成具體業務邏輯,相當於 Servlet 或 Action。
HandlerMapping :完成 URL 到 Controller 對映,DispatcherServlet 通過 HandlerMapping 將不同請求對映到不同 Handler。
HandlerInterceptor :處理器攔截器,是⼀個接⼝,如果需要完成⼀些攔截處理,可以實現該接⼝。
HandlerExecutionChain :處理器執⾏鏈,包括兩部分內容:Handler 和 HandlerInterceptor。
HandlerAdapter :處理器介面卡,Handler執⾏業務⽅法前需要進⾏⼀系列操作,包括表單資料驗證、資料型別轉換、將表單資料封裝到JavaBean等,這些操作都由 HandlerAdapter 完成。 DispatcherServlet 通過 HandlerAdapter 來執⾏不同的 Handler。
ModelAndView :裝載模型資料和檢視資訊,作為 Handler 處理結果返回給 DispatcherServlet。
ViewResolver :檢視解析器,DispatcherServlet 通過它將邏輯檢視解析為物理檢視,最終將渲染的結果響應給使用者端。
@Controller :在類定義處新增,將類交給IoC容器管理。
@RequtestMapping :將URL請求和業務⽅法對映起來,在類和⽅法定義上都可以新增該註解。 value 屬性指定URL請求的實際地址,是預設值。 method 屬性限制請求的⽅法型別,包括GET、POST、PUT、DELETE等。如果沒有使⽤指定的請求⽅法請求URL,會報405 Method Not Allowed 錯誤。 params 屬性限制必須提供的引數,如果沒有會報錯。
@RequestParam :如果 Controller ⽅法的形參和 URL 引數名⼀致可以不新增註解,如果不⼀致可以使⽤該註解繫結。 value 屬性表示HTTP請求中的引數名。 required 屬性設定引數是否必要,預設false。 defaultValue 屬性指定沒有給引數賦值時的預設值。
@PathVariable :Spring MVC ⽀持 RESTful ⻛格 URL,通過的繫結。
通過PathVariable完成請求引數與形參的繫結。
1,解決 POST 請求亂碼問題:在 web.xml 中設定一個 CharacterEncodingFilter 過濾器,設定成 utf-8 ;
GET 請求中出現中文亂碼,講真在url 中傳遞中文,就不是什麼明智之舉,最好不要這用做!
但是事情已經發生了,總得要解決的:
1,修改 Tomcat 組態檔;
2,在拼接 url 的時候先做一個編碼工作,然後將編碼後生成的 url 進行拼接,之後再傳送請求,然後再伺服器端拿到資料後做一次反編碼的工作;
3,最好就是定義一個字典,在傳送 url 的get 請求之前先查詢一下要拼接的 中文 欄位對應的字典值,然後用字典值進行傳輸,完事了再在伺服器端做解析;
是單例模式,之前在 Spring 篇章裡面有說過控制層和Service 層以及 DAO 層一般是無狀態的範例,不涉及資料的增刪改等操作,只有簡單的查詢操作,那麼就是執行緒安全的。
所以解決方案就是:在控制器裡面不要寫可變的狀態量,如果需要這些可變的狀態量,那麼可以通過 ThreadLocal 進行解決,為每個執行緒提供一個獨立的變數副本,進行資料操作。
通過 Jackson 框架可以將 Java 中的物件直接轉換為 json 物件:
1,加入 Jackson.jar 包;
2,在組態檔中設定 json 的對映;
3,在接受 ajax 方法裡面可以直接返回物件,但是需要使用 @ResponseBody 註解。
直接在方法的形參中宣告 request,SpringMVC 就自動把 request 物件傳入。
返回值可以有很多型別,有String,ModelAndView。ModelAndView類把檢視和資料都合併的一起的,但一般用String比較好。
可以在類上面加上@SessionAttributes註解,裡面包含的字串就是要放入session裡面的key。
(1)可以支援各種檢視技術,而不僅僅侷限於JSP;
(2)與Spring框架整合(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 請求到處理器對映(handlerMapping), 處理器介面卡(HandlerAdapter), 檢視解析器(ViewResolver)。
(4)支援各種請求資源的對映策略。
求個三連,點贊,收藏,更多幹貨的更新ing:
為了幫助大家快速麵試,整理了很多的面試乾貨題和專案。
👇🏻 乾貨可通過搜尋下方 公眾號 獲取👇🏻