請求轉發,直接調用跳轉的頁面,讓它返回,,對於瀏覽器來說,它無法感覺服務器有沒有forward。地址欄不變
(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";
}
請求重定向,重定向是發一個302的狀態碼給瀏覽器,瀏覽器自己去請求跳轉的網頁,url改變,request數據不帶到重定向的方法中
對於請求轉發可以分為:1.帶參數 2.不帶參數
(1)帶參數
@RequestMapping(value="/redirect",method=RequestMethod.GET)
public String testRedirect(RedirectAttributes attr){
attr.addAttribute("a", "a");
attr.addFlashAttribute("b", "b");
return "redirect:/index.action";
}
帶參數可使用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" />1
設置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect屬性,這樣可以提高效率,避免不必要的檢索。
(2)無參數
@RequestMapping(value="/redirect",method=RequestMethod.GET)
public String testRedirect(){
return "redirect:/index.action";
}
public String testRedirect(){
return index.action;
}
# 這里index.action和testRedirect在一個springmvc中