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這個方法這裏就清空了,對內存的幾乎沒有影響。