【圖片抓取】003-JAVA WEB(上)

【圖片抓取】003-JAVA WEB(上)

本項目主要講述java web項目的搭建和啓動過程,爲之後繼續圖片抓取的業務展現作基礎。項目中採用tomcat+spring mvc+spring jdbc+mysql,以最簡單的方式搭建;其實java web也在不停的發展,使用spring boot可能會更簡單有效的搭建web,結合nodejs實現先後臺分離,再較大項目中比較省力。spring boot再方便其實也沒有脫離傳統web的工做機制,配合本項目簡單描述下web的啓動過程。java

web 容器啓動


tomcat能夠簡單分3個階段,啓動初始化->服務運行(接收,響應http請求)->服務結束;web服務的主體就是接收響應http請求既上右邊部分(filter+servlet);有時候咱們可能要在服務運行前作一些準備工做,讀取配置文件,啓動一些非http服務線程等;有時候還須要在web服務中止時作一些事情,釋放資源等等,這些就要在啓動初始化和服務結束階段能執行咱們的代碼,這2個階段都要用到listener。node

1. listener監聽器

從web.xml咱們能夠看出,配置了ContextLoaderListener。須要實現2個方法contextInitialized(ServletContextEvent sce)和contextDestroyed(ServletContextEvent sce),這2個方法分別會在tomcat啓動和結束時執行。若是須要的話,經過方法參數ServletContextEvent,咱們能夠把listener的處理結果放到ServletContextEvent或者從ServletContextEvent拿取數據,經過ServletContextEvent能夠和servlet進程作數據交互。mysql

2. filter

Filter用於處理http請求和響應的攔截處理。http請求能夠粗略分爲3個階段,git

* web容器,接收到http請求後,根據web.xml裏配置的路徑,匹配Filter和servlet。
* Filter處理鏈,容器把http請求轉入filter處理,filter能夠在真正業務處理前作預處理,像日誌管理,權限管理等公共的http處理;
* http業務數據處理,servlet真正的業務處理,這裏只關心業務邏輯,系統公共的處理,我不關心,加入後面權限認證規則變化,或增長別的處理規則,在filter作;業務邏輯不動,我不動。


這樣相比容器直接發到servlet處理,大大減小了代碼重複工做並且方便統一管理。github

3. servlet

servlet是http的業務處理核心,包括spring mvc也是在servlet裏,封裝實現本身的處理流程。web

spring 上下文關係


從上圖能夠看出spring主要在listener和servlet兩部分作工做。spring mvc對應的分了兩大類,既controller標籤和非controller的其它標籤(servcie,component等);以前項目上看到有人寫的web.xml,常常看到 contextloaderlistener和dispatcher都是匹配 spring-*.xml,或者xml配置掃描時,沒有區分controller;這樣會致使部分spring bean初始化2次,產生一些不容易發現bug。
結合web容器啓動,spring會首先實例化contextloaderlistener,把service,component,或者xml裏指定的bean;contextloaderlistener啓動完成後,再初始化dispatcher servlet;dispatcher servlet繼承contextloaderlistener實例化的bean,這裏推測這些bean也是經過ServletContextEvent傳入的,具體可看下源碼,看源碼,看源碼,全部的匹配dispatch servlet的配置的url都走向了這裏,能夠理解成web容器裏又放了一個容器,這樣spring就能夠自定義的擴展,細化http請求的階段,像interceptor
日誌打印執行filter和interceptor示例
spring

其它

示例代碼
不知這幾篇文章是否對你們有所幫助,但願各位看官多提意見,多多交流。sql

相關文章
相關標籤/搜索