下图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
简要分析执行流程:
1.DispatcherServlet
表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求,
我们假设请求的url为:
http://localhost:82/SpringMVC/user/
如上url拆分成三部分:
(1)http://localhost:82 服务器域名
(2)http://localhost:82/SpringMVC/
//SpringMVC部署在服务器(http://localhost:82)上的web站点
(3)user 表示控制器UserController类上的requestMapping("/user")
通过分析,如上url表示为:请求位于服务器localhost:82上的SpringMVC站点的user控制器
2.HandlerMapping
为处理器映射。
DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler
3.HandlerExecution
表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:user
拦截请求,根据拦截规则处理后放行
4.HandlerExecution
将解析后的信息传递给DispatcherServlet,如解析控制器映射等
5.HandlerAdapter
表示处理器适配器,其按照特定的规则去执行Handler
6.Handler
Handler让具体的Controller执行
7.Controller
将具体的执行信息返回给HandlerAdapter,如ModelAndView
8.HandlerAdapter
将视图逻辑名或模型传递给DispatcherServlet
9.DispatcherServlet
调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名
10.视图解析器将解析的逻辑视图名传给DispatcherServlet
11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图
12.浏览器将最终视图呈现给用户。
总结
简单来说(筛选请求,执行请求,响应请求)
一.1234步骤,是拿到请求以后拦截了,做一些处理(比如权限校验),然后决定是否放行
二.5678步骤,是请求已经通过了拦截器,现在要传给Controller,然后将调用业务层得到的结果,封装成ModelAndView返回给前端控制器(复习拦截器,springMVC第二天,day54)
三.9,10步骤,拿到ModelAndView对象,就会请求视图解析器进行视图解析,得到View对象,然后再返还给前端控制器
四.11前端控制器最后拿到视图,以后,渲染视图,然后将模型里的数据填充到request域里面
( ServletContext、ServletRequest、HttpSession、PageContext ),
五.最后再请求跳转,或者是response把数据写到响应体里,返回给浏览器。
@Controller
@RequestMapping("/response")
public class ResponseController {
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径: /WEB-INF/pages/success.jsp
@RequestMapping("/testReturnString")
public String testReturnString(){
System.out.println("testReturnString");
return "success";
}
}
-
转发到页面
return “forward:/WEB-INF/pages/success.jsp”;
-
转发到其它的controller方法
return “forward:/response/testReturnModelAndView”;
-
重定向到页面
return “redirect:/redirect.jsp”;
-
重定向到其它的controller方法
return “redirect:/response/testReturnModelAndView”;
那我们后来的项目return都是return的啥?
-
增删改都是void,因为增删改不需要返回啥,有返回的Result包装的信息类
-
查询返回POJO对象或集合,return User,List
<
User>
,一样的
因为是自己定义的,所以要加@ResponseBody注解,但是因为类加了@RestController,所有方法默认都加了@ResponseBody
页面跳转这些都是由后台返回成功与否的信息,然后由前端进行跳转
这是由于前后端分离,后端不需要管前端怎么跳转和处理响应结果了。
详情链接: https://www.baidu.com/link?url=pZUPuTyw96mKzVXJEqT4Zp9twSyti_iF5owm12piIiPGhdnKcExOJ0Ct2aYoEuE4MMwcFJWvvyhKN3aFZgLxsq&wd=&eqid=887e939100059649000000065e09b1ea
处理器执行链详解:
https://www.baidu.com/link?url=i17nUHUpCnneVfvH_5WFynOVGeH6UHG81caliFMCRfrEHuwQHOZ9tSJHqDk79vimBWiE9jRJh9-8Q1QGppgrIy4_EnaqnXbCTAN_6ZD2OVq&wd=&eqid=dc19d13e000d41b2000000065e09c21a