簡單的Tomcat實現--3.1 404錯誤
阿新 • • 發佈:2020-08-05
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一致。