Spring MVC的工作原理-从M(Model)-C(Controller)-V(View)

一、Spring MVC概念

MVC即是模型(Model)、视图(View)、控制器(Controller)的简称。其中M负责对应用数据进行封装,并向外提供应用功能的接口;V负责通过向控制器发送请求,得到响应结果,并向用户展示处理好的的应用数据;C这是用于定义应用的功能,接收用户的动作,并选择相应的视图。Spring MVC就相当于Spring的一个处理模型、视图和控制器的框架,下面我们来分析Spring MVC是如何处理请求,封装数据,再以特定的视图展示给用户的。

二、使用ContextConfigLocation在Web容器中使用IoC容器建立上下文

首先看基本的配置:

<servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- spring mvc的配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

先讲讲两个很重要的类,DispatcherServlet这个是Spring MVC的关键类,起着分发请求的作用,ContextConfigLocation是一个用于完成IoC容器在Web环境中的启动工作。通过ContextConfigLocation在Web环境中建立起一个上下文环境,然后把DispatcherServlet作为Spring MVC处理Web请求的转发器,从而完成相应前端http请求的准备工作。
在ContextConfigLocation可以看到两个核心的方法:

 //在Web环境中初始化上下文
 public void contextInitialized(ServletContextEvent event) {
        this.initWebApplicationContext(event.getServletContext());
    }
//销毁上下文
    public void contextDestroyed(ServletContextEvent event) {
        this.closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }

其中ContextConfigLocation启动的上下文为根上下文,同时还会创建一个用于保存DispatcherServlet所需要的MVC对象的子上下文,从而构成一个完成的上下文体系。这个上下文体系的建立是交给ContextConfigLocation的基类ContextLoader完成:

//创建子上下文
 this.context = this.createWebApplicationContext(servletContext);
//加载并创建根上下文
 ApplicationContext parent = this.loadParentContext(servletContext);

在ContextLoader中,完成了两个IoC容器(应用上下文)建立的基本过程,一个是在Web容器中建立起的双亲IoC容器,另一个是生成相应的WebApplicationContext并将其初始化。

三、DispatcherServlet的启动和初始化

DispatcherServlet作为一个Servlet,自然启动和初始化的过程与init()方法密切相关,下面示其基类HttpServletBean中定义的init()方法部分代码:

//获取Servlet的基本配置,同时对bean的属性进行设置
PropertyValues pvs = new HttpServletBean.ServletConfigPropertyValues(this.getServletConfig(), this.requiredProperties);
        if (!pvs.isEmpty()) {
            try {
                BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
                ResourceLoader resourceLoader = new ServletContextResourceLoader(this.getServle
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值