一、異常處理 Spring提供了多種方式將異常轉換為響應: 特定的Spring異常將會自動映射為指定的HTTP狀態碼 在預設情況下,Spring會將自身的一些異常自動轉換為合適的狀態碼,從而反饋給客戶端。實際上,如果沒有出現任何映射的異常,響應都會帶有500狀態碼。映射表如下: 自定義異常上可以添加 ...
一、異常處理
Spring提供了多種方式將異常轉換為響應:
- 特定的Spring異常將會自動映射為指定的HTTP狀態碼
在預設情況下,Spring會將自身的一些異常自動轉換為合適的狀態碼,從而反饋給客戶端。實際上,如果沒有出現任何映射的異常,響應都會帶有500狀態碼。映射表如下:
- 自定義異常上可以添加@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),即:當帶有@Controller 類中出現異常的時候,就交由這個類處理。
@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}"; }View Code
像這樣,如果最後的路徑會被解析為 /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"; }View Code