知識庫 / Spring / Spring MVC RSS 訂閱

Spring 404 錯誤異常

Spring MVC
HongKong
4
01:11 PM · Dec 06 ,2025

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/greeting
WARN  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 中配置錯誤。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.