前言
在浏览器输入url地址后回车,请求是怎样被处理并返回的?带着这个问题我对SpringMVC的执行过程进行了一下梳理。
框架
SpringMVC的原理如下图所示:
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器(Controller)处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
上面的图可能不太直观,看看下面这张图,实现表示SpringMVC帮我们做的,虚线是我们需要自己做的
图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
简要分析执行流程
- DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
如上url拆分成三部分:
http://localhost:8080 服务器域名
SpringMVC 部署在服务器上的web站点
hello表示控制器
通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
-
HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
-
HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
-
HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
-
HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
-
Handler让具体的Controller执行。
-
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
-
HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
-
DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
-
视图解析器将解析的逻辑视图名传给DispatcherServlet。
-
DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
-
最终视图呈现给用户。
总结过程如下:
用户发起请求,都会先到DispatcherServlet,DispatcherServlet根据请求找处理器映射器HandlerMapping,映射器根据请求url查找Handler,查找到具体的控制器(Controller)后返回DispatcherServlet,DispatcherServlet让处理器适配器去执行Controller,返回ModelAndView,然后根据视图解析器返回视图给用户。
简化为三部曲
1 适配请求看是干嘛的
2 具体controller的执行并返回
3 视图解析
而在spring中我们只需要做
1.controller层调业务层
2.设置视图返回的名字
注解@Controller
@Controller注解类型用于声明Spring类的实例是一个控制器
注解@RestController
用于前后端分离
@RestController是@Controller+@ResponstBody的组合注解,即返回的是String、Object、Json等实体对象,使用该注解无需再将对象转换为json发送到前端,@ResponstBody会自动解析成json发送。
注解@RequestMapping
-
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
-
为了测试结论更加准确,我们可以加上一个项目名测试 myweb
-
只注解在方法上面
@Controller public class TestController { @RequestMapping("/h1") public String test(){ return "test"; } }
访问路径:http://localhost:8080 / 项目名 / h1
-
同时注解类与方法
@Controller @RequestMapping("/admin") public class TestController { @RequestMapping("/h1") public String test(){ return "test"; } }
访问路径:http://localhost:8080 / 项目名/ admin /h1 , 需要先指定类的路径再指定方法的路径;
总结
大概就这些内容,最后强推一下狂神说的SpringMVC
https://blog.csdn.net/xiangminlu/article/details/105680357