自JavaEE誕生伊始,Servlet容器和Servlet技術,就構成了JavaEE應用的核心,配合其它組件,它們完善了Java企業級開發的全套解決方案。小到一個靜態博客網站,大到分佈式的集羣應用,都離不開Servlet底層的支持。大約從Java 5開始,Java企業級開發就分爲了兩個不一樣的方向,一個是基於EJB、JSF、JPA等爲主的傳統Java企業級系統開發方案,另外一套則是基於Struts、Hibernate、Spring、Spring MVC、MyBatis等爲主JavaWeb開發模式。時至今日,移動互聯網的蓬勃發展下,產生了一大批的電商、新零售、在線遊戲、社交網站等各式應用。JavaWeb在時代洪流中反而獲得愈來愈大的發展:分佈式、集羣、中間件、大數據……給Java帶來了蓬勃生機。web
而這些互聯網應用的基礎,都有Servlet的影子。那麼Servlet究竟是什麼???數據庫
在StackOverflow上就有這麼個問題,題主搞了好久都搞不明白Servlet究竟是什麼,但願有人能用淺顯直白的語言一語中的地回答他。排名第一的高票答案是這麼說的:瀏覽器
A servlet is simply a class which responds to a particular type of network request - most commonly an HTTP request. Basically servlets are usually used to implement web applications - but there are also various frameworks which operate on top of servlets (e.g. Struts) to give a higher-level abstraction than the "here's an HTTP request, write to this HTTP response" level which servlets provide.安全
Servlets run in a servlet container which handles the networking side (e.g. parsing an HTTP request, connection handling etc). One of the best-known open source servlet containers is Tomcat.服務器
粗魯翻譯一下就是:Servlet說白了就是一個處理網絡請求(不少時候是Http請求)的類,用於實現Web應用的。另外也有不少的框架好比Struts是以它爲底子,搭建了一個更高抽象(的解決方案),而不是讓你挽起袖子直接幹「HTTP請求來了,快給回覆」這種層級的粗活。Servlet是運行在處理網絡請求的Servlet容器中的,好比最知名的Tomcat。網絡
Web應用概述session
JavaWeb規範架構
JavaWeb應用由於是容器式開發,所以會有一個模板規範,一個基本Web應用的架勢是:app
<WebDemo> //這是Web應用的名稱框架
|---WEB-INF //此文件夾對外不可見
| |---web.xml //web應用配置文件(Servlet3.0可不要,但建議保留)
| |---classes //保存*.class文件
| |---lib //保存jar包
|---<a. jsp> 保存jsp文件等
web.xml
1. 配置和管理Servlet、Listener、Filter、JSP、JSP屬性、標籤庫
2. Web應用首頁、資源引用、JAAS受權引用、metadata-complete(選true表示不加載註解資源)
Servlet
Servlet開發
Servlet,說白了就是個Java的類。曾幾什麼時候,Servlet甚至被用來寫Web界面,全部的HTML標籤,都採用相似out.write("<head>\r\n")這種形式,繁瑣可想而知。自MVC架構規範之後,Servlet就專一於作控制層了。
Servlet的做用就是處理網絡請求。開發Servlet需繼承HttpServlet,並經過如下方法處理請求:
doGet:響應Get請求
doPOST:響應POST請求
doPut:響應Put請求
doDelete:響應delete請求
init:建立Servlet實例時,初始化Servlet資源(通常不使用,須要初始化的時候,第一行調用super.init())
destory:銷燬Servlet實例時,自動回收資源(通常不使用,除非須要手動回收資源如數據庫鏈接)
開發步驟
1. 編寫Servlet類
2. 配置
2.1 Servlet3.0新增的@WebServlet配置
2.2 web.xml文件配置
Servlet/JSP生命週期
1. 建立:單例模式,只建立並初始化一個Servlet實例
2. 初始化:Web容器調用Servlet的init方法初始化
3. 響應請求:初始化後,將一直在容器中,響應客戶請求
4. 銷燬:Web容器決定銷燬Servlet,會調用destroy方法。一般是關閉Web應用時銷燬
注意:Servlet容器中對同一個Servlet類,只會建立和初始化其實例一次,爲單例。容器會維護一個線程池,對每個請求提供一個工做線程去處理。若是請求過多達到線程池峯值,則請求會被放入一個隊列,等待可用線程。
Servlet自己是線程不安全的,所以不建議設置成員變量或類變量,而使用局部變量避免線程問題。
Servlet參數配置
能夠用在好比配置數據庫鏈接參數的場景,實現多個Servlet之間的可重用。
1. 配置
2. 訪問
經過ServletConfig對象的getInitParameter(String name)訪問。
注意區分ServletContext,二者方法相同,但ServletConfig是當前Servlet的配置參數;ServletContext是獲取當前Web應用的配置參數。
ServletContext和HTTPSession因爲是多個Servlet中共享信息,所以也是線程不安全的。
MVC中Servlet做爲Controller的角色
JSP-Servlet-JavaBean的第一代MVC架構
在遙遠的古代,曾經使用Servlet做爲頁面視圖解決方案,開發難度可想而知。所以,在第一代的MVC方案裏,使用JSP作V,JavaBean作M和Servlet做爲Controller的方案應運而生。
一個充斥於各類學生管理系統的典型使用場景是:
JSP
JSP的本質就是Servlet,處理用戶請時會被翻譯爲Servlet被Web容器執行。Servlet與JSP區別是:
1. 沒有內置對象,JSP中的內置對象須要顯示建立、
2. 對於靜態頁面標籤,都要使用頁面輸出流逐行輸出。
JSP由靜態HTML頁面內容和動態JSP腳本兩部分組成
四種基本語法
3個編譯指令
JSP編譯指令是通知JSP的消息,不直接輸出。包括
7個動做指令
編譯指令是通知Servlet引擎的消息,在JSP編譯成Servlet時起做用;動做指令則可替換成JSP腳本,是JSP腳本的標準化寫法
9個內置對象
這9個內置對象其實都是Servlet接口的實例,在JSP的使用中被默認初始化,能夠直接使用。
JSP2的自定義標籤
1. 開發自定義標籤類
2. 創建TLD文件
3. 使用標籤庫
<% taglib uri="tagliburi" prefix="tagPrefix" %>
Filter
Filter是Servlet的增強版,用於對用戶請求進行預處理或後處理。一個典型的應用場景是:Filter對用戶請求進行預處理,接着交給Servlet進行處理並響應,最後Filter再進行後處理。
預處理:攔截和檢查HttpServletRequest,能夠修改請求頭和數據
後處理:攔截和檢查HttpServletResponse,能夠修改響應頭和數據
Filter經常使用於檢查用戶請求、過濾非法請求、日誌記錄、請求解碼、處理XML等
Filter也被用於實現網站的僞靜態,以優化SEO。
開發過濾器
1. 建立Filter類:實現Filter接口,重寫init、destory和doFilter(ServletRequest request, ServeletResponse response, FilterChain chain)方法
2. 配置
Listener
使用監聽器
1. 定義Listener實現類
2. 配置