1. 程式人生 > >Java之 redirect 和 forward【整理】

Java之 redirect 和 forward【整理】

轉自:https://blog.csdn.net/qiuzhi__ke/article/details/50951117

return new ModelAndView(new RedirectView(this.getViewPage())); 
return new ModelAndView("redirect:/center/index.do"); 
new ModelAndView(new RedirectView("xxx.do"),"modelName",modelMap);
new ModelAndView(new RedirectView("xxx.do?msg=xyz");  

String 指定返回的檢視頁面名稱,結合設定的返回地址路徑加上頁面名稱字尾即可訪問到。
可以通過redirect/forward:url方式轉到另一個Action進行連續的處理。
可以通過redirect:url 防止表單重複提交 。
寫法如下:
return "forward:/center/index.do";
return "redirect:/index.jsp";
return "redirect:select.do";
return "forward:select.do?code=200&status=ok!";
return "redirect:/user/select.do";
redirect:這個關鍵字,這個關鍵字後面的就是你要重定向的請求路徑,
在同一controller中則不用使用"/"從根目錄開始,而如果是在不同的controller則一定要從根目錄(加“/”)開始。

帶引數重定向--RedirectAttributes
使用者儲存或修改後,為了防止使用者重新整理瀏覽器(F5)導致表單重複提交,一般在儲存或修改操作之後會redirect到一個結果頁面(不是forward),
同時攜帶引數,如操作成功的提示資訊。因為是Redirect,Request裡的attribute不會傳遞過去。Spring在3.1才提供了這個能力--RedirectAttributes。 
反覆按F5,操作成功的提示資訊也不會再次出來(總共只出現一次),效果很理想。

public String save(@ModelAttribute("group") Group group, RedirectAttributes redirectAttributes) {
    accountManager.saveGroup(group);
    redirectAttributes.addFlashAttribute("message", "操作成功");
    return "redirect:/account/group/";
}

@RequestMapping(value="/save.do", method=RequestMethod.POST)
public ModelAndView saveInfo(HttpServletRequest request, HttpServletResponse response){
  
     return new ModelAndView("center/index");
       
     response.sendRedirect(request.getContextPath() + "/service/record/list.do");
     return null;
     
     return new ModelAndView("redirect:" + "/center/index.do"); 
     return new ModelAndView("forward:" + "/center/index.do"); 
}

@RequestMapping(value="/save.do", method=RequestMethod.POST)
public String saveInfo(HttpServletRequest request, HttpServletResponse response){

     return "redirect:/account/index.do";

     return request.getContextPath() + "/service/record/list.do";

     return "redirect:/member/updateHead.do?url="+ url + "&errCode=" + errCode;

     return "v2/center/index"; (index檢視名字) 
}

@RequestMapping(value="/save.do", method=RequestMethod.POST)
public void saveInfo(HttpServletRequest request, HttpServletResponse response){

     response.sendRedirect(request.getContextPath() +  "/account/login.do");

     request.getRequestDispatcher("/center/index.do").forward(request, response);
}


ServletRequest介面中的getRequestDispatcher()方法的引數不但可以是相對於上下文根的路徑,而且可以是相對於當前Servlet的路徑。
例如:/myservlet和myservlet都是合法的路徑,如果路徑以斜槓(/)開始,則被解釋為相對於當前上下文根的路徑;
如果路徑沒有以斜槓(/)開始,則被解釋為相對於當前Servlet的路徑。

sendRedirect能夠處理相對 URL,自動把它們轉換成絕對URL,如果地址是相對的,沒有一個‘/’,那麼Web container就認為它是相對於當前的請求URI的。
比如,如果為response.sendRedirect("login.jsp"),則會從當前servlet 的URL路徑下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 
重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp.
如果為response.sendRedirect(" /login.jsp")則會從當前應用徑下查詢url:http://10.1.18.8:8081/login.jsp。

request.getRequestDispatcher(url).forward(request,response)是直接將請求轉發到指定URL,所以該請求 
能夠直接獲得上一個請求的資料,也就是說採用請求轉發,request物件始終存在,不會重新建立。

而response.sendRedirect(url)會新建request物件,所以上一個request中的資料會丟失。 
redirect 會首先發一個response給瀏覽器, 然後瀏覽器收到這個response後再發一個requeset給伺服器, 然後 
伺服器發新的response給瀏覽器. 這時頁面收到的request是一個新從瀏覽器發來的. 

forward 發生在伺服器內部, 在瀏覽器完全不知情的情況下發給了瀏覽器另外一個頁面的response. 這時頁面 
收到的request不是從瀏覽器直接發來了,可能己經用request.setAttribute在request裡放了資料.在轉到的頁 
面可直接用request.getAttribute獲得資料。

運用forward方法只能重定向到同一個Web應用程式中的一個資源。而sendRedirect方法可以讓你重定向到任何URL。
使用response.sendRedirect()位址列將改變 
使用request.getRequestDispatcher().forward(request,response)位址列中的資訊保持不變.

Servlet中,"/"代表Web應用的跟目錄。例如:"./" 代表當前目錄,"../"代表上級目錄。這種類似的表示,也是屬於相對路徑。

如果方法聲明瞭註解 @ResponseBody,則會直接將返回值輸出到頁面
@RequestMapping(value = "/something", method = RequestMethod.GET) 
@ResponseBody 
public String helloWorld()  { 
return"Hello World"; 
}
上面的結果會將文字"Hello World "直接寫到http響應流。

@RequestMapping("/welcome") 
public String welcomeHandler() { 
  return "center"; 
}
對應的邏輯檢視名為“center”,URL= prefix字首+檢視名稱 +suffix字尾組成。