1. 簡介
Spring MVC 是一種基於 Front Controller 模式構建的傳統應用程序。<em >DispatcherServlet</em> 作為 Front Controller,負責請求路由和處理。
如任何 Web 應用程序或網站一樣,Spring MVC 在找不到請求資源時,會返回 HTTP 404 響應代碼。在本教程中,我們將探討 Spring MVC 中常見的 404 錯誤原因。
2. 可能的 404 響應原因
以下是一些可能導致 404 響應的原因:
- URL 錯誤: 用户輸入的 URL 可能存在拼寫錯誤、大小寫錯誤或路徑錯誤。
- 頁面已刪除或移動: 原始頁面可能已被刪除或移動到新的 URL。
- 服務器配置錯誤: 服務器配置可能導致某些 URL 未正確映射到相應的資源。
- DNS 解析問題: 域名解析可能出現問題,導致瀏覽器無法找到正確的服務器地址。
- 緩存問題: 瀏覽器或服務器緩存可能導致顯示過時的或不存在的頁面。
- 防火牆或安全設置: 防火牆或安全設置可能阻止用户訪問特定資源。
2.1. 錯誤的 URI
假設我們有一個名為 GreetingController,它被映射到 /greeting,並渲染 greeting.jsp。
@Controller
public class GreetingController {
@RequestMapping(value = "/greeting", method = RequestMethod.GET)
public String get(ModelMap model) {
model.addAttribute("message", "Hello, World!");
return "greeting";
}
}對應的視圖渲染 message變量的值:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>正如預期的那樣,向 /greeting 發送 GET 請求都有效。
curl http://localhost:8080/greeting我們將會看到一個包含消息“Hello World”的 HTML 頁面:
<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>Hello, World!</h2>
</body>
</html>以下是翻譯後的內容:
出現 404 錯誤的常見原因之一是使用錯誤的 URI。例如,使用 GET 請求 /greetings 而不是 /greeting 是錯誤的。
curl http://localhost:8080/greetings在這種情況下,我們會在服務器日誌中看到一條警告信息:
[http-nio-8080-exec-6] WARN o.s.web.servlet.PageNotFound -
No mapping found for HTTP request with URI [/greetings] in DispatcherServlet with name 'mvc'客户將看到一個錯誤頁面。
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Http Error Code : 404. Resource not found</h1>
</body>
</html>為了避免這種情況,我們需要確保我們已正確地輸入了 URI。
2.2. Servlet 映射錯誤
如前所述,DispatcherServlet 是 Spring MVC 中的前置控制器。因此,與基於 servlet 的標準應用程序類似,我們需要使用 web.xml 文件為 servlet 創建映射。
我們通過在 servlet 標籤中定義 servlet,並在 servlet-mapping 標籤中將其映射到 URI 來實現。我們需要確保 url-pattern 的值正確,因為經常會看到建議,servlet 被映射到 “/*” — 注意尾部的星號:
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<!-- Additional config omitted -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- Additional config omitted -->
</web-app>現在,如果我們請求 /greeting,我們會在服務器日誌中看到警告:
curl http://localhost:8080/greetingWARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI
[/WEB-INF/view/greeting.jsp] in DispatcherServlet with name 'mvc'本次錯誤提示顯示 greeting.jsp 未找到,用户看到的是空白頁面。
為了解決此問題,我們需要將 DispatcherServlet 映射為 “/” (不帶尾部星號):
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>在修復映射後,一切都應該正常工作。現在請求 /greeting 顯示消息“Hello, World!”:
curl http://localhost:8080/greeting<html>
<head>
<title>Greeting</title>
</head>
<body>
<h2>Hello, World!</h2>
</body>
</html>問題的根源在於,如果我們將 DispatcherServlet 映射到 /*,那麼我們就是在告訴應用程序,所有到達應用程序的請求都將被 DispatcherServlet 處理。然而,這並不是一種正確的做法,因為 DispatcherServlet 無法做到這一點。相反,Spring MVC 期望一個 ViewResolver 的實現來處理視圖,例如 JSP 文件。
3. 結論
在本文中,我們簡要介紹瞭如何調試 Spring MVC 中的 404 錯誤。我們探討了從 Spring 應用中收到 404 響應的兩個最常見原因。第一個原因是請求時使用了錯誤的 URI。第二個原因是將 DispatcherServlet 映射到 url-pattern 時,在 web.xml 中配置錯誤。