一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳細聊聊Spring MVC重定向與轉發

詳細聊聊Spring MVC重定向與轉發

2021-12-22 13:12Dynasty Java教程

大家應該都知道請求重定向和請求轉發都是web開發中資源跳轉的方式,這篇文章主要給大家介紹了關于Spring MVC重定向與轉發的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

 

重定向和轉發

重定向經過客戶端,而轉發沒有,因此相對來說轉發更快速。但有時采用重定向更方便,如:

  1. 重定向到外部網站;
  2. 避免用戶重新加載頁面時再次調用同樣的動作。
?
1
return "redirect:/view/"+saveUser.getId();

這里使用重定向來防止當前用戶重新加載頁面時'''saveUser'''被二次調用。

但是使用重定向無法輕松地給目標頁面傳值,因此,在Spring3.1后提供了Flash屬性,詳情見后文。

 

常用處理方式

Controller 視圖方法間的跳轉,無非就是帶參跳轉和不帶參跳轉。常用的方法有通過 String 映射 RequestMapping 實現重定向,或者通過 ModelAndView 對象,又或者是 RedirectView 對象,下面逐一說明。

 

String 重定向

是 return 映射到另一個 Controller 方法的字符串。如果有請求參數,就拼接在 RequestMapping 映射的字符串后面。

?
1
2
3
4
5
6
7
// 返回字符串映射的方式
@RequestMapping("hello")
public String hello(HttpServletRequest req, HttpServletResponse resp) {
    doSomething();
    return "redirect:/bye";
    // return "redirect:/bye?username=sudoz";
}

 

ModelAndView 重定向

另一種方法是通過返回 ModelAndView 對象來實現跳轉。類似的,如果有請求參數,也可以通過類似 GET 參數拼接的方式:

?
1
2
3
4
5
6
7
// 返回 ModelAndView 對象
@RequestMapping("hello")
public ModelAndView hello(HttpServletRequest req, HttpServletResponse resp) {
    doSomething();
    return new ModelAndView("redirect:/bye");
    // return new ModelAndView("redirect:/bye?username=sudoz");
}

 

RedirectView 重定向

還有一種方法是通過返回 RedirectView 對象實現跳轉,該方法和上面的不同之處在于,RedirectView 對象不需要設置 redirect 前綴:

?
1
2
3
4
5
6
7
// 返回 RedirectView 對象
@RequestMapping("hello")
public RedirectView hello() {
    doSomething();
    return new RedirectView("/bye");
    // return new RedirectView("bye?username=sudoz");
}

 

帶參跳轉

Model在重定向時會丟失攜帶的消息

在做方法跳轉時,如果要把參數帶給下一個方法,像上面代碼里通過拼接 URL 參數的方法有時候并不實用。因為參數不一定都是是字符串,而且瀏覽器對 URL 的長度是有限制的。RedirectAttributes 對象可以用來保存請求重定向時的參數。利用 RedirectAttributes 改寫上面的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RequestMapping("/")
public RedirectView hello(RedirectAttributes attrs) {
    attrs.addAttribute("message", "hello");   
    attrs.addFlashAttribute("username", "world");
    return new RedirectView("hello");
}
 
@RequestMapping("hello")
    Map<String, String> hello(@ModelAttribute("message") String meaasge,
                              @ModelAttribute("username") String username) {
    Map<String, String> map = new HashMap();
    map.put("message", message);
    map.put("username", username);
    return map;
}

上面的代碼中,調用 addAttribute() 和 addFlashAttribute() 方法往 RedirectAttributes 對象中插入了兩個值,如果看源碼,就能知道,RedirectAttributes 接口的實現類 RedirectAttributesModelMap 繼承了 ModelMap,本質上就是 HashMap 的子類,因此可以用來存儲 Key-Value 對。這兩個方法都很常用,使用上也必然存在不同:

  • addAttribute() 方法會把 Key-Value 作為請求參數添加的 URL 的后面;
  • addFlashAttribute() 方法會把 Key-Value 暫存在 session 中,在跳轉到目標方法后,即完成任務,會從 session 中刪掉;

用 curl 命令來測試:

?
1
2
3
4
5
6
7
8
curl -i http://localhost:8080/
 
HTTP/1.1 302
Set-Cookie: JSESSIONID=D1CC5E15FA8EF9474C4CED7D4F660E66;path=/;HttpOnly
Location: http://localhost:8080/hello;jsessionid=D1CC5E15FA8EF9474C4CED7D4F660E66?username=sudoz
Content-Language: en-US
Content-Length: 0
Date: Thu, 16 Feb 2017 12:33:46 GMT

可以看到,通過 addAttribute() 添加的鍵值對變成了 URL 后面的參數,addFlashAttribute() 方法添加的鍵值對則沒有出現在 URL 上,而是存儲在了 session 中。跳轉的目標方法通過 @ModelAttribute("key")注解指定接收的參數。

 

redirect 和 forward 的區別

上面列出的 3 種方法,其實都是 Spring MVC 在處理請求時的重定向,即 redirect 跳轉。另一種分發請求的方式是轉發,即 forward。二者的區別從 HTTP 的規范中就明確:

  • redirect 的 HTTP 返回碼是 302,且跳轉的新 URL 會存儲在 HTTP Response Headers 的 Location 字段中。客戶端在接收到 Response 后,會發起另一次請求,這次請求的 URL 就是重定向的 URL;
  • forward 的轉發過程只發生在服務端;Servlet 容器會直接把源請求打向目標 URL,而不會經由客戶端發起請求;因此客戶端接收到的響應是來自轉發后的目標方法,但是瀏覽器呈現的 URL 卻并不會改變,且 forward 不能將參數轉發出去。

 

附:請求轉發與重定向的區別圖例

詳細聊聊Spring MVC重定向與轉發

詳細聊聊Spring MVC重定向與轉發

 

總結

到此這篇關于Spring MVC重定向與轉發的文章就介紹到這了,更多相關Spring MVC重定向與轉發內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7004694434784739336

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
主站蜘蛛池模板: 四虎影视永久在线精品免费 | 四虎免费入口 | 五花大绑esebdsm国产 | 国产馆精品推荐在线观看 | 成人依依网 | 精品国产综合区久久久久久 | 撕开老师的丝袜白丝扒开粉嫩的小 | 男人的天堂在线观看入口 | 青青青在线视频 | 欧美日韩专区国产精品 | 俄罗斯妈妈235| 国产伦精品一区二区三区免 | 亚洲AV人无码综合在线观看蜜桃 | 国产一级片免费视频 | 二区三区不卡不卡视频 | 好男人资源在线观看免费的 | 亚洲国产成人综合 | 黑人性xxxⅹxxbbbbb | 日韩在线天堂免费观看 | 亚洲AV无码专区国产精品麻豆 | 国内精品久久久久久久久久久久 | 亚洲香蕉网久久综合影院3p | 日日摸夜夜爽色婷婷91 | 91在线老师啪国自产 | 嫩草影院精品视频在线观看 | 国产在线欧美精品 | 欧美精品一区视频 | 日韩一级片在线观看 | 国产亚洲精品一区二区在线播放 | 免费看视频高清在线观看 | 色淫影院| 日韩欧美国产成人 | 美国雪白人妖sarina | 免费抽搐一进一出印度 | 国产区最新 | 日本大片免aaa费观看视频 | 四虎www| 美女又爽又黄免费 | 日产精品一二三四区国产 | 日韩拍拍拍 | 女主被男主做哭失禁高h |