Servlet3.0與springmvc那些事
官方文檔: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可以將感興趣的一些類註入到ServletContainerInitializer的onStartup方法作為參數傳入
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類
新建兩個配置類HongRootConfig和HongAppConfig,形成父子容器的效果
新建控制類
服務類
註意:JamesWebAppInitializer還需要指定配置類(配置文件)位置,修改以下返回
重啟tomcat,進行測試
這就使用註解的方式(配置類)來完成配置springmvc的整合
Servlet3.0與springmvc那些事