今天是劉小愛自學(xué)Java的第126天。
感謝你的觀看,謝謝你。
Java應(yīng)用現(xiàn)在基本都是web應(yīng)用,而Web層自然就是web應(yīng)用中非常重要的部分了。
如果說我們前面學(xué)的mybatis對應(yīng)著Dao層,spring對應(yīng)著Service層。
那springMVC就對應(yīng)著Web層,它是spring框架為Web層提供的一個Web框架。
我們以前是直接在Web層中創(chuàng)建servlet,使用框架比其更加地強大,本質(zhì)上差不多。
學(xué)習(xí)內(nèi)容安排如下:
springMVC重點是后面的MVC,MVC是web層的設(shè)計理念,更重點就是MVC中的C:
①控制器(Controller)
當(dāng)用戶發(fā)來請求時,控制器調(diào)用②來處理,再選擇對應(yīng)的視圖展示給用戶看,也就是③
它能起到總調(diào)度的作用,控制器通常由框架實現(xiàn),使用時基本不需要編寫代碼。
②模型(Model)
通常分為數(shù)據(jù)模型和業(yè)務(wù)模型:
數(shù)據(jù)模型用來存放業(yè)務(wù)數(shù)據(jù)。簡單的理解就是我在Java中用什么來存數(shù)據(jù)?是用某個對象、用Map集合、還是字符串就可以?
業(yè)務(wù)模型包含應(yīng)用的業(yè)務(wù)操作。比如用戶的登錄、注冊……等各種業(yè)務(wù),通常由Java開發(fā)人員編寫完成,代碼量最多。
③視圖(View)
視圖根據(jù)處理后的數(shù)據(jù),用自己的方式展現(xiàn)對應(yīng)頁面給用戶,通常由前端和Java開發(fā)人員共同完成,代碼量較多。
springMVC架構(gòu)
springMVC進一步細(xì)分了MVC,先做個大致了解,文章后面有詳細(xì)的代碼+畫圖說明:
①發(fā)送請求到DispatcherServlet控制器。
②控制器根據(jù)請求路徑到映射器查詢具體的Handler處理器。
③映射器根據(jù)用戶請求查找與之對應(yīng)的處理器執(zhí)行鏈再回傳給控制器。
④控制器根據(jù)映射器返回的結(jié)果調(diào)用HandlerAdapter適配器。
⑤適配器調(diào)用具體的處理器處理業(yè)務(wù)并返回ModelAndView到控制器。
⑥控制器將ModelAndView傳遞到ViewResolver視圖解析器。
⑦視圖解析器返回具體的視圖到控制器。
⑧控制器渲染視圖后響應(yīng)給用戶。
直接在父工程上創(chuàng)建一個子工程,因為我們Web項目,所以設(shè)置打包方式為war,再配置web.xml文件,項目最終結(jié)構(gòu)圖如下:
具體創(chuàng)建步驟以前講過幾次了,不再贅述。
1配置控制器
在web.xml配置文件中配置:
這個就是servlet的xml配置。
以前是自己寫一個servlet,然后填入其全限定名,現(xiàn)在直接使用springMVC中的即可。
其中*.do表示接受以.do結(jié)尾的請求路徑。
這個.do是一個約定俗成的規(guī)范,就好比我們創(chuàng)建service層的類都是xxxService一樣。
2配置映射器和適配器
springmvc默認(rèn)讀取/WEB-INF/{servlet-name}-servlet.xml這個配置文件。
因為我們在web.xml中的servlet-name配置的是springMVC,所以在WEB-INF目錄下創(chuàng)建springMVC-servlet.xml文件。
和創(chuàng)建spring核心配置文件的方式一樣,只不過文件所在目錄不一樣:
①配置映射器
BeanNameUrlHandlerMapping,映射器的一個子類,交給spring容器管理。
我們看這個類的名字就可以理解其作用:根據(jù)請求url找到對應(yīng)的Handler。
②配置適配器
SimpleControllerHandlerAdapter,適配器的一個子類,交給spring容器管理。
③配置處理器
需要自行創(chuàng)建一個對應(yīng)的類,就相當(dāng)于我們以前創(chuàng)建的servlet,name值對應(yīng)請求路徑。
④配置視圖解析器
InternalResourceViewResolver,視圖解析器的一個子類,交給spring容器管理:
3處理器代碼和視圖頁面編寫
在Java中創(chuàng)建一個類HelloController,名稱一般都是控制器作為后綴,但它其實是一個處理器,其實現(xiàn)了控制器接口。
①ModelAndView
數(shù)據(jù)模型和視圖模型:
這里的數(shù)據(jù)模型就是一個鍵值對:msg就是key,后面的為value。
這里的視圖是hello.jsp文件,為了規(guī)范該文件是放在WEB-INF/view目錄下的。
view目錄就是專門用來存放各種視圖文件的,總之要和視圖解析器中配置的前綴一致。
②設(shè)置視圖名稱
通過setViewName()方法設(shè)定視圖名。
③設(shè)置視圖內(nèi)容
通過setaddObject()方法指定視圖的內(nèi)容,也就是數(shù)據(jù)模型,設(shè)置好后將視圖和模型返回。
在Java代碼中本身是無法直接對jsp文件進行修改的,我們只能設(shè)置一個鍵值對,然后在jsp文件中通過el表達(dá)式動態(tài)獲取。
上述jsp中的${msg}就是獲取msg對應(yīng)的值,在Java中將msg的值修改,jsp也就變化了。
做個測試,同時再梳理一遍其運行流程:
1控制器說明
通過流程圖我們其實可以發(fā)現(xiàn),控制器就是起到一個調(diào)度的作用:
很多事情都要問它怎么做,但它自己不做都是交給映射器、適配器、視圖解析器做。
所以控制器叫DispatcherServlet,其中的Dispatcher本身也就是調(diào)度的意思。
2映射器說明
HandlerMapping,看它的名字就知道是來找處理器(Handler)的,那怎么找到呢?
BeanNameUrlHandlerMapping,看名字就是根據(jù)請求url的路徑找對應(yīng)的控制器。
3適配器說明
映射器只是找到了處理器,而這個處理器怎么用,還需要適配器去調(diào)用才行。
4處理器說明
處理器有一個name或者id屬性來表名自己的身份,不然映射器怎么找到你?
同時對應(yīng)Java中的一個處理器類,要處理具體的業(yè)務(wù),返回ModelAndView,也就是視圖和數(shù)據(jù)模型。
5視圖解析器
根據(jù)視圖名,加上前綴和后綴,找到對應(yīng)路徑下的視圖文件,例子中就是hello.jsp
代碼可以簡化,明天繼續(xù)學(xué)習(xí)。
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。
聯(lián)系客服