SpringMVC 工作原理
Spring MVC 的核心组件有哪些?
记住了下面这些组件,也就记住了 SpringMVC 的工作原理。
- DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。
- HandlerMapping:处理器映射器,根据 URL 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
- HandlerAdapter:处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler;
- Handler:请求处理器,处理实际请求的处理器。
- ViewResolver:视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端
SpringMVC 工作原理了解吗?
Spring MVC 原理如下图所示:
SpringMVC 工作原理的图解我没有自己画,直接图省事在网上找了一个非常清晰直观的,原出处不明。
流程说明(重要):
- 客户端(浏览器)发送请求, DispatcherServlet拦截请求。
- DispatcherServlet 根据请求信息调用 HandlerMapping 。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
- DispatcherServlet 调用 HandlerAdapter适配器执行 Handler 。
- Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
- ViewResolver 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View(视图渲染)。
- 把 View 返回给请求者(浏览器)
统一异常处理怎么做?
这个技术的需求是,希望像返回正常结果一样返回异常
实现思路是,
首先当在代码中需要抛出异常的时候,不要使用普通的exception,而要是用自己定义的异常类,把result枚举放入自定义的异常类中进行抛出
另外,负责异常处理的类一旦检测到有自定义的异常抛出就会截获这个异常,并且拆包,把枚举类放入result进行返回
@Data
public class MyException extends RuntimeException{
private ResultCodeEnum resultCodeEnum;
public MyException(ResultCodeEnum resultCodeEnum) {
this.resultCodeEnum = resultCodeEnum;
}
}
@Data
@ControllerAdvice//controller增强器
public class CommonExceptionHandler extends RuntimeException {
@ResponseBody
@ExceptionHandler(MyException.class)//当MyException被抛出就自动截获
public Result error(MyException e) {
return Result.build(null, e.getResultCodeEnum());
}
}