下图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

SpringMVC想单独执行某个service_视图解析器


简要分析执行流程:

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

页面跳转这些都是由后台返回成功与否的信息,然后由前端进行跳转

这是由于前后端分离,后端不需要管前端怎么跳转和处理响应结果了。