当前位置: 首页 > 后端技术 > Java

SpringMVC解析(一)概述

时间:2023-04-01 15:47:39 Java

SpringMVC是Spring提供的用于构建Web应用程序的框架。该框架遵循Servlet规范,负责接收和处理Servlet容器传递过来的请求,并将响应写回Response。SpringMVC以DispatcherServlet为核心,HandlerMapping等众多组件作为辅助组件,为用户封装了请求映射等底层逻辑,让用户更专注于处理业务逻辑。本文将简单介绍一下SpringMVC的整体结构。SpringMVC结构图SpringMVC是一个基于Servlet容器的Web应用框架。这里的Servlet容器通常是指Tomcat等服务容器。Servlet容器会负责监听端口消息并将其映射为一个Request/Response对象,然后交给Servlet实例处理。SpringMVC框架的核心是Servlet实例。这个实例在Spring中默认是DispatcherServlet。DispatcherServlet使用了很多Spring组件来辅助处理请求。其结构图如下所示。Servlet容器Servlet用于从Socket接收数据并将其处理为标准的ServletRequest和ServletResponse。其内部逻辑比较复杂。关于Tomcat容器的其他系列文章,我已经详细介绍了Tomcat的结构。下面简单介绍一下它的功能:接收socket请求可以是同步的也可以是异步的,阻塞的也可以是非阻塞的等等。处理请求中的协议,比如Http协议等。将请求路由到对应的servlet实例。核心组件DispatcherServletSpringMVC的核心组件是DispatcherServlet,它是SpringWeb请求的调度中心。其主要功能如下:在Spring容器启动阶段读取映射规则,如RequestMapping;当请求到来时,根据加载的请求map规则找到合适的处理方法;当请求处理过程中出现异常时,处理异常,如返回合适的接口或状态码;解析并返回View的主题、时区等信息;呈现返回的视图。请求映射HandlerMapping请求映射用于根据请求找到所有需要调用的方法,包括过滤器和处理方法。常用的请求映射是RequestMappingHandlerMapping。从名字可以看出这个HandlerMapping是一个用来处理@RequestMapping注解请求映射的类。该类的工作原理如下。可以看出,这个类的主要作用是在接收到请求后,依次获取所有需要调用的方法(主要包括拦截器和处理方法),然后对这些方法进行一一调用。拦截器HandlerInterceptor拦截器有点类似于Tomcat容器中的Valve。Spring的拦截器允许用户灵活定制请求处理前、请求处理后、请求完成三个阶段的操作,比如用户权限验证。拦截器的作用可以看上一节的图。Spring对拦截器的接口定义如下:}defaultvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableModelAndViewmodelAndView)throwsException{}defaultvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableExceptionex)throwsException{}}处理方法Handler处理该方法在DispatcherServlet中定义为Object类型。如果我们使用@RequestMapping根据请求找到处理方法,那么找到的处理方法就是HandlerMethod类型,对应Controller中添加的相应RequestMapping方法。从HandlerMapping获取的处理方法适配器HandlerAdapterDispatcherServlet是Object类型的,也就是说不同的处理方法可能返回不同的对象。DispatcherServlet本身是一个调度器,不应该关注如何调用不同的处理方法,所以Spring提供了HandlerAdapterList用户处理不同的调度方法。//处理方法合适的接口定义publicinterfaceHandlerAdapter{booleansupports(Objecthandler);@NullableModelAndView句柄(HttpServletRequest请求,HttpServletResponse响应,对象处理程序)抛出异常;longgetLastModified(HttpServletRequestrequest,Objecthandler);}异常处理HandlerExceptionResolverHandlerExceptionResolver用在请求处理过程中发生的异常类型其实有很多种,但是ExceptionHandlerExceptionResolver在我们日常开发中用的比较多,就是处理我们定义的@ExceptionHandler注解。@ExceptionHander的典型用法如下。@ExceptionHander也可以放在@ControllerAdvice注解的类中,也就是说对所有的Controller都会生效。@ControllerpublicclassSimpleController{//...@ExceptionHandlerpublicResponseEntityhandle(IOExceptionex){//...}}总结本文只是简单介绍SpingMVC的关键组件功能,后续文章会描述每个键组件的源代码被解析。本文首发于微信公众号,版权所有,禁止转载!