Servlet概念框架

以 Servlet 3.0 源代碼爲基礎。Servlet 是 Javaweb 應用的基礎框架,猶如孫子兵法之於做戰指揮官,不可不知。html

概念框架

  • 機制: 事件 Event, 監聽器 Listenerjava

  • 數據: 配置 Config, 上下文 Context, 會話 Session,Cookie; 屬性 Attribute, 參數 Parameter, 首部 Headerweb

  • 服務: 核心 Servlet, 過濾 Filter, 轉發 Dispatcherajax

  • IO: 請求 Request, 響應 Response ; 輸入流 InputStream, 輸出流 OutputStream瀏覽器

  • 行爲: 鏈 Chain, 註冊 Register安全

  • 方式: 同步 Syn , 異步 Asyn服務器

  • 協議: HTTP, SSL網絡

  • 其餘: Characterset, URL, URI, Path, Encode, Decode多線程

概念組合

  • Servlet: init(ServletConfig) -> service(ServletRequest,ServletResponse) -> destroy() ;Servlet 必須是線程安全的;架構

  • ServletConfig: Servlet配置數據,在初始化Servlet實例後得到, 包括 ServletName, ServletContext, initParameters;

  • ServletRequest: 客戶端請求數據,包括 屬性名值,參數名值,字符編碼集,內容長度及類型,輸入流,Servlet信息, Locale等;

  • ServletResponse:服務端返回數據,包括 字符編碼集,內容長度及類型,輸出流,Locale,Buffer及操做等。

  • ServletInputStream: 從客戶端請求中讀取字節流數據;從 ServletRequest 中獲取。

  • ServletOutStream: 將字節流數據寫入響應內容中;從 ServletResponse 中獲取。

  • ServletContext:Servlet運行時上下文,主要與 Servlet容器通訊。


  • Filter: init(FilterConfig) -> doFilter(ServletRequest,ServletResponse,FilterChain) -> destroy() ; Filter在Servlet處理以前對客戶端請求做預處理,在Servlet處理以後對響應數據作後處理。實際應用中一般包括字符編碼、日誌審計、安全訪問控制等過濾器。

  • FilterConfig: Filter 配置數據,在初始化Filter實例後得到,包括 FilterName, ServletContext, initParameters

  • FilterChain: 在過濾器中調用 chain.doFilter(ServletRequest,ServletResponse), 將請求傳遞給過濾器鏈上的下一個過濾器進行處理。 


  • HttpServlet: 子類化 HttpServlet 用於定義處理請求的服務程序;通常覆寫 doGet 或 doPost 方法。

  • HttpServletRequest:Servlet請求數據,包括請求頭、Cookie, 請求方法,請求路徑,登陸用戶,Session等。

  • HttpServletResponse: HTTP響應碼定義,添加、設置或獲取【響應頭,Cookie,狀態碼,錯誤碼】,重定向,URL編碼等。

  • HttpSession: 包括 ID,建立時間,最近訪問時間,ServletContext, 會話失效時間,屬性名值,屬性名集,屬性值集等。

  • Cookie: 客戶端標識信息,Servlet 實例能夠在 HttpServletResponse.addCookie 方法中添加 Cookie 信息併發送給客戶端。Cookie 在請求頭或響應頭裏添加。


  • ServletRequestEvent, ServletRequestListener, ServletRequestAttributeEvent, ServletRequestAttributeListener,ServletContextEvent, ServletContextListener, ServletContextAttributeEvent, ServletContextAttributeListener, HttpSessionEvent, HttpSessionListener, HttpSessionBindingEvent, HttpSessionBindingListener, HttpSessionAttributeListener: 當相應的對象或值改變時對應的事件及監聽器。

Servlet3.0加強

註解

有了註解,就不須要在 web.xml 部署文件中聲明 servlet, filter, listener 等,減小部署文件的體積,提升可維護性。

  • WebServlet: 聲明一個 Servlet,屬性主要有 name, value, urlPatterns, initParams, asyncSupported, description, displayName;

  • WebFilter: 聲明一個 Filter, 屬性主要有 name, value, urlPatterns, initParams, servletNames, dispatcherTypes

asyncSupported, description, displayName;

  • WebListener: 聲明一個Web監聽器,屬性爲name, 值爲【ServletContextListener, ServletContextAttributeListener, javax.servlet.ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener】之一。

  • WebInitParam: 在 Servlet, Filter 上聲明初始化參數,屬性有name, value, description

  • MultipartConfig: 應用於 Servlet 用於處理文件上傳,屬性有location, maxFileSize, maxRequestSize,fileSizeThreshold

  • ServletSecurity: 聲明 Servlet 的安全約束,屬性有value, httpMethodConstraints

  • HandlesTypes: 聲明 ServletContainerInitializer 的實現類的方法參數中所能處理的類型集合。

異步

  • AsyncEvent: 當調用 servletRequest.startAsync方法或該方法【完成|超時|產生錯誤】時,將產生一個異步事件。

  • AsyncListener:異步事件監聽器,須要實現 【onStartAsync|onComplete|onTimeout|onError】(AsyncEvent)方法。

  • AsyncContext: 異步上下文。

  • ServletRequest.startAsyn方法提供了在Servlet中進行異步處理的特性。

Servlet要點

