国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Servlet 容器的工作原理 ( 二 )

2019-11-18 12:32:25
字體:
來源:轉載
供稿:網友

  HttpServer1 類
  此應用程序內的 HttpServer1類 與前文簡單的 WEB 服務器應用程序中的HttpServer 十分相似。但是,此應用程序內的 HttpServer1 能服務靜態資源和 servlet。假如要請求一個靜態資源,請輸入以下 URL:http://machineName:port/staticResource
  它就是前文中提到的怎樣在 WEB 服務器應用程序里請求靜態資源。假如要請求一個 servlet,請輸入以下 URL:http://machineName:port/servlet/servletClass
  假如您想在本地瀏覽器請求一個 PRimitiveServle servlet ,請輸入以下 URL:http://localhost:8080/servlet/PrimitiveServlet
  下面 Listing 2.2 類的 await 方法,是等待一個 HTTP 請求,直到一個發布 shutdown 命令。與前文的 await 方法相似。
  
  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);
    }
  
  // 循環,等待一個請求
  while (!shutdown) {
  Socket socket    = null;
  InputStream input  = null;
  OutputStream output = null;
  
  try {
  socket = serverSocket.accept();
  input = socket.getInputStream();
  output = socket.getOutputStream();
  
  // 創建請求對象并解析
  Request request = new Request(input);
  request.parse();
  
  // 創建回應對象
  Response response = new Response(output);
  response.setRequest(request);
  
  //檢測是否是 servlet 或靜態資源的請求
  //servlet 請求以 "/servlet/" 開始
  if (request.getUri().startsWith("/servlet/")) {
  ServletProcessor1 processor = new ServletProcessor1();
  processor.process(request, response);
        }
  else {
  StaticResourceProcessor processor =
  new StaticResourceProcessor();
  processor.process(request, response);
        }
  // 關閉socket
  socket.close();
  
  //檢測是否前面的 URI 是一個 shutdown 命令
  shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
      }
  catch (Exception e) {
  e.printStackTrace();
  System.exit(1);
      }
    }
  }
  
  此文 await 方法和前文的不同點就是,此文的 await 方法中的請求調度到StaticResourceProcessor 或 ervletProcessor 。
  假如 URI中包含 "/servlet/.",請求推進到后面,否則,請求傳遞到 StaticResourceProcessor 實例。
  
  Request 類
  Servlet service 方法接受 servlet 容器的 javax.servlet.ServletRequest 和javax.servlet.ServletResponse 實例。因此,容器必須構建 ServletRequest和ServletResponse對象,然后將其傳遞到正在被服務的service 方法。
  ex02.pyrmont.Request 類代表一個請求對象傳遞到 service 方法。同樣地,它必須實現 javax.servlet.ServletRequest 接口。這個類必須提供接口內所有方法的實現。這里盡量簡化它并只實現幾個方法。要編譯 Request 類的話,必須提供這些方法的空實現。再來看看 request 類,內部所有需要返回一個對象實例都返回null,如下:
  
  public Object getAttribute(String attribute) {
  return null;
   }
  
  public Enumeration getAttributeNames() {
  return null;
   }
  
  public String getRealPath(String path) {
  return null;
   }
  
  另外,request 類仍需有前文有介紹的 parse 和getUri 方法。
  
  Response 類
  response 類實現 javax.servlet.ServletResponse,同樣,該類也必須提供接口內所有方法的實現。類似于 Request 類,除 getWriter 方法外,其他方法的實現都為空。
  
  public PrintWriter getWriter() {
  // autoflush is true, println() will flush,
  // but print() will not.
  writer = new PrintWriter(output, true);
  return writer;
  
  }
  
  PrintWriter 類構建器的第二個參數是一個代表是否啟用 autoflush 布爾值 ,假如為真,所有調用println 方法都 flush 輸出。而 print 調用則不 flush 輸出。因此,假如在servelt 的service 方法的最后一行調用 print方法,則從瀏覽器上看不到此輸出 。這個不完整性在后面的應用程序內會有調整。
  response 類也包含有前文中介紹的 sendStaticResource方法。
  
  StaticResourceProcessor 類
  StaticResourceProcessor 類用于服務靜態資源的請求。它唯一的方法是 process。
  
  Listing 2.3.StaticResourceProcessor 類的 process方法。
  public void process(Request request, Response response) {
  try {
  response.sendStaticResource();
    }
  catch (IOException e) {
  e.printStackTrace();
    }
  }
  
  process 方法接受兩個參數:Request 和 Response 實例。它僅僅是調用 response 類的 sendStaticResource 方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙门县| 芜湖市| 青川县| 诏安县| 罗山县| 湖北省| 青川县| 慈利县| 衡南县| 澳门| 和硕县| 晋江市| 色达县| 平度市| 济南市| 扶绥县| 特克斯县| 花垣县| 措美县| 双江| 依安县| 武穴市| 罗定市| 柘城县| 通许县| 海安县| 略阳县| 都江堰市| 海门市| 南宫市| 咸阳市| 全南县| 甘德县| 阿巴嘎旗| 新余市| 溆浦县| 铁力市| 沈阳市| 天气| 炉霍县| 渑池县|