1.? Request Response 對(duì)象起到了服務(wù)器與客戶機(jī)之間的信息傳遞作用。

? ??Request 對(duì)象用于接收客戶端瀏覽器提交的數(shù)據(jù),而 Response 對(duì)象的功能則是將服務(wù)器端的數(shù)據(jù)發(fā)送到客戶端瀏覽器。

? ?Request 對(duì)象

l?????? ???? 從瀏覽器端取得數(shù)據(jù)的方法

l?????? ????Request.QueryString 集合讀取表單 GET 方法數(shù)據(jù) ?????

l?????? ????Request.Form 集合讀取表單 POST 方法數(shù)據(jù) ?????

l?????? ????Request.ServerVariables 集合讀取服務(wù)器端環(huán)境變量

?

2. 為什么 servlet jsp 中可以直接使用 req res 對(duì)象?

自己的理解:(不一定正確,有待學(xué)習(xí)和理解)

servlet 容器類負(fù)責(zé)貞聽(tīng)請(qǐng)求,如果捕獲到請(qǐng)求,請(qǐng)創(chuàng)建 req res 對(duì)象,然后激活 service ()方法,(或者,如果是 get 請(qǐng)求,激活 doGet ()方法;如果是 post ,則激活 doPost ()方法),并且同時(shí)也把 req res 對(duì)象傳遞給了 service ()方法(或者是相應(yīng)的 doGet() doPost() 方法);

也就是說(shuō) servlet 容器類貞聽(tīng)到請(qǐng)求后已經(jīng)自動(dòng)創(chuàng)建 req res 對(duì)象,并傳遞給 service ()方法了,所以自己編碼實(shí)現(xiàn) servlet service ()方法時(shí)候,直接使用 req res 對(duì)象就可以,因?yàn)?/span> service ()方法(由 service 方法根據(jù)請(qǐng)求方式再調(diào)用相應(yīng)的 doGet ()和 doPost ()方法) 是容器負(fù)責(zé)自動(dòng)調(diào)用的,調(diào)用的同時(shí)也實(shí)現(xiàn)的 req res 的傳參。 Ok ?。?/span>

?

問(wèn)題:迫切需要查看 tomcat javax.servlet.Servlet 接口實(shí)現(xiàn)的類來(lái)驗(yàn)證自己的理解;

?

參考資料:

Servlet 容器工作原理(一)(二)(三)(四)

http://www.linuxmine.com/45398.html

注釋:這是一個(gè)通過(guò)給出簡(jiǎn)單實(shí)現(xiàn) servlet 容器的源代碼的方式來(lái)闡述 servlet 容器( tomcat )工作原理的好資料。

關(guān)鍵內(nèi)容摘要:

編者注 : 本文和同系列的前面一文“基于 Java Web 服務(wù)器工作原理”,都摘自“ Tomcat 運(yùn)行內(nèi)幕”一書(一本有關(guān) Tomcat 的教程)。在閱讀本文前,最好先閱讀前文,以鞏固基礎(chǔ)信息。在此,將介紹如何建立兩個(gè) servlet 容器。 隨附本書的應(yīng)用程序可以下載 ,如果您有興趣,可以在近段時(shí)間內(nèi)到 作者網(wǎng)站 下載。

?

   本文介紹一個(gè)簡(jiǎn)單 servlet 容器的基本原理。這個(gè) servlet 容器都處理簡(jiǎn)單的 servlet staticResource 。復(fù)雜一些的 servlet 會(huì)超出這些容器的容量,您可以從 TOMCAT? 運(yùn)行內(nèi)幕 一書學(xué)習(xí)創(chuàng)建復(fù)雜的 servlet 容器。

?

 在理解應(yīng)用程序如何運(yùn)作之前,您必須熟悉 javax.servlet.Servlet 接口。首先就來(lái)介紹這個(gè)接口。隨后,就介紹 servlet 容器服務(wù) servlet 的具體內(nèi)容。

?

   javax.servlet.Servlet 接口

?

   servlet 編程,需要引用以下兩個(gè)類和接口: javax.servlet javax.servlet.http ,在這些類和接口中, javax.servlet.Servlet 接口尤為重要。所有的 servlet 必須實(shí)現(xiàn)這個(gè)接口或繼承已實(shí)現(xiàn)這個(gè)接口的類。

   Servlet 接口有五個(gè)方法,如下:

l???????? public void init(ServletConfig config) throws ServletException

l???????? public void service(ServletRequest request, ServletResponse response)? throws ServletException, java.io.IOException

l???????? public void destroy()

l???????? public ServletConfig getServletConfig()

l???????? public java.lang.String getServletInfo()

?

    init service destroy? 方法是 Servlet 生命周期的方法。當(dāng) Servlet 類實(shí)例化后,容器加載 init ,以通知 servlet 它已進(jìn)入服務(wù)行列。 init 方法必須被加載, Servelt 才能接收和請(qǐng)求。如果要載入數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序、初始化一些值等等,程序員可以重寫這個(gè)方法。在其他情況下,這個(gè)方法一般為空。

?

   service 方法由 Servlet 容器調(diào)用,以允許 Servlet 響應(yīng)一個(gè)請(qǐng)求。 Servlet 容器傳遞 javax.servlet.ServletRequest 對(duì)象和 javax.servlet.ServletResponse 對(duì)象。 ServletRequest 對(duì)象包含客戶端 HTTP 請(qǐng)求信息, ServletResponse 則封裝 servlet 響應(yīng)。 這兩個(gè)對(duì)象,您可以寫一些需要 servlet 怎樣服務(wù)和客戶怎樣請(qǐng)求的代碼。

?

