今天是劉小愛自學Java的第126天。
感謝你的觀看,謝謝你。
Java應用現在基本都是web應用,而Web層自然就是web應用中非常重要的部分了。
如果說我們前面學的mybatis對應著Dao層,spring對應著Service層。
那springMVC就對應著Web層,它是spring框架為Web層提供的一個Web框架。
我們以前是直接在Web層中創建servlet,使用框架比其更加地強大,本質上差不多。
學習內容安排如下:
Web層的MVC設計理念。
springMVC架構流程圖。
springMVC入門程序的編寫,同時再結合代碼畫下其運行流程圖。
今天主要是學習其運行流程,代碼后續能進一步優化,明天接著學。
一、springMVC概述
springMVC重點是后面的MVC,MVC是web層的設計理念,更重點就是MVC中的C:
①控制器(Controller)
當用戶發來請求時,控制器調用②來處理,再選擇對應的視圖展示給用戶看,也就是③
它能起到總調度的作用,控制器通常由框架實現,使用時基本不需要編寫代碼。
②模型(Model)
通常分為數據模型和業務模型:
數據模型用來存放業務數據。簡單的理解就是我在Java中用什么來存數據?是用某個對象、用Map集合、還是字符串就可以?
業務模型包含應用的業務操作。比如用戶的登錄、注冊……等各種業務,通常由Java開發人員編寫完成,代碼量最多。
③視圖(View)
視圖根據處理后的數據,用自己的方式展現對應頁面給用戶,通常由前端和Java開發人員共同完成,代碼量較多。
springMVC架構
springMVC進一步細分了MVC,先做個大致了解,文章后面有詳細的代碼+畫圖說明:
①發送請求到DispatcherServlet控制器。
②控制器根據請求路徑到映射器查詢具體的Handler處理器。
③映射器根據用戶請求查找與之對應的處理器執行鏈再回傳給控制器。
④控制器根據映射器返回的結果調用HandlerAdapter適配器。
⑤適配器調用具體的處理器處理業務并返回ModelAndView到控制器。
⑥控制器將ModelAndView傳遞到ViewResolver視圖解析器。
⑦視圖解析器返回具體的視圖到控制器。
⑧控制器渲染視圖后響應給用戶。
二、springMVC程序編寫
直接在父工程上創建一個子工程,因為我們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核心配置文件的方式一樣,只不過文件所在目錄不一樣:
①配置映射器
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也就變化了。
三、springMVC流程解析
做個測試,同時再梳理一遍其運行流程:
1控制器說明
通過流程圖我們其實可以發現,控制器就是起到一個調度的作用:
很多事情都要問它怎么做,但它自己不做都是交給映射器、適配器、視圖解析器做。
所以控制器叫DispatcherServlet,其中的Dispatcher本身也就是調度的意思。
2映射器說明
HandlerMapping,看它的名字就知道是來找處理器(Handler)的,那怎么找到呢?
BeanNameUrlHandlerMapping,看名字就是根據請求url的路徑找對應的控制器。
3適配器說明
映射器只是找到了處理器,而這個處理器怎么用,還需要適配器去調用才行。
4處理器說明
處理器有一個name或者id屬性來表明自己的身份,不然映射器怎么找到你?
同時對應Java中的一個處理器類,要處理具體的業務,返回ModelAndView,也就是視圖和數據模型。
5視圖解析器
根據視圖名,加上前綴和后綴,找到對應路徑下的視圖文件,例子中就是hello.jsp
最后
代碼可以簡化,明天繼續學習。
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。