隨筆 - 251  文章 - 504  trackbacks - 0
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          本博客系個人收集材料及學習記錄之用,各類“大俠”勿擾!

          留言簿(14)

          隨筆分類

          收藏夾

          My Favorite Web Sites

          名Bloger

          非著名Bloger

          搜索

          •  

          積分與排名

          • 積分 - 204397
          • 排名 - 283

          最新評論

          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?方法。
          posted on 2006-12-06 12:37 matthew 閱讀(248) 評論(0)  編輯  收藏 所屬分類: 基礎編程篇
          主站蜘蛛池模板: 灵璧县| 石家庄市| 卢氏县| 河津市| 乌拉特后旗| 隆安县| 凤凰县| 霍城县| 三穗县| 乐亭县| 电白县| 曲水县| 伊吾县| 从江县| 综艺| 且末县| 彭阳县| 南澳县| 南宁市| 宿迁市| 常山县| 澎湖县| 衡山县| 抚州市| 西乌| 大新县| 安平县| 扎囊县| 铁岭市| 会理县| 塔河县| 靖西县| 宽甸| 四子王旗| 永登县| 临猗县| 津市市| 陆川县| 瑞丽市| 金沙县| 佛坪县|