spring mvc controller間跳轉 重定向 傳參

url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/

1. 需求背景
??? 需求:spring MVC框架controller間跳轉,需重定向。有幾種情況:不帶參數跳轉,帶參數拼接url形式跳轉,帶參數不拼接參數跳轉,頁面也能顯示。

本來以為挺簡單的一件事情,并且個人認為比較常用的一種方式,一百度全都有了,這些根本不是問題,但是一百度居然出乎我的意料,一堆都不是我想要的結果。無奈啊,自己寫一篇比較全都供以后大家一百度吧,哈哈哈。。。是這些寫的不是很全都人們給了我寫這篇博客的動力。
2. 解決辦法
??? 需求有了肯定是解決辦法了,一一解決,說明下spring的跳轉方式很多很多,我這里只是說一些自我認為好用的,常用的,spring分裝的一些類和方法。

??? (1)我在后臺一個controller跳轉到另一個controller,為什么有這種需求呢,是這樣的。我有一個列表頁面,然后我會進行新增操作,新增在后臺完成之后我要跳轉到列表頁面,不需要傳遞參數,列表頁面默認查詢所有的。
??????? 方式一:使用ModelAndView
??????? return new ModelAndView("redirect:/toList");
??????? 這樣可以重定向到toList這個方法
??????? 方式二:返回String
??????????????????? return "redirect:/ toList ";?
??????? 其它方式:其它方式還有很多,這里不再做介紹了,比如說response等等。這是不帶參數的重定向。

??? (2)第二種情況,列表頁面有查詢條件,跳轉后我的查詢條件不能丟掉,這樣就需要帶參數的了,帶參數可以拼接url

??????? 方式一:自己手動拼接url

??????????????????? new ModelAndView("redirect:/toList?param1="+value1+"&param2="+value2);
??????????????????? 這樣有個弊端,就是傳中文可能會有亂碼問題。

??????? 方式二:用RedirectAttributes,這個是發現的一個比較好用的一個類
??????????????????? 這里用它的addAttribute方法,這個實際上重定向過去以后你看url,是它自動給你拼了你的url。
??????????????????? 使用方法:

???????????????????? attr.addAttribute("param", value);
??????????????????? return "redirect:/namespace/toController";
??????????????????? 這樣在toController這個方法中就可以通過獲得參數的方式獲得這個參數,再傳遞到頁面。過去的url還是和方式一一樣的。

??? (3)帶參數不拼接url頁面也能拿到值(重點是這個)
??????????? 一般我估計重定向到都想用這種方式:

??????????? @RequestMapping("/save")
??? public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
?????????????????? throws Exception {


??????? String code =? service.save(form);
??????? if(code.equals("000")){
??????????? attr.addFlashAttribute("name", form.getName());??
??????????? attr.addFlashAttribute("success", "添加成功!");
??????????? return "redirect:/index";
??????? }else{
??????????? attr.addAttribute("projectName", form.getProjectName());??
??????????? attr.addAttribute("enviroment", form.getEnviroment());??
??????????? attr.addFlashAttribute("msg", "添加出錯!錯誤碼為:"+rsp.getCode().getCode()+",錯誤為:"+rsp.getCode().getName());
??????????? return "redirect:/maintenance/toAddConfigCenter";
??????? }
??? }


@RequestMapping("/index")
?????

??? public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr)
?????????????????? throws Exception {
??????????? return "redirect:/main/list";
??? }
頁面取值不用我說了吧,直接用el表達式就能獲得到,這里的原理是放到session中,session在跳到頁面后馬上移除對象。所以你刷新一下后這個值就會丟掉。
3. 總結
??? 最底層還是兩種跳轉,只是spring又進行了封裝而已,所以說跳轉的方式其實有很多很多種,你自己也可以封一個,也可以用最原始的response來,也沒有問題。好了,就到這兒。

??? 其實也沒有什么,但是知道了這個就很簡單了,之前沒搞懂,現在搞懂了,和大家分享。有問題的給我留言。

?

?

?

spring mvc3中的addFlashAttribute方法