事件機制

  • 當事件源發生某種變化時,運行容器將分派對應的監聽器處理程序來處理相應的事件。Servlet裏的事件源主要有Request, Context, Attribute 等。

  • 事件機制的底層實現可基於觀察者/訂閱者模式,使用多線程或多進程與信號機制實現。主線程或主進程執行具體邏輯產生事件併發送信號來通知變化,守護線程或守護進程監聽到信號和通知後分派相應的監聽器程序來處理。能夠在應用啓動時預先註冊事件類型與監聽器程序的對應關係,亦可在運行中動態綁定或解綁。

  • 以 ServletRequestAttributeEvent 爲例。只要編寫相應的監聽器類 RequestAttributeListenerImpl (實現 ServletRequestAttributeListener ) , 並在 web.xml listener 元素 ( 或使用註解 WebListener ) 聲明該監聽器後,當在應用中寫下 request.setAttribute(name, value) 或 request.removeAttribute(name,value) 就會自動觸發 RequestAttributeListenerImpl 裏的邏輯。

數據信息

  • Servlet, Filter 能夠從請求 Request (參數 Parameter)、配置 Config 、環境 Context、環境或自定義屬性 Attribute 以及會話 (Session, Cookie) 中獲取處理請求所須要的信息;

  • Dispatcher 能夠從部署文件或項目配置文件中讀取 URL 映射配置, 未來源於客戶端的 URL 請求映射到指定的 Servlet / Controller 。

輸入輸出

  • 最底層是字節流(InputStream, OutputStream) 和 字符流 (Reader, Writer)

  • 其上是各類源的字節流和字符流。源主要有: String, File, NetworkResource 等

  • 語義層面是請求與響應: HttpServletRequest , HttpServletResponse。

會話追蹤

  • 爲了始終如一地標識和處理同一個客戶端發出的有緊密業務關聯的請求鏈,使用客戶端 Cookie 和 服務端 Session 機制。瀏覽器能夠檢測客戶端Cookie 以判斷用戶是否登陸, 服務器能夠檢測 Session 裏的登陸信息判斷用戶是否登陸。

Ajax與異步Servlet

  • Ajax 是瀏覽器實現的通訊封裝。當與服務器通訊時,在發送請求後會當即返回,不阻塞用戶後續操做;而在以後會檢查請求狀態,在完成後獲取服務器返回的數據並更新頁面。Ajax 是客戶端異步技術,改善客戶端響應體驗。

  • Ajax 一般應用於富客戶端應用場景。在這種場景中,靜態內容和交互設計佔據頁面內容的絕大部分,而動態內容僅佔其中一小部分。若是服務端每次都返回整個頁面內容,勢必耗費大量網絡帶寬。而 Ajax 通訊僅返回客戶端刷新所須要的數據。在 Ajax 應用中,服務端提供的是一段數據, 而不是頁面或文件。

  • Servlet 自己是同步的。處理客戶端請求以後才返回響應。異步 Servlet 則會將請求中耗時長的部分抽離出來異步處理,耗時短的部分完成後就退出線程,減小長耗時請求對Servlet線程的佔用,改善應用系統的吞吐量和負載。異步 Servlet 是服務端異步技術。【異步Servlet 待實驗】

首部

  • 請求頭:主要包括 【Host, Connection, Cache-Control, Accept, Upgrade-Insecure-Requests, User-Agent, Accept-Encoding, Accept-Language, If-Modified-Since】

  • 響應頭: 主要包括【Content-Length,Content-Type,Server,Set-Cookie】

  • 請求頭示例:【Host=localhost:8082;Connection=keep-alive;Cache-Control=;max-age=0;Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

Upgrade-Insecure-Requests=1;User-Agent=Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36;Accept-Encoding=gzip, deflate, sdch;Accept-Language=zh-CN,zh;q=0.8;If-Modified-Since=Wed, 17 Feb 2016 02:20:01 GMT】

  • 響應頭示例:【Content-Type: text/plain;charset=UTF-8;Set-Cookie: me=qinshuq;Domain=localhost;Content-Length: 5;Server: Jetty(7.2.2.v20101205)】

路徑

Request: http://localhost:8082/servlets/AutoCompleteServlet?inputText=sh

  • RequestUrl = http://localhost:8082/servlets/AutoCompleteServlet ; RequestUrl: [協議]://servName:servPort/contextPath/servletPath ; RequestUrl 不包括 QueryString 。

  • RequestURI = /servlets/AutoCompleteServlet ; 資源標識符。 ContextPath (不含) 到 QueryString (不含) 之間的部分。

  • ServletPath = /servlets/AutoCompleteServlet ; 映射到 Servlet 實例的路徑標識。

  • ContextPath = ; 應用路徑,可在Servlet服務器部署文件中指定。若Servlet在根路徑下,默認爲空字符串「」 ;若 請求爲 http://localhost:8082/autocomplete/servlets/AutoCompleteServlet?inputText=sh , 則 ContextPath = /autocomplete

  • QueryString: inputText=sh 。 查詢字符串,一般是請求中問號以後的部分。

  • 若請求爲 Request: http://localhost:8082/, 則: RequestUrl = http://localhost:8082/ , RequestURI = /, ServletPath = /,ContextPath = 「」, QueryString = null

示例

代碼閱讀小記

  • 邊讀代碼邊作筆記是一個好習慣。

  • 概念-屬性-聯繫-模型-架構。

相關文章
相關標籤/搜索