一、異常處理
Spring提供了多種方式将異常轉換為響應:
- 特定的Spring異常将會自動映射為指定的HTTP狀态碼
在預設情況下,Spring會将自身的一些異常自動轉換為合适的狀态碼,進而回報給用戶端。實際上,如果沒有出現任何映射的異常,響應都會帶有500狀态碼。映射表如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYDOiNmY1UTY3Q2N2EDZlZTZ2gzYidTO3UTZmRmYihzNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
- 自定義異常上可以添加@ResponseStatus注解,進而将其映射為某一個HTTP狀态碼
盡管這些内置映射是很有用的,但是當我們的業務系統出現RuntimeException時,如果Spring找不到對應的内置映射,就預設是500的狀态碼,如果我們不想要500的狀态碼呢?怎麼将我們自定義的Exception映射成想要的狀态碼呢?
1 /**
2 * value 要比對的異常狀态碼
3 * reson 提示的異常原因
4 */
5 @ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "Own Exception")
6 public class OwnException extends RuntimeException {
7 }
自定義異常類
- 在方法上可以添加@ExceptionHandler注解,使其用來處理異常
有很多時候,我們是不想把醜陋的報錯頁面直接展示給客戶來看的,常見的做法是:搭建一個友好的頁面,比如 error.jsp ,當發生異常的時候,傳回這個頁面給用戶端。但是五花八門的處理器方法,如果每個地方都做這樣的處理,我們的程式就會略顯臃腫......Spring 為我們 提供了一種控制器通知(@ControllerAdvice),即:當所有控制器中帶有@RequestMapping注解的方法上 出現異常的時候,就委托給這個類的@ExceptionHandler方法處理。
@ControllerAdvice
public class ExceptionHandle {
/**
* 當出現異常的時候,就傳回error頁面,當然可以多寫幾個ExceptionHandler 方法,細化你的異常處理
* @return
*/
@ExceptionHandler(value = Exception.class)
public String handleException(){
return "error";
}
}
View Code
二、跨重定向請求傳遞資料
在控制器方法傳回的String 視圖名稱中,如果以"redirect:"開頭,那麼這個String不是用來查找視圖的,而是用來指導浏覽器進行重定向的路徑。有些時候,我們希望浏覽器進行重定向後,有些資料是可以保留下來的,這聽起來不可思議,但SpringMVC為我們提供了兩種方案:
- 使用URL 模闆以路徑變量或查詢參數的形式傳遞資料
這種方式将參數放在路徑變量中傳遞,但是有一個缺點就是不能傳遞複雜的對象...
@RequestMapping(value = "/home",method = RequestMethod.GET)
public String getHome(Model model){
model.addAttribute("userName","userName");
model.addAttribute("id",123);
return "redirect:/home/{userName}";
}
像這樣,如果最後的路徑會被解析為 /home/userName?id=123
- 通過flash屬性發送資料
如果要傳遞一些對象要怎麼做呢?有一種方式就是在重定向前存在session中,在重定向後再從session中取出來,再清理session。實際上,這種方式是可行的,也是值得推薦的。而且以下介紹的這種(flash attribute)就是基于這個原理的。
/**
* 重定向前
* @param model RedirectAttributes ,保證對象在重定向的過程中存活下來
* @return
*/
@RequestMapping(value = "/list",method = RequestMethod.GET)
public String getList(RedirectAttributes model){
model.addAttribute("show","show");
List<String> list = new ArrayList<String>();
list.add("str");
model.addFlashAttribute("list",list); // flashAttribute
return "redirect:{show}";
}
/**
* 重定向後
* @param model
* @return
*/
@RequestMapping(value = "/show",method = RequestMethod.GET)
public String showList(Model model){
System.out.println(model.containsAttribute("list")); //true
return "home";
}