diff --git a/spring/Spring core/SpringMVC.md b/spring/Spring core/SpringMVC.md index 07dd8df..48f24e0 100644 --- a/spring/Spring core/SpringMVC.md +++ b/spring/Spring core/SpringMVC.md @@ -58,3 +58,36 @@ preHandle方法会返回一个boolean值,可以通过指定该方法的返回 对于@ResponseBody或返回值为ResponseEntity的方法,postHandle不起作用,这些方法在HandlerAdapter中已经写入且提交了返回响应,时间位于postHandle之前。到postHandle方法执行时,已经无法再对响应做任何修改,如添加header也不再被允许。对于这些场景,可以**实现ResponseBodyAdvice或者声明一个ControllerAdvice**。 #### afterCompletion 调用时机位于DispaterServlet渲染view之后。 +### Exceptions +如果异常在request mapping过程中被抛出或者从request handler中被抛出,DispatcherServlet会将改异常委托给HandlerExceptionResolver chain来处理,通常是返回一个异常响应。 +如下是可选的HandlerExceptionResolver实现类: +1. SimpleMappingExceptionResolver:一个从exception class name到error view name的映射,用于渲染错误页面 +2. DefaultHandlerExceptionResolver:解析Spring MVC抛出的异常,并且将它们映射为Http状态码 +3. ResponseStatusExceptionResolver:通过@ResponseStatus注解来指定异常的状态码,并且将异常映射为Http状态码,状态码的值为@ResponseStatus注解指定的值 +4. ExceptionHandlerExceptionResolver:通过@Controller类内@ExceptionHandler方法或@ControllerAdvice类来解析异常 +#### Resolver Chain +可以声明多个HandlerExceptionResolver bean对象来声明一个Exception Resolver链,并可以通过指定order属性来指定resolver chain中的顺序,order越大,resolver在链中的顺序越靠后。 +#### exception resolver的返回规范 +HandlerExceptionResolver返回值可以按照如下规范返回: +- 一个指向ModelAndView的error view +- 一个空的ModelAndView,代表异常已经在该Resolver中被处理 +- null,代表该exception仍未被解析,resolver chain中后续的resolver会继续尝试处理该exception,如果exception在chain的末尾仍然存在,该异常会被冒泡到servlet container中 +#### container error page +如果exception直到resolver chain的最后都没有被解析,或者,response code被设置为错误的状态码(如4xx,5xx),servlet container会渲染一个默认的error html page。 +### 视图解析 +#### 处理 +类似于Exception Resolver,也可以声明一个view resolver chain,并且可以通过设置order属性来设置view resolver在resolver chain中的顺序。 +view resolver返回null时,代表该view无法被找到。 +#### 重定向 +以“redirect:”前缀开头的view name允许执行重定向,redirect:之后指定的是重定向的url。 +```shell +# 重定向实例如下 +# 1. 基于servlet context重定向 +redirect:/myapp/some/resource +# 2. 基于绝对路径进行重定向 +redirect:https://myhost.com/some/arbitrary/path +``` +> 如果controller的方法用@ResponseStatus注解标识,该注解值的优先级**高于**RedirectView返回的response status。 + +#### 转发 +以“forward:”前缀开头的view name会被转发。