JavaWeb奢讨,使用servlet/jsp時頁面跳轉(zhuǎn)的兩種方式:轉(zhuǎn)發(fā)和重定向

一、兩種跳轉(zhuǎn)獲得對象的方式

1??獲得轉(zhuǎn)發(fā)對象getRequestDispatcher()
httpServletRequest.getRequestDispatcherServletContext.getRequestDispatcher();
2??獲得重定向?qū)ο髎endRedirect()
httpServletResponse.sendRedirect();

二早龟、區(qū)別

  1. RequestDispatcher.forward (轉(zhuǎn)發(fā))只能將請求轉(zhuǎn)發(fā)給同一個Web應(yīng)用中的組件案疲;而HttpServletResponse.sendRedirect (重定向)不僅可以重定向到當(dāng)前應(yīng)用程序中的其他資源祝沸,還可以重定向到同一個站點上的其他應(yīng)用程序中的資源矮烹,甚至是使用絕對URL重定向到其他站點的資源。如果傳遞給HttpServletResponse.sendRedirect (重定向)方法的相對URL以“/”開頭罩锐,它是相對于整個Web站點的根目錄奉狈;如果創(chuàng)建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對于當(dāng)前Web應(yīng)用程序的根目錄涩惑。
  2. 調(diào)用RequestDispatcher.forward (轉(zhuǎn)發(fā))的請求過程結(jié)束后仁期,瀏覽器地址欄保持初始的URL地址不變;而調(diào)用HttpServletResponse.sendRedirect (重定向)的訪問過程結(jié)束后,瀏覽器地址欄中顯示的URL會發(fā)生改變跛蛋,由初始的URL地址變成重定向的目標(biāo)URL熬的。
  3. HttpServletResponse.sendRedirect (重定向)對瀏覽器的請求直接作出響應(yīng),響應(yīng)的結(jié)果就是告訴瀏覽器去重新發(fā)出對另外一個URL的訪問請求赊级⊙嚎颍可以這樣理解,假設(shè)你去辦理某個執(zhí)照:
    【重定向】你先去了A局理逊。A局的人說:“這個事情不歸我們管橡伞,你得去B局”。然后晋被,你就從A局退了出來兑徘,自己又去了B局。

RequestDispatcher.forward (轉(zhuǎn)發(fā))在服務(wù)器端內(nèi)部將請求轉(zhuǎn)發(fā)給另外一個資源羡洛,瀏覽器只知道發(fā)出了請求并得到了響應(yīng)結(jié)果挂脑,并不知道在服務(wù)器程序內(nèi)部發(fā)生了轉(zhuǎn)發(fā)行為。還是辦理執(zhí)照:
【轉(zhuǎn)發(fā)】你先去了A局翘县,A局看了以后最域,知道這個事情實際應(yīng)該B局來管,但是他沒有把你退回來锈麸,而是讓你等一會兒,自己到后面辦公室聯(lián)系了B的人牺蹄,讓他們辦好后忘伞,送了過來。你只知道事情辦好了沙兰,卻不知道實際辦理的是另一個局的人氓奈。

  1. RequestDispatcher.forward (轉(zhuǎn)發(fā))的調(diào)用者與被調(diào)用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應(yīng)過程鼎天。轉(zhuǎn)發(fā)2次跳轉(zhuǎn)之間傳輸?shù)男畔⒉粫G失舀奶。
    HttpServletResponse.sendRedirect (重定向)調(diào)用者與被調(diào)用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應(yīng)過程斋射。重定向2次跳轉(zhuǎn)之間傳輸?shù)男畔G失(request范圍)育勺。
    對于同一個Web應(yīng)用程序的內(nèi)部資源之間的跳轉(zhuǎn),特別是跳轉(zhuǎn)之前要對請求進(jìn)行一些前期預(yù)處理罗岖,并要使用HttpServletRequest.setAttribute傳遞預(yù)處理結(jié)果涧至,那就應(yīng)該使用RequestDispatcher.forward (轉(zhuǎn)發(fā))。不同Web應(yīng)用程序之間的重定向桑包,特別是要重定向到另外一個Web站點上的資源的情況南蓬,都應(yīng)該使用HttpServletResponse.sendRedirect (重定向)
  2. 無論是轉(zhuǎn)發(fā),還是重定向赘方,在調(diào)用它們之前烧颖,都不能有內(nèi)容已經(jīng)被實際輸出到了客戶端。如果緩沖區(qū)中已經(jīng)有了一些內(nèi)容窄陡,這些內(nèi)容將被從緩沖區(qū)中清除倒信。