一個(gè)功能健全的 servlet 容器對(duì)于每個(gè) servlet HTTP 請(qǐng)求會(huì)完成以下事情:

?

l???????? 當(dāng) servlet 第一次被調(diào)用的時(shí)候,加載了 servlet 類并調(diào)用它的 init 方法(僅調(diào)用一次)

l???????? 響應(yīng)每次請(qǐng)求的時(shí)候 ,構(gòu)建一個(gè) javax.servlet.ServletRequest javax.servlet.ServletResponse 實(shí)例。

l???????? 激活 servlet service 方法,傳遞 ServletRequest ServletResponse 對(duì)象。

l???????? 當(dāng) servlet 類關(guān)閉的時(shí)候,調(diào)用 servlet destroy 方法,并卸載 servlet 類。

?

發(fā)生在 servlet 容器內(nèi)部的事就復(fù)雜多了。只是這個(gè)簡(jiǎn)單的 servlet 容器的功能不很健全,所以,這它只能運(yùn)行非常簡(jiǎn)單的 servelt ,并不能調(diào)用 servlet init destroy 方法。然而,它也執(zhí)行了以下動(dòng)作:

?

l???????? 等待 ? HTTP 請(qǐng)求。

l???????? 構(gòu)建 ServletRequest ? ServletResponse 對(duì)象 ?

l???????? 如果請(qǐng)求的是一個(gè) staticResource ,就會(huì)激活 StaticResourceProcessor 實(shí)例的 process 方法,傳遞 ServletRequest ServletResponse 對(duì)象。

l???????? 如果請(qǐng)求的是一個(gè) servlet , 載入該類,并激活它的 service 方法,傳遞 ServletRequest ServletResponse 對(duì)象。注意:在這個(gè) servlet 容器,每當(dāng) servlet 被請(qǐng)求的時(shí)候該類就被載入。

Servlet 容器的關(guān)鍵工作流程 HttpServer1 類的 await 方法
在這個(gè)應(yīng)用程序中, servlet 容器由六個(gè)類組成

• HttpServer1
• Request
• Response
• StaticResourceProcessor
• ServletProcessor1
• Constants

  正如前文中的應(yīng)用程序一樣,這個(gè)程序的進(jìn)入口(靜態(tài) main 方法)是 HttpServer 類。這個(gè)方法創(chuàng)建了 HttpServer 實(shí)例,并調(diào)用它的 await 方法。這個(gè)方法等待 HTTP 請(qǐng)示,然后創(chuàng)建一個(gè) request 對(duì)象和 response 對(duì)象,根據(jù)請(qǐng)求是否是 staticResource 還是 servlet 來(lái)分派它們到 StaticResourceProcessor 實(shí)例或 ServletProcessor 實(shí)例。

代碼如下:  
    Listing 2.2. HttpServer1 類的 await 方法
   public void await() {
   ServerSocket serverSocket = null;
   int     port   = 8080;
  
   try {
   serverSocket =   new ServerSocket(port, 1,
   InetAddress.getByName("127.0.0.1"));
     }
   catch (IOException e) {
   e.printStackTrace();
   System.exit(1);
     }
  
   // 循環(huán),等待一個(gè)請(qǐng)求
   while (!shutdown) {
   Socket socket     = null;
   InputStream input   = null;
   OutputStream output = null;
  
   try {
   socket = serverSocket.accept();// 貞聽(tīng)用戶請(qǐng)求;
   input   = socket.getInputStream();
   output = socket.getOutputStream();
  
   // 如果捕獲用戶請(qǐng)求,則創(chuàng)建請(qǐng)求對(duì)象并解析
   Request request = new Request(input);
   request.parse();
  
   // 創(chuàng)建回應(yīng)對(duì)象
   Response response = new Response(output);
   response.setRequest(request);
  
   // 檢測(cè)是否是 servlet 或靜態(tài)資源的請(qǐng)求
   //servlet 請(qǐng)求以 "/servlet/" 開始
   if (request.getUri().startsWith("/servlet/")) {
   ServletProcessor1 processor = new ServletProcessor1();

// 激活 process req res )方法,并同時(shí)把 req res 實(shí)例傳遞給 process ()方法;

// tomcat 中,激活的是 service req , res )方法(或者相應(yīng)的 doGet doPost 方法)
   processor.process(request, response);
         }
   else {
   StaticResourceProcessor processor =
   new StaticResourceProcessor();
   processor.process(request, response);
         }
   // 關(guān)閉 socket
   socket.close();
  
   // 檢測(cè)是否前面的 URI 是一個(gè) shutdown 命令
   shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
       }
   catch (Exception e) {
   e.printStackTrace();
   System.exit(1);
       }
     }
   }
   如果 URI 中包含 "/servlet/." ,請(qǐng)求推進(jìn)到后面,否則,請(qǐng)求傳遞到 StaticResourceProcessor 實(shí)例。

Ok !

?

3. 如何理解內(nèi)置的含義?(不一定正確,有待學(xué)習(xí)和理解)

http://topic.csdn.net/t/20060211/20/4551196.html

問(wèn):

如何深入理解內(nèi)置對(duì)象 ?
?
最好是在實(shí)現(xiàn)原理層次上

答:

tomcat 的體系中,有個(gè) jsp ? parser ,它的作用是把 jsp 頁(yè)面 parse java 程序( servlet ),然后再運(yùn)行 parse 出來(lái)的 servlet ,由此可見(jiàn), 9 個(gè)內(nèi)置對(duì)象就是 jsp ? parser 在根據(jù) jsp 頁(yè)面生成 servlet 的時(shí)候自動(dòng)創(chuàng)建的 java 對(duì)象或容器中已經(jīng)創(chuàng)建的對(duì)象。