1小时手写SpringMVC T5大牛带你解读Spring核心源码(附详细视频教程)

作者 : 开心源码 本文共4397个字,预计阅读时间需要11分钟 发布时间: 2022-05-12 共168人阅读

SpringMVC简介

SpringMVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,因为支持注解配置,易用性有了大幅度的提高。Spring 3.0更加完善,实现了对Struts 2的超越。现在越来越多的开发团队选择了Spring MVC。

  • Spring为展示层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一
  • Spring3.0后全面超越Struts2,成为最优秀的MVC框架
  • Spring MVC通过一套MVC注解,让POJO成为解决请求的控制器,而毋庸实现任何接口。
  • 支持REST风格的URL请求
  • 采用了松散耦合可插拔组件结构,比其余MVC框架更具扩展性和灵活性

SpringMVC运行流程

在开始之前,想提几个问题让大家思考一下:

1. 为什么要手写SpringMVC?
2. 如何手写一个SpringMVC?
3. 手写的SpringMVC真的可以跑起来吗?

话不多说,直接进入正题

1小时手写SpringMVC T5大牛带你解读Spring核心源码(附详细视频教程)

讲师简介

  • 1,3分钟读懂Spring核心源码;
  • 2,SpringMVC与Spring框架关系;
  • 3,SpringMVC的所有注解定义实战;
  • 4,手写SpringMVC框架实战;
  • 5,Tomcat加载进行测试实战;

为什么读Spring源码

Spring源码的核心组件

手写SpringMVC之前的那些事

1. @Controller, @Service 注解是什么
2. DispatcherServlet原理与机制

手写SpringMVC实战

SpringMVC九大组件

HandlerMapping

是用来查找Handler的。在SpringMVC中会有很多请求,每个请求都需要一个Handler解决,具体接收到一个请求之后使用哪个Handler进行解决,这就是HandlerMapping需要做的事。

HandlerAdapter

从名字上看,它就是一个适配器。由于SpringMVC中的Handler可以是任意的形式,只需能解决请求就ok,但是Servlet需要的解决方法的结构却是固定的,都是以request和response为参数的方法。如何让固定的Servlet解决方法调用灵活的Handler来进行解决呢?这就是HandlerAdapter要做的事情。
小结:Handler是用来干活的工具;HandlerMapping用于根据需要干的活找到相应的工具;HandlerAdapter是使用工具干活的人。

HandlerExceptionResolver

其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后需要有一个专门的角色对异常情况进行解决,在SpringMVC中就是HandlerExceptionResolver。具体来说,此组件的作用是根据异常设置ModelAndView,之后再交给render方法进行渲染。

ViewResolver

ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。这里就有两个关键问题:使用哪个模板?用什么技术(规则)填入参数?这其实是ViewResolver主要要做的工作,ViewResolver需要找到渲染所用的模板和所用的技术(也就是视图的类型)进行渲染,具体的渲染过程则交由不同的视图自己完成。

RequestToViewNameTranslator

ViewName是根据ViewName查找View,但有的Handler解决完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。RequestToViewNameTranslator在Spring MVC容器里只可以配置一个,所以所有request到ViewName的转换规则都要在一个Translator里面一律实现。

LocaleResolver

解析视图需要两个参数:一是视图名,另一个是Locale。视图名是解决器返回的,Locale是从哪里来的?这就是LocaleResolver要做的事情。LocaleResolver用于从request解析出Locale,Locale就是zh-cn之类,表示一个区域,有了这个即可以对不同区域的客户显示不同的结果。SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者者主题的时候。

ThemeResolver

用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源、如图片、css样式等。SpringMVC的主题也支持国际化,同一个主题不同区域也可以显示不同的风格。SpringMVC中跟主题相关的类有 ThemeResolver、ThemeSource和Theme。主题是通过一系列资源来具体表现的,要得到一个主题的资源,首先要得到资源的名称,这是ThemeResolver的工作。而后通过主题名称找到对应的主题(可以了解为一个配置)文件,这是ThemeSource的工作。最后从主题中获取资源即可以了。

MultipartResolver

用于解决上传请求。解决方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File,假如上传多个文件,还可以调用getFileMap得到FileName->File结构的Map。此组件中一共有三个方法,作用分别是判断是不是上传请求,将request包装成MultipartHttpServletRequest、解决完后清除上传过程中产生的临时资源。

FlashMapManager

用来管理FlashMap的,FlashMap主要用在redirect中传递参数。

SpringMVC工程结构与代码

该项目最终的工程文件及目录如下:

1、新建一个Maven项目,可以设置勾选自动生成web.xml,也可以自己手动增加,在pom.xml中导入javax.servlet-api,仅需要导入这一个包即可以啦。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>cn.edu.whu</groupId>    <artifactId>SpringMVCByHand</artifactId>    <version>1.0-SNAPSHOT</version>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <maven.compiler.source>1.8</maven.compiler.source>        <maven.compiler.target>1.8</maven.compiler.target>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>javax.servlet-api</artifactId>            <version>3.0.1</version>            <scope>provided</scope>        </dependency>    </dependencies></project>

2、在生成的web.xml中配置一个MyDispatcherServlet,用于阻拦符合“/”的请求,配置一个myapplication.properties文件,用于配置需要扫描的包名。

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">    <servlet>        <servlet-name>MyMVC</servlet-name>        <servlet-class>cn.edu.whu.MVCByHand.servlet.MyDispatcherServlet</servlet-class>        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>myapplication.properties</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>MyMVC</servlet-name>        <url-pattern>/*</url-pattern>    </servlet-mapping></web-app>

总结

因为文章篇幅起因,详细过程就不逐个展现了,需要更详细视频资料和思维导图的可以加一下技术交流分享群:“708 701 457”免费获取

同时我经过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,希望对想成为架构师的朋友有肯定的参考和帮助


说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 1小时手写SpringMVC T5大牛带你解读Spring核心源码(附详细视频教程)

发表回复