1. 程式人生 > 實用技巧 >簡單的Tomcat實現--3.1 404錯誤

簡單的Tomcat實現--3.1 404錯誤

404

  • 當瀏覽器請求訪問的頁面不存在時,此前的策略是直接輸出File not found,而Tomcat的做法是顯示一個網頁。

  • 在專案目錄下建一個目錄special專門用來存放三個頁面,一個是歡迎,一個是404錯誤,一個是500錯誤頁面。

  • 先建立404.html

    • <html>
      <head><title>DIY Tomcat/1.0.1 - Error report</title>
          <style>
              <!--
              H1 {
                  font-family: Tahoma, Arial, sans-serif;
                  color: white;
                  background-color: #525D76;
                  font-size: 22px;
              }
      
              H2 {
                  font-family: Tahoma, Arial, sans-serif;
                  color: white;
                  background-color: #525D76;
                  font-size: 16px;
              }
      
              H3 {
                  font-family: Tahoma, Arial, sans-serif;
                  color: white;
                  background-color: #525D76;
                  font-size: 14px;
              }
      
              BODY {
                  font-family: Tahoma, Arial, sans-serif;
                  color: black;
                  background-color: white;
              }
      
              B {
                  font-family: Tahoma, Arial, sans-serif;
                  color: white;
                  background-color: #525D76;
              }
      
              P {
                  font-family: Tahoma, Arial, sans-serif;
                  background: white;
                  color: black;
                  font-size: 12px;
              }
      
              A {
                  color: black;
              }
      
              A.name {
                  color: black;
              }
      
              HR {
                  color: #525D76;
              }
      
              -->
          </style>
      </head>
      <body>
      <h1>
          HTTP Status 404 - {}
      </h1>
      <HR size='1' noshade='noshade'>
      <p><b>type</b> Status report</p>
      <p><b>message</b> <u>{}</u></p>
      <p><b>description</b>
          <u>The requested resource is not available.</u></p>
      <HR size='1' noshade='noshade'>
      <h3>JerryMice 1.0.0</h3>
      </body>
      </html>
      
  • 然後在Constant中將這個頁面解析成字串,這個字串中包含了兩個{}佔位符,這兩個佔位符是為了格式化輸出後面的請求uri的。

  •     /**
         * 404錯誤的頭部資訊
         */
        public final static String responseHead404 = "HTTP/1.1 404 Not Found\r\n" + "Content-Type: {}\r\n\r\n";
        /**
         * 將一些特殊響應的檔案都放在這個資料夾中
         */
        public final static File special_folder = new File(SystemUtil.get("user.dir"), "special");
        /**
         * 404錯誤的指定頁面
         */
        public final static File not_exist_html = new File(special_folder, "404.html");
        /**
         * 將這個頁面解析成字串
         */
        public final static String textFormat404 =FileUtil.readUtf8String(not_exist_html);
    
  • 在Server的init()方法中,判斷請求的uri是否有對應的檔案,如果沒有,則將404.html傳給response

    •     private static void handle404(Socket socket, String uri) throws IOException{
              OutputStream outputStream = socket.getOutputStream();
              String responseText = StrUtil.format(Constant.textFormat404, uri, uri);
              responseText = Constant.responseHead404 + responseText;
              byte[] responseBytes = responseText.getBytes(StandardCharsets.UTF_8);
              outputStream.write(responseBytes);
          }
      
    •  Context context = request.getContext();
                              if ("/".equals(uri)) {
                                  String html = "Hello, JerryMice";
                                  response.getWriter().println(html);
                              }
                              else {
                                  String fileName = StrUtil.removePrefix(uri, "/");
                                  File file = FileUtil.file(context.getDocBase(), fileName);
                                  if (file.exists()) {
                                      String fileContent = FileUtil.readUtf8String(file);
                                      response.getWriter().println(fileContent);
      
                                      if ("timeConsume.html".equals(fileName)) {
                                          ThreadUtil.sleep(1000);
                                      }
                                  }
                                  else {
                                      // 訪問檔案不存在的情況下
                                      handle404(socket, uri);
                                      return;
                                  }
                              }
                              handle200(socket, response);
      
  • 當服務啟動之後,使用瀏覽器去訪問一個不存在的頁面就會出現下面這種情況。

  • 這種顯示的風格和Tomcat一致。