最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細(xì)聊聊Spring MVC重定向與轉(zhuǎn)發(fā)

 更新時間:2021年09月07日 11:57:10   作者:Dynasty  
大家應(yīng)該都知道請求重定向和請求轉(zhuǎn)發(fā)都是web開發(fā)中資源跳轉(zhuǎn)的方式,這篇文章主要給大家介紹了關(guān)于Spring MVC重定向與轉(zhuǎn)發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

重定向和轉(zhuǎn)發(fā)

重定向經(jīng)過客戶端,而轉(zhuǎn)發(fā)沒有,因此相對來說轉(zhuǎn)發(fā)更快速。但有時采用重定向更方便,如:

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

這里使用重定向來防止當(dāng)前用戶重新加載頁面時'''saveUser'''被二次調(diào)用。

但是使用重定向無法輕松地給目標(biāo)頁面?zhèn)髦?,因此,在Spring3.1后提供了Flash屬性,詳情見后文。

常用處理方式

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

String 重定向

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

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

ModelAndView 重定向

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

// 返回 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 對象實現(xiàn)跳轉(zhuǎn),該方法和上面的不同之處在于,RedirectView 對象不需要設(shè)置 redirect 前綴:

// 返回 RedirectView 對象
@RequestMapping("hello")
public RedirectView hello() {
    doSomething();
    return new RedirectView("/bye");
    // return new RedirectView("bye?username=sudoz");
}

帶參跳轉(zhuǎn)

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

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

@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;
}

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

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

用 curl 命令來測試:

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 后面的參數(shù),addFlashAttribute() 方法添加的鍵值對則沒有出現(xiàn)在 URL 上,而是存儲在了 session 中。跳轉(zhuǎn)的目標(biāo)方法通過 @ModelAttribute("key")注解指定接收的參數(shù)。

redirect 和 forward 的區(qū)別

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

  • redirect 的 HTTP 返回碼是 302,且跳轉(zhuǎn)的新 URL 會存儲在 HTTP Response Headers 的 Location 字段中??蛻舳嗽诮邮盏?Response 后,會發(fā)起另一次請求,這次請求的 URL 就是重定向的 URL;
  • forward 的轉(zhuǎn)發(fā)過程只發(fā)生在服務(wù)端;Servlet 容器會直接把源請求打向目標(biāo) URL,而不會經(jīng)由客戶端發(fā)起請求;因此客戶端接收到的響應(yīng)是來自轉(zhuǎn)發(fā)后的目標(biāo)方法,但是瀏覽器呈現(xiàn)的 URL 卻并不會改變,且 forward 不能將參數(shù)轉(zhuǎn)發(fā)出去。

附:請求轉(zhuǎn)發(fā)與重定向的區(qū)別圖例

總結(jié)

到此這篇關(guān)于Spring MVC重定向與轉(zhuǎn)發(fā)的文章就介紹到這了,更多相關(guān)Spring MVC重定向與轉(zhuǎn)發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springAop實現(xiàn)權(quán)限管理數(shù)據(jù)校驗操作日志的場景分析

    springAop實現(xiàn)權(quán)限管理數(shù)據(jù)校驗操作日志的場景分析

    這篇文章主要介紹了springAop實現(xiàn)權(quán)限管理數(shù)據(jù)校驗操作日志的場景分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java實現(xiàn)單向鏈表的基本功能詳解

    Java實現(xiàn)單向鏈表的基本功能詳解

    這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)單向鏈表基本功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 在Mac OS上安裝Tomcat服務(wù)器的教程

    在Mac OS上安裝Tomcat服務(wù)器的教程

    這篇文章主要介紹了在Mac OS上安裝Tomcat服務(wù)器的教程,方便進(jìn)行工作環(huán)境下的Java web開發(fā),需要的朋友可以參考下
    2015-11-11
  • java常用數(shù)據(jù)流應(yīng)用實例解析

    java常用數(shù)據(jù)流應(yīng)用實例解析

    這篇文章主要介紹了java常用數(shù)據(jù)流應(yīng)用實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • MyBatis-Plus中提供的各種注解詳細(xì)說明

    MyBatis-Plus中提供的各種注解詳細(xì)說明

    這篇文章主要介紹了MyBatis-Plus中提供的各種注解詳細(xì)說明,下面對MyBatis-Plus提供的注解進(jìn)行整理,本文提供了部分示例代碼以方便理解,需要的朋友可以參考下
    2023-11-11
  • 詳細(xì)分析java 動態(tài)代理

    詳細(xì)分析java 動態(tài)代理

    這篇文章主要介紹了java 動態(tài)代理的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • java實現(xiàn)后臺數(shù)據(jù)顯示在前端

    java實現(xiàn)后臺數(shù)據(jù)顯示在前端

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)后臺數(shù)據(jù)顯示在前端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 基于Java實現(xiàn)馬踏棋盤游戲算法

    基于Java實現(xiàn)馬踏棋盤游戲算法

    這篇文章主要為大家詳細(xì)介紹了基于Java實現(xiàn)馬踏棋盤游戲算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring高階用法之自定義業(yè)務(wù)對象組件化

    Spring高階用法之自定義業(yè)務(wù)對象組件化

    這篇文章主要介紹了Spring高階用法之自定義業(yè)務(wù)對象組件化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringMVC+Mybatis二維碼實現(xiàn)多平臺付款(附源碼)

    SpringMVC+Mybatis二維碼實現(xiàn)多平臺付款(附源碼)

    本文主要實現(xiàn)微信支付寶等支付平臺合多為一的二維碼支付,并且實現(xiàn)有效時間內(nèi)支付有效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

龙陵县| 页游| 巴彦淖尔市| 云和县| 开平市| 凤翔县| 临沭县| 迁西县| 义马市| 民权县| 莱芜市| 凤山市| 靖西县| 密山市| 西林县| 勐海县| 凤台县| 筠连县| 游戏| 宜章县| 邹城市| 张家口市| 江口县| 绵阳市| 富平县| 卓尼县| 松阳县| 沁水县| 乡宁县| 泽州县| 屏东市| 琼结县| 汕尾市| 井冈山市| 沙洋县| 宁国市| 舒城县| 保德县| 宽甸| 南康市| 永昌县|