url:?http://www.software8.co/wzjs/java/2943.html
記得在spring mvc2中,當保存POJO到數據庫后,要返回成功頁面,如果這個時候要帶點信息,?
則要這樣:?
Java代碼: ?
  1. ? ? //第三個參數(UserModel user)默認為綁定對象 ?
  2. ? ? @RequestMapping(value = "/user/save", method = RequestMethod.POST) ?
  3. ? ? public ModelAndView saveUser(HttpServletRequest request, HttpServletResponse response,UserModel user) throws Exception { ?
  4. ? ? ? ? ModelAndView mv = new ModelAndView("/user/save/result");//默認為forward模式 ?
  5. // ? ? ?ModelAndView mv = new ModelAndView("redirect:/user/save/result");//redirect模式 ?
  6. ? ? ? ? mv.addObject("message","保存用戶成功!"); ?
  7. ? ? ? ? return mv; ?
  8. ? ? } ?
而在spring mvc 3.1后,可以這樣?
Java代碼: ?
  1. @RequestMapping(value = "/user/save", method = RequestMethod.POST) ?
  2. public ModelAndView saveUser(UserModel user, RedirectAttributes redirectAttributes) throws Exception { ?
  3. ? ? redirectAttributes.addFlashAttribute("message", "保存用戶成功!");//使用addFlashAttribute,參數不會出現在url地址欄中 ?
  4. ? ? return "redirect:/user/save/result"; ?
  5. } ?
來個稍微完整點的例子,首先是一個表單,在其中填入一些信息:?
Java代碼:?
  1. <form:form id="myform" action="saveUserDetails.action" method="POST" commandName="user"> ?
  2. ? ?<form:input type="text" name="firstName" path="firstName"/> ?
  3. ? ?<form:input type="text" name="lastName" path="lastName"/> ?
  4. ? ?<form:input type="text" name="email" path="email"/> ?
  5. ? ?<input type="submit" value="submit"> ?
  6. </form:form> ?
則在controller中,可以這樣:?
Java代碼: ?
  1. ? ? ? ?@RequestMapping(value="/saveUserDetails.action", method=RequestMethod.POST) ?
  2. public?String?greetingsAction(@Validated User user,RedirectAttributesredirectAttributes){ ?
  3. ? ? ? ? ? ? ??
  4. ? ? ? ? ? ? ? ?someUserdetailsService.save(user); ?
  5. ? ? ??
  6. ? ? ? ? ? ? ? ?redirectAttributes.addFlashAttribute("firstName", user.getFirstName()); ?
  7. ? ??redirectAttributes.addFlashAttribute("lastName", user.getLastName()) ?
  8. ??? return "redirect:success.html"; ?
  9. } ?
  10. ?
  11. ?
  12. ? success.html:?
  13. <div>?
  14. <h1>Hello ${firstName} ${lastName}. Your details stored in our database.</h1>?
  15. </div><br>?
