1 維基百科上這樣定義:一個Java Servlet就是包含服務器功能的Java程序。儘管servlets能夠相應任何類型的請求,他們大多數一般都是實現了搭建在web服務器上的應用。只是這樣的web servlets是相似於PHP和ASP.NET這樣的動態web內容的java實現。java
2 傳統的CGI腳本有哪些缺陷:web
(1) 每一個HTTP請求都要耗費一個進程,CPU佔用率太高瀏覽器
(2) 對於併發的CGI請求,每一個請求都要將CGI腳本加載到內存中,內存佔用過大安全
(3) 只有一個單例響應同時進行的請求。這樣下降了內存使用率,管理持久化數據變得不容易服務器
3 servlet生命週期併發
init():初始化servlet實例,實現了javax.servlet.ServletConfig接口,容許servlet從web應用配置中拿到name-value的初始化參數。app
service():每次請求時調用。肯定請求類型並分發給一個合適的方法去處理。eclipse
destroy():結束服務時調用,包含在servlet生命週期中。webapp
目前最新版本:jetty 9.4.8v20171121async
官方文檔:
1 開始使用Jetty
a. jetty簡介
(1) maven信息:
pom:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
<version>${project.version}</version>
</dependency>
(2) 先普及下版本代號知識:
主要有Alpha、Beta、Milestones(M)、Release Candidates(RC)、General Availability(GA)。
介紹下RC和GA,即發佈前的候選版本和可用版本,通常RC不可用於生產環境,它可能包含一些安全漏洞或者不完整的特徵集。
GA是可用的線上版本,也分爲Release和Stable,即發佈第一版和穩定版本。發佈以後經過用戶測試,會有一些測試過程當中提出的issue須要fixed。穩定版本是在發佈第一版通過必定時間的使用和檢驗,修復漏洞後發佈的穩定版,通常建議使用此版本(存在的狀況下)。
下表是官網上的包路徑和用途,請參閱,此處不作解釋:
上表中的demo-base路徑便是jetty服務啓動和資源存放的根目錄
啓動命令爲:
>cd $JETTY_HOME/demo-base/
>java –jar $JETTY_HOME/start.jar
(此前已設置好JETTY_HOME=/path/to/$(jetty_home))
官網建議不要在$JETTY_HOME目錄下啓動。在瀏覽器中訪問http://localhost:8080便可查看到demo服務器。
新建一個jetty base用於啓動服務:
>JETTY_BASE=/tmp/mybase
>mkdir $JETTY_BASE
>cd $JETTY_BASE
>java –jar $JETTY_HOME/start.jar --create-startd
>java –jar $JETTY_HOME/start.jar --add-to-start=http,deploy
>cp $JETTY_HOME/demo-base/webapps/async-rest.war webapps/ROOT.war
>java –jar $JETTY_HOME/start.jar
(3)配置的簡介
幾種方式:POJO、啓動配置文件(用分爲ini,mod,xml三種,此處不作詳解,請查閱官網)、其餘配置文件、Jetty IoC XML配置
ini,mod,xml三者的關係以下圖:
其餘配置文件包括context xml、web.xml、Properties文件。
b. 配置簡介
配置Server
核心server配置:etc/jetty.xml
包括ThreadPool,Handlers,Server Attributes,Server fields,Connectors,Services
ThreadPool:其餘Jetty server組件使用的默認Executor Service。基礎的配置是在start.ini和start.d/server.ini中的maximum size和minimum size
Handlers:用於處理請求,在xml中會配置成樹狀,每一個節點表明一個功能點。
Server Attributes:包含了一個繼承屬性map,若是value對象實現了LifeCycle接口,它們會和server一塊兒啓動和中止。
Server fields:在http響應中傳遞屬性
Connectors:jetty支持的一些協議(好比HTTP)的鏈接器。在server裏既能夠指定鏈接器的集合也能增/刪鏈接器。
Services:比較典型的是LoginService和DataSources
配置Connectors
包括Port,Host,Idle Timeout,HTTP Configuration,SSL Context Factory
Port:經過jetty.http.port或jetty.ssl.port設置,默認http是8080,https和http2是8443
Host:不設置,則默認爲0.0.0.0。xml中配置爲jetty.host屬性。
Idle Timeout:空閒時間
HTTP Configuration: HttpConfiguration實例,包含獨立於特定無線協議且通用的HTTP配置。標準的版本中在jetty.xml中會建立一個HttpConfiguration
SSL Context Factory:定位keystore和truststore用於認證。
ServerConnector:基於NIO且使用了鏈接工廠用於處理一個或多個協議的請求。
配置Contexts
大體至關於servletContext API,用於在一個context path中組裝handlers和裝載資源文件。包含標準的jetty處理器和自定義的應用處理器。
通用的包括contextPath,virtualHost,classPath,attributes,resourceBase
重點講下classPath,一個context只能包含一個classpath,因此任何執行處理的線程包含一個線程context的classLoader。標準的web應用經過WEB-INF/lib和WEB-INF/classes目錄來初始化,另外還須要一些rules用來代理裝載parent classloader。
Web Application的發佈
能夠發佈多種格式:war,擴展war,靜態內容,包含ContextHandler實例的xml。
同目錄存在多種可發佈格式時,優先級爲:XML>WAR>Dir
(特別提醒:在Jetty9中再也不支持ContextDeployer,功能已被合併到新的WebAppProvider中來避免兩次發佈語義。