首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Spring MVC @PathVariable 接收 URL 路徑導致 404 的正確配置

     編輯:程式設計疑難解答

使用 @RequestMapping("/jsp/{page}") 配合 EasyUI 菜單 url: "/jsp/showitem.jsp" 時返回 404。原因在於 URL 模式匹配與視圖解析衝突。

問題分析

  • 請求 URL:/jsp/showitem.jsp
  • 控制器映射:/jsp/{page} → page = "showitem.jsp"
  • 返回視圖名:"showitem.jsp"
  • 視圖解析器(如 InternalResourceViewResolver)通常配置 prefix=/WEB-INF/jsp/、suffix=.jsp,最終解析路徑為 /WEB-INF/jsp/showitem.jsp.jsp(雙重 .jsp),找不到文件 → 404。

解決方案

方法 1:菜單 URL 不帶後綴,控制器返回邏輯視圖名

// EasyUI 菜單 JSON
{"menuid":"52","menuname":"商品列表","icon":"icon-nav","url":"showitem"}

// Controller
@RequestMapping("/jsp/{page}")
public String showItem(@PathVariable String page) {
    return page;  // 返回 "showitem"
}
// 視圖解析器自動拼接 → /WEB-INF/jsp/showitem.jsp

方法 2:菜單 URL 保留路徑,控制器提取文件名

// 菜單 url: "/jsp/showitem.jsp"
@RequestMapping("/jsp/{page:.+}")  // 正則匹配帶點的路徑
public String showItem(@PathVariable String page) {
    // page = "showitem.jsp",需去除 .jsp
    return page.replace(".jsp", "");
}

方法 3:直接映射具體路徑(推薦簡單場景)

@RequestMapping("/jsp/showitem")
public String showItem() {
    return "showitem";
}

控制器執行兩次的原因

日誌顯示 xxxxxxxxxxxxxxxx: showitem 打印兩次,通常是:

  1. DispatcherServlet 初始化時掃描映射觸發一次(檢查處理器)。
  2. 真實請求進來觸發第二次。

或因項目中存在兩個 DispatcherServlet(如 web.xml 配置了兩個或 Spring Boot 自動配置 + 手動配置重複)。檢查 web.xml 和配置類。

最佳實踐

  • 菜單 URL 使用邏輯路徑(不帶 .jsp),配合視圖解析器後綴。
  • 控制器返回純視圖名,解耦物理路徑。
  • 避免在 @PathVariable 中包含文件後綴,除非必要。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved