SpringMVC实现原理和SpringBootMVC实现原理

本文详细介绍了SpringMVC和SpringBootMVC的实现原理。SpringMVC通过DispatcherServlet作为核心,结合HandlerMapping、HandlerAdapter、ViewResolver等组件实现请求分发、处理和响应。SpringBootMVC则依赖于WebMvcAutoConfiguration实现自动配置,包括视图解析器、静态资源处理和格式转换器。内容涵盖了从请求接收、处理器映射到视图渲染的完整流程。
摘要由CSDN通过智能技术生成

SpringMVC实现原理和SpringBootMVC实现原理

一、MVC

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。

MVC主要作用是降低了视图与业务逻辑间的双向耦合。

MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

  • Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

  • View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

  • Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

二、SpringMVC实现原理

官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。

Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。

SpringMVC底层实现流程
底层实现流程
1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

我们假设请求的url为 : http://localhost:8080/SpringMVC/hello

如上url拆分成三部分:

  • http://localhost:8080 服务器域名
  • SpringMVC 部署在服务器上的web站点
  • hello 表示控制器

通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

2.HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。

3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

6.Handler让具体的Controller执行。

7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

10视图解析器将解析的逻辑视图名传给DispatcherServlet。

11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

源码简单解析MVC

在spring-webmvc的jar包下找到DispatcherServlet类,这是SpringMVC整个Web框架的核心和控制中心;
DispatcherServlet类
1.DispatcherServlet生成对象时,先对属性进行初始化的设置

public static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = DispatcherServlet.class.getName() + ".CONTEXT";
public static final String LOCALE_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".LOCALE_RESOLVER";
public static final String THEME_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_RESOLVER";
public static final String THEME_SOURCE_ATTRIBUTE = DispatcherServlet.class.getName() + ".THEME_SOURCE";

request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.getWebApplicationContext());
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);
request.setAttribute(THEME_SOURCE_ATTRIBUTE, this.getThemeSource());

2.DispatcherServlet接收到用户发来的请求,根据请求的URL调用处理器映射器来得到对应的处理器

@Nullable
    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
   
        if (this.handlerMappings != null) {
   
            Iterator var2 = this.handlerMappings.iterator();
            while(var2.hasNext()) {
   
                HandlerMapping mapping = (HandlerMapping)var2.next();
                HandlerExecutionChain handler = mapping.getHandler(request);//请求对应的处理器
                if (handler != null) {
   
                    return handler;
                }
            }
        }

        return null;
    }

3.处理器解析请求以后,DispatcherServlet根据解析到的信息调用处理器适配器来得到控制器

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
   
        if (this.handlerAdapters != null) {
   
            Iterator var2 = this.handlerAdapters.iterator();

            while(var2.hasNext()) {
   
                HandlerAdapter adapter = (HandlerAdapter)var2.next();
                if (adapter.supports(handler)) {
   
                    return adapter;
                }
            }
        }
        throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
    }

4.找到控制器后,由控制器Controller执行真正的处理请求的行为(根据请求调用service层对象访问数据库、得到数据、实现需求等࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值