1. 程式人生 > >Servlet3.0與springmvc那些事

Servlet3.0與springmvc那些事

line pat 啟動tomcat api文檔 runtime lib 功能 反射 spring

官方文檔:https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servlet-context-hierarchy

以前開發web工程:servlet、filter、listener都需要在web.xml進行註冊,包括springmvc的前端控制器DispatcherServlet也需要在web.xml進行註冊,現在用【註解】方式快速搭建一個web應用:

1、servlet3.0需要tomcat7.0以上版本進行支持

2、創建動態web工程(Dynamic Web Project),領略以下原生版servlet:

步驟如下:

2.1)創建工程

技術分享圖片 技術分享圖片

2.2)新建jsp頁面

技術分享圖片

2.3)新增一個請求地址

技術分享圖片

2.4)新增一個原生servlet來處理order請求

技術分享圖片

技術分享圖片發布到tomcat,然後啟動測試

技術分享圖片

瀏覽器訪問:

技術分享圖片

可以訪問到工程,當然這些註解不是重點,原生的servlet開發很少人用。。

閱讀servlet 3.0 API文檔

4、Shared libraries(共享庫)and runtimes pluggability(運行時插件)的原理,在後面的框架整合裏。用的比較多

ServletContainerInitializer初始化web容器:

在web容器啟動時為提供給第三方組件機會做一些初始化掛載,例如註冊servlet或者filter等,servlet規範(JSR356)中通過ServletContainerInitializer實現此功能。

技術分享圖片

從上圖可以知道,每個框架要使用ServletContainerInitializer就必須:

在對應的jar包的META-INF/services目錄下創建一個名為javax.servlet.ServletContainerInitializer的文件,文件內容指定具體的ServletContainerInitializer實現類,那麽,當web容器啟動時就會運行這個初始化器做一些組件內的初始化工作。

步驟如下:

4.1)創建META-INF/services目錄

技術分享圖片

4.2)創建javax.servlet.ServletContainerInitializer文件

技術分享圖片

如下

技術分享圖片

4.3)新建HongServletContainerInitializer實現ServletContainerInitializer

技術分享圖片

創建感興趣的類型及其子類

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

4.4)編輯javax.servlet.ServletContainerInitializer文件內容

技術分享圖片

4.5)一般伴隨著ServletContainerInitializer一起使用的還有HandlesTypes註解,通過HandlesTypes可以將感興趣的一些類註入到ServletContainerInitializeronStartup方法作為參數傳入

技術分享圖片

4.6)啟動tomcat測試,看打印日誌,不難發現,都拿到了,可以根據需要來反射創建對象

技術分享圖片

這其實就是基於運行時插件的機制,啟動並運行這個ServletContainerInitializer,在整合springmvc的時候會用到

4.7)接下來看下ServletContext arg1,使用ServletContext註冊web組件(其實就是Servlet,Filter,Listener三大組件),

對於我們自己前面寫的HongServlet,我們可以使用@WebServlet註解來加入HOngServlet組件,

但若是我們要導入第三方阿裏的連接池或filter,以前的web.xml方式就可通過配置加載就可以了,但現在我們使用ServletContext註入進來;

技術分享圖片

創建三個組件:

1)新建OrderFilter過濾器

技術分享圖片

2)新建OrderListener.java監聽類

技術分享圖片

3)新建OrderServlet類

技術分享圖片

4)使用ServletContext來註冊上面新建的三個組件

技術分享圖片

註意:在運行的過程中,是不可以註冊組件, IOC道理一樣,出於安全考慮

運行tomcat

技術分享圖片

5)利用以上機制來整合springmvc;創建一個新的maven工程,springmvc註解版

技術分享圖片 技術分享圖片

5.1)創建完工程後,pom.xml會報錯,老鐵們,怎麽辦???不要慌,哈哈看下面吧

技術分享圖片

做個設置即可

技術分享圖片

再右鍵工程名,update更新一下maven配置就不會有錯

技術分享圖片

5.2)加入依賴jar包

技術分享圖片

5.3)導入依賴包後,查看maven的一個spring-web.jar

技術分享圖片

打開ServletContainerInitializer這個文件

技術分享圖片

5.4)打開SpringServletContainerInitializer源碼類

技術分享圖片

技術分享圖片

5.5)打開WebApplicationInitializer源碼看看組件及實現(ctrl+t

技術分享圖片

子類AbstractContextLoaderInitializer作用:

技術分享圖片

子類AbstractDispatcherServletInitializer的作用:從名字來看可知是DispatcherServlet初始化

技術分享圖片

子類AbstractAnnotationConfigDispatcherServletInitializer:註解方式配置的dispatcherServlet初始化器

技術分享圖片

root根容器與servlet容器的區別在哪呢?父子容器

技術分享圖片

很明顯,servlet的容器用來處理@Controller,視圖解析,和web相關組件

root根容器主要針對服務層,和數據源DAO層及事務控制相關處理(圖源自spring官網)

https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servlet-context-hierarchy

接下來我們根據這些來配置操作一下

6.與springmvc的整合流程。

操作步驟

新建HongWebInitializer繼承AbstractAnnotationConfigDispatcherServletInitializer

技術分享圖片

新建兩個配置類HongRootConfigHongAppConfig,形成父子容器的效果

技術分享圖片

技術分享圖片

新建控制類

技術分享圖片

服務類

技術分享圖片

註意:JamesWebAppInitializer還需要指定配置類(配置文件)位置,修改以下返回

技術分享圖片

重啟tomcat,進行測試

技術分享圖片

這就使用註解的方式(配置類)來完成配置springmvc的整合

Servlet3.0與springmvc那些事