springMVC原理解析

springMVC简介

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。

springMVC工作原理

在使用springMVC开发项目的时候,我们要做的就是先在web.xml下写好spring的监听器,以保证在程序运行的时候启动springMVC,然后在spring的xml配置文件中写好我们要扫描哪个java包下的.java文件,这个包下应该放的就是我们的controller,在controller中,需要加上@controller注解,然后在其中写我们的controller对应执行的方法就可以了。具体的搭建一个ssm框架(spring+springMVC+myBatis)请参见这篇博客:https://blog.csdn.net/qq_37856300/article/details/85079479

那么,这其中的原理是什么呢?

现在假设我们已经写好了一个基于springMVC的程序了,我们来一步步地看看程序执行的流程:

1.项目启动时读取web.xml文件中的spring监听器

当我启动一个javaWeb程序的时候,会首先读取web.xml配置文件,在这个配置文件中,有监听器拦截器之类的东西,springMVC的启动也是依赖于监听器的。监听器听着高大上,无非就是一个程序的入口,我们在web.xml中写了spring的监听器,那么spring就会随javaWeb程序启动。

如图,这就是写了一个监听器:
springMVC原理解析_第1张图片

2.加载springMVC配置

从上图中我们还可以看到,我们有一个路径写的是:spring/spring-*.xml
这个路径存储的是springMVC的配置文件,这样的写法会让程序去找路径下所有名字是:spring-任意字符 的xml文件
我们去看看这个文件:


<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	
	<context:component-scan base-package="com.qcbylearn" />
	
	<mvc:annotation-driven />
	
	<mvc:default-servlet-handler />
	
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/views/" />
		<property name="suffix" value=".jsp" />
	bean>
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="utf-8">property>
		<property name="maxUploadSize" value="10485760000">property>
		<property name="maxInMemorySize" value="40960">property>
	bean>
beans>

看其中的注释,启动自动扫描的那一行,那里写的是我们要去扫描带有@controller注解的类文件的路径,配置加载这一行的时候,就会使用java反射,用Class.forName(这个类的类名)获取到这个类的Class对象,然后通过Class对象获取这个类的方法。获取之后,需要保存下来,在springMVC中,有一个HandlerMapping(处理器映射器,记住这个名字,后面会用到),这个HandlerMapping的数据结构就是map,具有key和value,其中的key存储的就是我们@RequestMapping()中的路径,也就是我们的访问路径,value存储的是类信息和方法信息,所以当我们按照访问路径访问的时候就会自动找到这个类下的这个方法执行其中的逻辑。

下面我们来看一看用户访问时候的流程:

3.用户访问前端控制器DispatcherServlet

当用户发送了一个请求,springMVC中的前端控制器DispatcherServlet会首先接收到这个请求。DispatcherServlet相当于电脑的cpu,从名字就可以看出来,它是用来在接收请求之后调度指挥的。

4.DispatcherServlet调用HandlerMapping处理器映射器

这个映射器就是我们刚刚说的map结构的存储controller类,这里根据请求路径找到对应的方法之后,这个方法就是一个handler,HandlerMapping会把这个handler连同一堆 HandlerInterceptor(拦截器)封装到 HandlerExecutionChain对象中再返还给DispatcherServlet

5.DispatcherServlet根据Handler找到对应的HandlerAdapter去执行Handler

HandlerAdapter从字面上的意思是适配器,不同的Handler会对应不同的HandlerAdapter,就好像java代码必须由java虚拟机执行一样。

6.HandlerAdapter执行Handler并返回ModelAndView给DispatcherServlet

找到对应的HandlerAdapter之后,HandlerAdapter会执行Handler,这里的执行跟我们平时写一串代码然后执行可不一样,这里用到了java代理的知识,想要了解的小伙伴可以去学习一下。

7.DispatcherServlet指挥视图解析器ViewReslover解析视图并返回View给DispatcherServlet

说白了就是把你的ModelAndView的跳转路径和视图解析器中的前缀后缀拼接起来

8.DispatcherServlet根据View生成相应的视图,将Model数据填充到视图中

9.response响应给用户

流程图如下:
springMVC原理解析_第2张图片

你可能感兴趣的:(Java,JavaWeb,spring)