SpringMVC中的redirect和forward

spring mvc最後return 一個字符串,一般來說是webcontent 下面的一個頁面路徑,比如:

return "/WEB-INF/view/login.jsp";

 

上面這句就是說處理完一個請求之後,顯示login.jsp這個頁面,並且用request等一堆對象裏面的數據來渲染頁面,填充動態數據。


然後如果說return一個action的地址呢?我測試之後發現,有些情況是可以轉發的,這種方式像是forward的,會把參數傳遞到新的action中。但是有些不行,會報錯,說return的url不是一個路徑,也就是說不當它是一個action。這個倒也不重要,因爲根本不會這麼寫。

那如果真要return一個action呢?比如A action 跳到 B action ,而不是xxx.jsp,有兩種方式:

1.forward:

return "forward:/manage/login_check.htm";
這種方式的話,A中設置的參數在B中還可以得到,並且地址欄還是A action的地址。

這裏說一下能得到的參數,分兩種,一種是表單提交來的,即A中通過方法參數得到的,那麼B中也在action方法的參數列表中寫相同的參數,那麼可以得到。也就是request裏面的參數,只能在action的方法中看到。另外一種是A中放進response裏面,也能得到,當然只能在前臺用el顯示了。

2.redirect:

return "redirect:/manage/login_check.htm";
這種方式的話,A中設置的參數在B中無法得到,而且地址欄變成了B action的地址。

當時,A的response和request的都得不到。

搞清楚之後,那麼這些與表單提交有什麼關係?

比如我們有一個a.jsp頁面,裏面有一個表單form,還有一個list,然後交給了a action來處理,我們點擊提交以後,這個action會在list裏面增加一條數據,同時再返回a.jsp頁面。那麼我們肯定會在a action最後這樣寫:

return "/view/a.jsp";
當重新返回到a.jsp時,這時瀏覽器會緩存有之前提交的數據,我們刷新頁面,即使沒填表單,瀏覽器也會把之前填表單的緩存,提交到後臺,導致後臺又插入一條數據。
解決方式就是使用redirect到一個action,這樣會清除掉所有的參數,不會重複提交。

那麼重複提交的原因到底是什麼?

首先必須搞明白一點:我們再點刷新的時候,瀏覽器到底請求的是哪個地址?當一個表單第一次提交到一個action的時候,action會返回一個jsp頁面,但這個頁面只是一個結果的展示,瀏覽器地址欄的地址還是action的地址,這一點很重要!javaweb中用到的地址永遠是是一個action地址。如果我們此時點刷新,並不是刷新那個jsp的結果頁面,而是有訪問了一次那個action,那個action就會再做一次處理,這時候就相當於重複提交了!

如果用的是get傳參,那麼效果會更加直觀,當action返回了jsp結果視圖後,我們可以看到瀏覽器地址欄裏是action的地址,然後面還拼接了傳遞的參數,這個時候點擊刷新,結果就是用那些參數請求action,當然會重複了。
--------------------- 
版權聲明:本文爲CSDN博主「絕世好阿狸」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010900754/article/details/50553687

 

@RequestMapping(value = "/add")
	public String toAdd(HttpServletRequest request) {
		
		HttpSession session=request.getSession();
		//充session中獲取以sessionId爲key的字段來判斷表單是否提交過
		String checked=(String) session.getAttribute(session.getId());
		System.out.println(checked);
		
		if(null==checked||"".equals(checked)){
			System.out.println("沒有提交過");
		}else{
			System.out.println("提交過");
		}
		//清空session,session只當臨時使用
	        session.removeAttribute(session.getId()); 
                //這裏就可以傳值給前臺了
                request.setAttribute("name","value"); 
                return "jsps/stockOperation/addStock";
	}

--------------------- 
版權聲明:本文爲CSDN博主「sphinx1685」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sphinx1685/article/details/38663139
	@RequestMapping(value = "/addStock")
	public String addStock(String stockCode, String stockName, String area,
			String industry, String shareholders, Float holdingRatio,
			String mainBusiness, HttpServletRequest request) {
		HttpSession session=request.getSession();
		Stock stock=new Stock();
 
		if(stockService.saveStock("saveStock", stock)){
                   //添加成功就通過session傳值給要redirect的頁面
                   session.setAttribute(session.getId(), "sucess");
                   System.out.println("添加成功");
                }else{
                  session.setAttribute(session.getId(), "error");
                  System.out.println("添加失敗");
                }
                return "redirect:/add.html";}

總的來說就是通過session當臨時容器來傳遞狀態(成功,失敗,異常,錯誤)給redirect的頁面,redirect之後的頁面通過判斷session的內容要組織要渲染的數據給前臺,因爲session在toAdd這個方法這裏就清空了,對內存的幾乎沒有影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章