首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC Controller 間跳轉完全指南:redirect、forward、參數傳遞與 Flash 屬性最佳實踐

     編輯:Java 綜合教學

核心跳轉方式對比

三種參數傳遞模式實戰

1. 無參數跳轉(最簡單)

// 方式一:ModelAndView
return new ModelAndView("redirect:/user/list");

// 方式二:String(推薦,簡潔)
return "redirect:/user/list";

2. 參數拼接 URL(手動/RedirectAttributes 自動)

@RequestMapping("/save")
public String save(RedirectAttributes attr) {
    // 自動拼接:/user/list?id=100&name=Tom
    attr.addAttribute("id", 100);
    attr.addAttribute("name", "Tom");
    return "redirect:/user/list";
}

// 目標方法接收
@RequestMapping("/list")
public String list(@RequestParam("id") Long id, @RequestParam("name") String name) { ... }

注意:中文參數會自動 URL 編碼,但建議僅傳遞簡單類型(ID、狀態碼),複雜對象勿用此法。

3. 參數不顯示在 URL(Flash 屬性 —— 核心推薦)

@RequestMapping("/save")
public String save(UserForm form, RedirectAttributes attr) {
    String code = service.save(form);
    if ("000".equals(code)) {
        // 存入 FlashMap(底層用 Session,取一次即刪除)
        attr.addFlashAttribute("success", "保存成功!");
        attr.addFlashAttribute("userName", form.getName());
        return "redirect:/user/list";
    } else {
        // 失敗頁保留表單回顯數據
        attr.addFlashAttribute("error", "錯誤碼:" + code);
        attr.addFlashAttribute("form", form); // 回顯對象
        return "redirect:/user/add";
    }
}

// 目標頁直接用 EL 取值:${success}、${userName}、${form.name}
// 刷新頁面屬性自動消失,完美防重複提交提示

addAttribute vs addFlashAttribute 核心差異

方式語法請求次數數據攜帶URL 變化適用場景
重導向redirect:/path2 次(302 + 新請求)ModelAndView / RedirectAttributes瀏覽器地址欄更新POST 後跳轉、跨模組、防重複提交
轉發forward:/path1 次(服務端內部)request 域共享地址欄不變同模組內部流程、共享請求數據

進階配置:忽略默認 Model 提升性能

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="ignoreDefaultModelOnRedirect" value="true"/>
</bean>

開啟後,重導向時不會自動將 Model 所有屬性掃描並嘗試放入 URL,減少無謂序列化開銷。

常見坑與避雷

  • forward 後用 EL 取不到 Flash 屬性:Flash 僅支援 redirect,forward 請用 request.setAttribute。
  • 重導向到 JSP 直接失效:redirect:/page.jsp 會走 DispatcherServlet 再次解析,應重導向到 @RequestMapping 方法。
  • 中文參數亂碼:確保 Tomcat URIEncoding="UTF-8",且 Spring 配置 CharacterEncodingFilter。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性addAttributeaddFlashAttribute
存儲位置URL 參數Session(FlashMap)
生命週期永久(除非手動清理)下一次請求讀取後自動移除
適用數據簡單標識(ID、狀態)提示訊息、表單回顯、敏感數據
刷新行為參數保留數據消失(防重複提交)