一、springMVC概述
二、springMVC程式編寫
三、springMVC流程解析
最後
今天是劉小愛自學Java的第126天。
感謝你的觀看,謝謝你。
Java應用現在基本都是web應用,而Web層自然就是web應用中非常重要的部分了。
如果說我們前面學的mybatis對應着Dao層,spring對應着Service層。
那springMVC就對應着Web層,它是spring架構為Web層提供的一個Web架構。
我們以前是直接在Web層中建立servlet,使用架構比其更加地強大,本質上差不多。
學習内容安排如下:
Web層的MVC設計理念。
springMVC架構流程圖。
springMVC入門程式的編寫,同時再結合代碼畫下其運作流程圖。
今天主要是學習其運作流程,代碼後續能進一步優化,明天接着學。
springMVC重點是後面的MVC,MVC是web層的設計理念,更重點就是MVC中的C:
①控制器(Controller)
當使用者發來請求時,控制器調用②來處理,再選擇對應的視圖展示給使用者看,也就是③
它能起到總排程的作用,控制器通常由架構實作,使用時基本不需要編寫代碼。
②模型(Model)
通常分為資料模型和業務模型:
資料模型用來存放業務資料。簡單的了解就是我在Java中用什麼來存資料?是用某個對象、用Map集合、還是字元串就可以?
業務模型包含應用的業務操作。比如使用者的登入、注冊……等各種業務,通常由Java開發人員編寫完成,代碼量最多。
③視圖(View)
視圖根據處理後的資料,用自己的方式展現對應頁面給使用者,通常由前端和Java開發人員共同完成,代碼量較多。
springMVC架構
springMVC進一步細分了MVC,先做個大緻了解,文章後面有詳細的代碼+畫圖說明:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-zzbCdgcN-1597708829773)(https://static01.imgkr.com/temp/1ec9b7a894604666bbd179e50c4dae84.png )]
①發送請求到DispatcherServlet控制器。
②控制器根據請求路徑到映射器查詢具體的Handler處理器。
③映射器根據使用者請求查找與之對應的處理器執行鍊再回傳給控制器。
④控制器根據映射器傳回的結果調用HandlerAdapter擴充卡。
⑤擴充卡調用具體的處理器處理業務并傳回ModelAndView到控制器。
⑥控制器将ModelAndView傳遞到ViewResolver視圖解析器。
⑦視圖解析器傳回具體的視圖到控制器。
⑧控制器渲染視圖後響應給使用者。
直接在父工程上建立一個子工程,因為我們Web項目,是以設定打包方式為war,再配置web.xml檔案,項目最終結構圖如下:
具體建立步驟以前講過幾次了,不再贅述。
1配置控制器
在web.xml配置檔案中配置:
這個就是servlet的xml配置。
以前是自己寫一個servlet,然後填入其全限定名,現在直接使用springMVC中的即可。
其中*.do表示接受以.do結尾的請求路徑。
這個.do是一個約定俗成的規範,就好比我們建立service層的類都是xxxService一樣。
2配置映射器和擴充卡
springmvc架構預設讀取/WEB-INF/{servlet-name}-servlet.xml這個配置檔案。
因為我們在web.xml中的servlet-name配置的是springMVC,是以在WEB-INF目錄下建立springMVC-servlet.xml檔案。
和建立spring核心配置檔案的方式一樣,隻不過檔案所在目錄不一樣:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-IlVU94uK-1597708829781)(https://static01.imgkr.com/temp/aaa8aa976a44446f9118d542e557a841.png )]
①配置映射器
BeanNameUrlHandlerMapping,映射器的一個子類,交給spring容器管理。
我們看這個類的名字就可以了解其作用:根據請求url找到對應的Handler。
②配置擴充卡
SimpleControllerHandlerAdapter,擴充卡的一個子類,交給spring容器管理。
③配置處理器
需要我們自己建立一個對應的類,就相當于我們以前建立的servlet,name值對應請求路徑。
④配置視圖解析器
InternalResourceViewResolver,視圖解析器的一個子類,交給spring容器管理:
prefix:字首名,指定視圖的位置。
suffix:字尾名,這裡是jsp檔案。
3處理器代碼和視圖頁面編寫
在Java中建立一個類HelloController,名稱一般都是控制器作為字尾,但它其實是一個處理器,其實作了控制器接口。
①ModelAndView
資料模型和視圖模型:
這裡的資料模型就是一個鍵值對:msg就是key,後面的為value。
這裡的視圖是hello.jsp檔案,為了規範該檔案是放在WEB-INF/view目錄下的。
view目錄就是專門用來存放各種視圖檔案的,總之要和視圖解析器中配置的字首一緻。
②設定視圖名稱
通過setViewName()方法設定視圖名。
③設定視圖内容
通過setaddObject()方法指定視圖的内容,也就是資料模型,設定好後将視圖和模型傳回。
在Java代碼中本身是無法直接對jsp檔案進行修改的,我們隻能設定一個鍵值對,然後在jsp檔案中通過el表達式動态擷取。
上述jsp中的${msg}就是擷取msg對應的值,在Java中将msg的值修改,jsp也就變化了。
做個測試,同時再梳理一遍其運作流程:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-le9VJtkC-1597708829784)(https://static01.imgkr.com/temp/2a2cb26fa60d4a9f91a4b3da2aaea037.png )]
1控制器說明
通過流程圖我們其實可以發現,控制器就是起到一個排程的作用:
很多事情都要問它怎麼做,但它自己不做都是交給映射器、擴充卡、視圖解析器做。
是以控制器叫DispatcherServlet,其中的Dispatcher本身也就是排程的意思。
2映射器說明
HandlerMapping,看它的名字就知道是來找處理器(Handler)的,那怎麼找到呢?
BeanNameUrlHandlerMapping,看名字就是根據請求url的路徑找對應的控制器。
3擴充卡說明
映射器隻是找到了處理器,而這個處理器怎麼用,還需要擴充卡去調用才行。
4處理器說明
處理器有一個name或者id屬性來表名自己的身份,不然映射器怎麼找到你?
同時對應Java中的一個處理器類,要處理具體的業務,傳回ModelAndView,也就是視圖和資料模型。
5視圖解析器
根據視圖名,加上字首和字尾,找到對應路徑下的視圖檔案,例子中就是hello.jsp
代碼可以簡化,明天繼續學習。
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。