JSP&Servlet 學習筆記(一)

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模式開始符合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章