但如果F5的時候,會發現參數丟失,因為flash scope其實只支持redirect的,所以可以判斷下:?
Java代碼:?
  1. @RequestMapping(value="/success.html", method=RequestMethod.GET) ?
  2. ? ? public String successView(HttpServletRequest request){ ?
  3. ? ? ??? Map<String,?> map = RequestContextUtils.getInputFlashMap(request); ??
  4. ? ? ? ? if (map!=null) ?
  5. ? ? ? ? ? ?return "success"; ?
  6. ? ? ? ? else return "redirect:someOtherView"; //給出其他提示信息

?

spring mvc 如何請求轉發和重定向呢?

url:?http://blog.sina.com.cn/s/blog_9cd9dc7101016abw.html

?

往下看:

由于這部分內容簡單,一帶而過了。

?

1.請求轉發:

???(1)返回ModelAndView?:

@RequestMapping(value="/model",method=RequestMethod.GET)
public ModelAndView testForward(ModelAndView ???model,@RequestParam(value="id",defaultValue="1",required=false)Long id){
?????User u = getBaseService().get(User.class, id);
?????model.addObject("user", u);
?????model.setViewName("forward:index.jsp");
?????return model;
}

?如上代碼,如果返回modelAndView 則可以如紅色標注,添加forward即可,若想重定向,可把forward替換成redirect便可達到目的。

?

(2)返回字符串

?

@RequestMapping(value="/forward",method=RequestMethod.GET)
????public String testForward(){

????????return "forward:/index.action";
????}

?如上代碼紅色部分。

?

2.請求重定向

?對于請求轉發可以分為:1.帶參數 2.不帶參數

?

(1)帶參數:

?

Java代碼??收藏代碼
  1. @RequestMapping(value="/redirect",method=RequestMethod.GET)??
  2. public?String?testRedirect(RedirectAttributes?attr){??
  3. ?????attr.addAttribute("a",?"a");??
  4. ?????attr.addFlashAttribute("b",?"b");??
  5. ?????return?"redirect:/index.action";??
  6. }??

?

?帶參數可使用RedirectAttributes參數進行傳遞:

??????注意:1.使用RedirectAttributes的addAttribute方法傳遞參數會跟隨在URL后面,如上代碼即為http:/index.action?a=a

??????????????2.使用addFlashAttribute不會跟隨在URL后面,會把該參數值暫時保存于session,待重定向url獲取該參數后從session中移除,這里的redirect必須是方法映射路徑,jsp無效。你會發現redirect后的jsp頁面中b只會出現一次,刷新后b再也不會出現了,這驗證了上面說的,b被訪問后就會從session中移除。對于重復提交可以使用此來完成.

?

??????另外,如果使用了RedirectAttributes作為參數,但是沒有進行redirect呢?這種情況下不會將RedirectAttributes參數傳遞過去,默認傳forward對應的model,官方的建議是:


p:ignoreDefaultModelOnRedirect="true" />

?設置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect屬性,這樣可以提高效率,避免不必要的檢索。

?

?

(2)無參數

?

@RequestMapping(value="/redirect",method=RequestMethod.GET)
public String testRedirect(){

return "redirect:/index.action";
}

轉載于:https://www.cnblogs.com/likeju/p/4702507.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374690.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

尋找數組的中心索引

給你一個整數數組 nums &#xff0c;請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標&#xff0c;其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端&#xff0c;那么左側數之和視為 0 &#xff0c;因為在下標的左側不存在元素。這一點…

STL sector 應用

1 #include <iostream>2 #include <string>3 #include <vector>4 #include <cstdio>5 using namespace std;6 int n;7 vector<int> pile[30];8 9 //找到a所在pile和height&#xff0c;以應用的形式返回調用者&#xff0c; 10 void find_block(in…

將Jersey與Spring整合

Spring提供了很多好處&#xff0c;并通過其依賴項注入機制&#xff0c;應用程序生命周期管理和Hibernate支持&#xff08;僅舉幾例&#xff09;促進了最佳實踐。 另外&#xff0c;當您想擁有干凈的類似于REST的服務器端JSON Api時&#xff0c;我發現Jersey非常方便。 本文簡要介…

JAVAWEB 生成excel文字在一格顯示兩位不變成#號

在用java生成excel的時候會發現這種問題&#xff0c; 如果是人家給的模板還好&#xff0c;如果不是模板&#xff0c;而是通過代碼生成的話&#xff0c; 就需要進行處理了&#xff0c; 一個小單元格&#xff0c;如果是一位的話&#xff0c;如1-9顯示沒有問題&#xff0c;一旦是兩…

力扣面試題 01.07. 旋轉矩陣

給你一幅由 N N 矩陣表示的圖像&#xff0c;其中每個像素的大小為 4 字節。請你設計一種算法&#xff0c;將圖像旋轉 90 度。 不占用額外內存空間能否做到&#xff1f; 代碼一 思路&#xff1a;對于矩陣中第 ii 行的第 jj 個元素&#xff0c;在旋轉后&#xff0c;它出現在倒數…

依賴注入–手動方式

依賴注入是一種將行為與依賴解決方案分開的技術。 用簡單的話來說&#xff0c;它允許開發人員定義具有特定功能的類&#xff0c;這些功能取決于各種協作者&#xff0c;而不必定義如何獲取對這些協作者的引用。 以此方式&#xff0c;實現了各個組件之間的解耦&#xff0c;并且通…

一個疏忽引發的思考!(strerror)

前幾天寫代碼因為自己的疏忽導致一遍又一遍的Segmentation fault (core dumped)。該問題是因為strerror&#xff08;errno&#xff09;返回的指針指向非法的內存導致程序打印錯誤時崩潰。 嘗試數次無果&#xff0c;為了進度。簡單粗暴的換成了perror(str)。今天忙里偷閑&#x…

力扣面試題 01.08. 零矩陣

編寫一種算法&#xff0c;若M N矩陣中某個元素為0&#xff0c;則將其所在的行與列清零 代碼一思路&#xff1a; 第一次遍歷時記錄&#xff0c;用兩個布爾類型數組標記行和列中是否有0元素&#xff1b; 第二次遍歷時置零 class Solution {public void setZeroes(int[][] matr…

Java最佳實踐–字符串性能和精確字符串匹配

在使用Java編程語言時&#xff0c;我們將繼續討論與建議的實踐有關的系列文章&#xff0c;我們將討論String性能調優。 我們將專注于如何有效地處理字符串創建&#xff0c; 字符串更改和字符串匹配操作。 此外&#xff0c;我們將提供我們自己的用于精確字符串匹配的最常用算法的…

mac下開發環境常用操作與命令

【1】 修改hosts文件 vim /private/etc/hosts轉載于:https://www.cnblogs.com/zsmynl/p/4714492.html

keil里面填數據

編譯后寄存器和堆棧的內存數據可以直接寫進去的。 寄存器&#xff0c;雙擊就可以&#xff0c;注意里面是十六進制 堆棧&#xff0c;也是十六進制&#xff0c;八位的 00 00 00 00 &#xff0c;但這個是從右到左的&#xff0c;比如0x00000006 應該填 06 00 00 00 把數據取出來 取…

力扣498. 對角線遍歷

給你一個大小為 m x n 的矩陣 mat &#xff0c;請以對角線遍歷的順序&#xff0c;用一個數組返回這個矩陣中的所有元素。 代碼思路&#xff1a;以第一行和右邊最后一列作為每輪的開始元素&#xff0c;先用temp存儲&#xff0c;全部按 從左上到右下 的順序遍歷&#xff0c;但是…

調試生產服務器– Eclipse和JBoss展示

您是否編寫有錯誤的代碼&#xff1f; 不&#xff0c;當然不。 對于我們其余的確實會編寫帶有錯誤的代碼的凡人&#xff0c;我想解決一個非常敏感的問題&#xff1a;調試在生產服務器上運行的應用程序。 因此&#xff0c;您的應用程序已準備好進行部署。 單元測試全部成功&…

ubuntu server獲取并自動設置最快鏡像的方法

一&#xff0c;安裝方法1 add-apt-repository ppa:ossug-hychen/getfastmirrorapt-get install getfastmirror 如果添加了臨時源&#xff0c;這樣移除add-apt-repository --remove ppa:ossug-hychen/getfastmirror 二&#xff0c;安裝方法2 wget -O getfastmirror-master.zip h…

linux之x86裁剪移植---ffmpeg的H264解碼顯示(420、422)

在虛擬機上yuv420可以正常顯示 &#xff0c;而945&#xff08;D525&#xff09;模塊上卻無法顯示 &#xff0c;后來驗證了directdraw的yuv420也無法顯示 &#xff0c;由此懷疑顯卡不支持 &#xff0c;后把420轉換為422顯示。420顯示如下&#xff1a;/* 編譯命令&#xff1a;arm…

Spring依賴注入技術的發展

回顧Spring框架的歷史&#xff0c;您會發現實現依賴注入的方式在每個發行版中都在增加。 如果您使用該框架已經超過一個月&#xff0c;那么在這篇回顧性文章中可能不會發現任何有趣的東西。 除了Scala中的最后一個示例&#xff0c;沒有其他希望&#xff0c;這種語言在Spring中意…

JS encode decode

網上查到的全都是escape&#xff0c;和需要的編碼不是一回事&#xff0c;好不容易找到的結果 保存下來以備以后使用js對文字進行編碼涉及3個函數&#xff1a;escape,encodeURI,encodeURIComponent&#xff0c;相應3個解碼函數&#xff1a;unescape,decodeURI,decodeURIComponen…

流媒體服務器 筆記

1.sip服務器回SBC Port Unreachable 說明轉碼器接收RTCP的端口沒有打開 轉載于:https://www.cnblogs.com/luoyinjie/p/7219359.html

力扣151. 翻轉字符串里的單詞

給你一個字符串 s &#xff0c;逐個翻轉字符串中的所有 單詞 。 單詞 是由非空格字符組成的字符串。s 中使用至少一個空格將字符串中的 單詞 分隔開。 請你返回一個翻轉 s 中單詞順序并用單個空格相連的字符串。 沒思路&#xff0c;看到的官方給的&#xff0c;簡潔明了&…

Spring 3 HornetQ 2.1集成教程

通過Spring框架使用JBoss的新超高性能消息傳遞系統。 HornetQ是一個開放源代碼項目&#xff0c;用于構建多協議&#xff0c;可嵌入&#xff0c;非常高性能的集群異步消息傳遞系統。 它是用Java編寫的&#xff0c;并且可以在具有Java 5或更高版本運行時的任何平臺上運行。 Horn…