三、轉(zhuǎn)發(fā)和重定向的選擇

  1. 重定向的速度比轉(zhuǎn)發(fā)慢泳梆,因為瀏覽器還得發(fā)出一個新的請求鳖悠,所以如果在使用轉(zhuǎn)發(fā)和重定向都無所謂的時候建議使用轉(zhuǎn)發(fā)。
  2. 因為轉(zhuǎn)發(fā)只能訪問當(dāng)前Web的應(yīng)用程序优妙,所以不同Web應(yīng)用程序之間的訪問乘综,特別是要訪問到另外一個Web站點上的資源的情況,這個時候就只能使用重定向了套硼。

注意:
重定向有一個應(yīng)用場景:避免在用戶重新加載頁面時兩次調(diào)用相同的動作卡辰。當(dāng)我們提交產(chǎn)品表單的時候,執(zhí)行保存的方法將會被調(diào)用邪意,并執(zhí)行相應(yīng)的動作九妈。這在一個真實的應(yīng)用程序中,很有可能將表單中的所有產(chǎn)品信息加入到數(shù)據(jù)庫中雾鬼。但是如果在提交表單后,重新加載頁面策菜,執(zhí)行保存的方法就很有可能再次被調(diào)用晶疼,同樣的產(chǎn)品信息就將可能再次被添加。為了避免這種情況又憨,提交表單后蠢莺,你可以將用戶重定向到一個不同的頁面,這樣的話锄弱,這個網(wǎng)頁任意重新加載都沒有副作用棵癣;
但是狈谊,使用重定向的一個不便之處是壁榕,無法將值輕松地傳遞給目標(biāo)頁面。而采用轉(zhuǎn)發(fā)赎瞎,則可以簡單地將屬性添加到Model,使得目標(biāo)視圖可以輕松訪問牌里。由于重定向經(jīng)過客戶端,所以Model中的一切都會在重定向時丟失务甥。但幸運(yùn)的是牡辽,在Spring3.1版本以后,我們可以通過Flash屬性敞临,解決重定向時傳值丟失的問題态辛。
要使用Flash屬性,必須在Spring MVC的配置文件中添加一個挺尿。然后奏黑,還必須在方法上添加一個新的參數(shù)類型:org.springframework.web.servlet.mvc.support.RedirectAttributes。

如下所示:

@RequestMapping(value="saveProduct",method=RequestMethod.POST)
public String saveProduct(ProductForm productForm,RedirectAttributes re){
     //執(zhí)行產(chǎn)品保存的業(yè)務(wù)邏輯等
     //傳遞參數(shù)
     re.addFlashAttribute("message","The product is saved successfully");
    //執(zhí)行重定向
     return "redirect:/……";
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末编矾,一起剝皮案震驚了整個濱河市熟史,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窄俏,老刑警劉巖蹂匹,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裆操,居然都是意外死亡怒详,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門踪区,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吊骤,你說我怎么就攤上這事缎岗。” “怎么了白粉?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵传泊,是天一觀的道長。 經(jīng)常有香客問我鸭巴,道長眷细,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任鹃祖,我火速辦了婚禮溪椎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己校读,他們只是感情好沼侣,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歉秫,像睡著了一般蛾洛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雁芙,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天轧膘,我揣著相機(jī)與錄音,去河邊找鬼兔甘。 笑死谎碍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裂明。 我是一名探鬼主播椿浓,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闽晦!你這毒婦竟也來了扳碍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤仙蛉,失蹤者是張志新(化名)和其女友劉穎笋敞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荠瘪,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡夯巷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哀墓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趁餐。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖篮绰,靈堂內(nèi)的尸體忽然破棺而出后雷,到底是詐尸還是另有隱情,我是刑警寧澤吠各,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布臀突,位于F島的核電站,受9級特大地震影響贾漏,放射性物質(zhì)發(fā)生泄漏候学。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一纵散、第九天 我趴在偏房一處隱蔽的房頂上張望梳码。 院中可真熱鬧隐圾,春花似錦、人聲如沸边翁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽符匾。三九已至叨咖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啊胶,已是汗流浹背甸各。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留焰坪,地道東北人趣倾。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像某饰,于是被迫代替她去往敵國和親儒恋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容