1,何爲Web容器
容器:用來保存持有對象集合對象,對於Servlet/JSP,不僅持有對象,並且負責對象的生命週期與相關服務連接;
在抽象層面,可以將Web容器視爲運行Servlet/JSP的HTTP服務器.,如同java僅認得JVM這個操作系統,Servlet/JSP程序在抽象層面上,也僅認得Web容器其這個概念上的
HTTP服務器。(JSP最終也是轉譯,編譯,加載爲Servlet,在容器的世界中,真正負責請求,相應的是Servlet)
一個請求到Servlet處理的線性關係:
瀏覽器<->實體服務器<->HTTP服務器程序<->Web容器<->Servlet
一個請求/響應的基本例子:
(1)客戶端(大部分情況下是瀏覽器)對Web服務器發出HTTP請求。
(2)HTTP服務器收到HTTP請求,將請求轉由Web容器處理,Web容器會剖析HTTP請求內容,創建各種對象(如HttpServletRequest,HttpServletResponse,HttpSession等)。
(3)Web容器由請求的URL決定要使用哪個Servlet來處理請求。
(4)Servet根據請求對象(HttpServletRequest)的信息決定如何處理,通過響應對象(HttpServletResponse)來創建相應。
(5)Web容器與HTTP服務器溝通,Web服務器將響應轉換爲HTTP相應並傳回客戶端。
2,Servlet的運行
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
若要編譯一個servlet的java文件,則類路徑中必須包括ServletAPI的相關類。
例如:javac -classpath Yourlibrary/YourTomcat/lib/servlet-api.jar -d ./classessrc/cc/openhome/HelloServlet.java
HttpServlet相關API類圖
GenericServlet並沒有規範任何有關HTTP的相關方法,而是由繼承它的 HttpServlet來定義。在最初定義Servlet時,並不限定與它
只能用於HTTP,所以並沒有將HTTP相關服務流程定義在GenericServlet之中,而是定義在HttpServlet的service()方法 中。
HttpServlet的service()方法中的流程大致如下:
protected void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
String method=req.getMethod();//取得請求方法
if(method.equals(METHOD_GET)){//HTTP GET
//略
doGet(req,resp);
//略
}else if(method.equals(METHOD_HEAD)){
//略
doHead(req,resp);
//略
}else if(method.equals(METHOD_POST)){
//略
doPost(req,resp);
//略
}else if(method.equals(METHOD_PUT)){
//略
}
}
當請求到來,容器會調用Servlet的service()方法。可以看到,HttpServlet的service()中定義的,基本就是判斷HTTP請求的方式,再分別調用doGet()等方法。
所以若想針對GET,POST等方法處理,繼承HttpServlet後,需要重新定義相應方法。
3,@WebServlet
@WebServlet(name="Hello",
urlPatterns={"/hello.view"}
loadOnStartup=1)
上面的@WebServlet告知容器,此serlvet的名稱爲Hello,若客戶端請求的URL爲/hello.view則由名稱爲Hello的Servlet來處理。
(若沒有設置@WebServlet的name屬性,默認值爲Servlet的類完整名稱)
loadOnStartup表示容器啓動時,就先將Servlet類載入,實例化並做好初始化動作。數字代表了順序,數字一樣,則由容器廠商決定要如何載入
哪個Servlet。
4,URL模式設置
一個請求URI組成:requestURI=contextPath+servletPath+pathInfo
Servlet的URL模式:
(1)路徑映射:以“/”開頭但以"/*"結尾的URL模式;
(2)擴展模式:以"*."開頭的URL模式;
(3)環境根目錄映射:空字符串"";
(4)預設Servlet:僅包括"/"的URL模式,當找不到合適的URL模式對應時,就會使用預設Servlet;
(5)完全匹配:作路徑的嚴格對應;
URL模式在設置比對規則在請求有所重疊時,請求比對原則爲從最嚴格的URL模式開始符合。