1. 什么是MVC
mvc是一种设计模式,帮助使用者更好搭建和编写项目,在b/s,c/s架构中经常使用,mvc表示全称为Model-View-controller,即模型-视图-控制三层结构,三层每层负责不同的功能,其中,model层用于封装简单的javaBean和复杂的javaBean,包括业务层,甚至dao层,只要是个javabean都属于model(注意不要狭义的以为,java仅仅只是pojo对象,他也可以是一个包含复杂逻辑的service),pojo对象的代码都是包含的,视图层主要是页面,用于返回给用户的,直观的一种可视化的界面,比如jsp,html
2.什么是springMVC
SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,springMVC本质上是一个servlet,因为他间接的继承了httpServlet至于什么是servlet,本文就不做过多的解释了,可以参照我之前的博客链接如下:servlet教程
3.DispatcherServlet的继承关系图
DispatcherServlet的继承关系图,能清晰的了解整个层次。
4.DispatcherServlet初始化(此图很重要,下面有用到)
当Web项目启动时,做初始化工作,所以我们大部分是配置在Web.xml里面,这样项目一启动,就会执行相关的初始化工作,下面是Web.xml代码
springMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:Springmvc.xml
1
springMVC
(不拦截.jsp) 建议使用此种 方式 (拦截 .js.css .png) (放行静态资源) 3:/* 拦截所有请求(包括.jsp) 此种方式 不建议使用 -->
/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
既然DispatcherServlet是一个servlet,那么就一定会有执行init,service等方法, DispatcherServlet继承了FrameworkServlet,FrameworkServlet继承了HttpServletBean,HttpServletBean继承了HttpServlet 类,而HttpServletBean类有一个入口点就是重写了init方法,如图所示:
init方法里有涉及到了BeanWrapper,PropertyValues,ResourceLoader。我这里大概介绍一下
1.PropertyValues:获取Web.xml里面的servlet的init-param(web.xml)
2.BeanWrapper:封装了bean的行为,提供了设置和获取属性值,它有对应的BeanWrapperImpl
3.ResourceLoader:接口仅有一个getResource(String location)的方法,可以根据一个资源地址加载文件资源。classpath:这种方式指定SpringMVC框架bean配置文件的来源
4.1 PropertyValues
**
下面是PropertyValues源码讲解
public ServletConfigPropertyValues(ServletConfig config, SetrequiredProperties)
throws ServletException {
SetmissingProps = (requiredProperties != null && !requiredProperties.isEmpty()) ?
new HashSet(requiredProperties) : null;
//获取当前Servlet在web.xml中配置的名字,返回一个枚举对象
Enumerationen = config.getInitParameterNames();
//遍历
while (en.hasMoreElements()) {
//获取name,也就是我上图web.xml中的param-name里的值:contextConfigLocation
String property = en.nextElement();
//根据name获取值,也就是我上图web.xml中的param-value里的值:classpath:Springmvc.xml
Object value = config.getInitParameter(property);
addPropertyValue(new PropertyValue(property, value));
if (missingProps != null) {
missingProps.remove(property);
}
}
// Fail if we are still missing properties.
if (missingProps != null && missingProps.size() > 0) {
throw new ServletException(
"Initialization from ServletConfig for servlet '" + config.getServletName() +
"' failed; the following required properties were missing: " +
StringUtils.collectionToDelimitedString(missingProps, ", "));
}
}
}
如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级程序员群:180705916,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。