热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

11.1、Spring源码学习——SpringMVC之web.xml和DispatcherServet

文章目录前言SpringMVC是针对servlet请求的封装Maven依赖:本文版本4.3.17.RELEASESpringMVC的入口配置࿱

文章目录

      • 前言
      • SpringMVC 是针对 servlet 请求的封装
      • Maven依赖:本文版本 4.3.17.RELEASE
      • SpringMVC 的入口配置:web.xml
        • 配置处理器 DispatcherServlet
          • DispatcherServlet 默认加载文件 WEB-INF/servlet名称-servlet.xml
          • 自定义servlet 文件路径和名称
        • 的关系 及最佳实践
        • 最佳实践
        • org.springframework.web.servlet.PageNotFound noHandlerFound
      • 进入 DispatcherServlet
        • 先看下 DispatcherServlet 的类继承关系
        • SpringMVC 的默认配置文件加载:DispatcherServlet.properties
          • DispatcherServet 中的 static 代码块
          • DispatcherServlet.properties 文件
      • 参考资料


前言


体能状态先于精神状态,习惯先于决心,聚焦先于喜好。


SpringMVC 是针对 servlet 请求的封装


SpringMVC 为 我们提供了 完备、灵活、便捷的 servlet 请求解决方案。
其按照控制器、模型对象、分派器、处理程序解耦了整个 servlet 交互过程。
支持国际化配置、web请求、RESTful 风格请求、文件上传下载,并且和Spring 全家桶无缝隙搭配使用——尽管其更关注页面到服务器这部分。
SpringMVC 通过请求拦截、地址映射的方式组合请求和对应的处理器,然后将处理结果封装到模型对象,再由分派器


Maven依赖:本文版本 4.3.17.RELEASE


SpringMVC 基于 Spring ,其需要 Spring 基本的jar 包依赖,此外,作为 SpringMVC 的核心jar 的Maven 依赖如下


<dependency><groupId>org.springframeworkgroupId><artifactId>spring-webmvcartifactId><version>4.3.17.RELEASEversion>
dependency>

<dependency><groupId>org.springframeworkgroupId><artifactId>spring-test-mvcartifactId><version>1.0.0.M1version><scope>testscope>
dependency>

SpringMVC 的入口配置&#xff1a;web.xml


SpringMVC 一般就是一个 web 项目&#xff0c;需要 web.xml 作为整个项目的入口。
在该文件中必须的配置有两个&#xff1a;第一个是配置servlet 的拦截路径和处理器 org.springframework.web.servlet.DispatcherServlet的映射关系&#xff0c;第二个是配置加载文件


配置处理器 DispatcherServlet


我们可以直接使用 DispatcherServlet 加载所有的配置文件,但是不建议这么做,而是仅在这里加载 Controller 相关的Bean和页面跳转配置
而与Spring 基础功能相关的给到 ContextLoaderListener 来加载


DispatcherServlet 默认加载文件 WEB-INF/servlet名称-servlet.xml

DispatcherServlet 默认记载 servlet 配置文件名和你的应用配置名有关,比如
springmvc,它就会查找 WEB-INF/springmvc-servlet.xml
这个文件


自定义servlet 文件路径和名称

我们可以通过 为DispatcherServlet 自定义加载文件的位置和名称,并且,我们可以指定多个,如下

<servlet><servlet-name>springmvcservlet-name><servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class><init-param><param-name>contextConfigLocationparam-name><param-value>classpath:springmvc-servlet.xmlparam-value>init-param><load-on-startup>1load-on-startup><async-supported>trueasync-supported>servlet><servlet-mapping><servlet-name>springmvcservlet-name><url-pattern>/url-pattern>servlet-mapping>

的关系 及最佳实践


从职能上看, 都可以加载配置文件,且二者可以加载重复的文件,后者会覆盖前者
从可取代性看, 可以取代 ,但是不可被取代
默认加载文件为 WEB-INF/applicationContext.xml, applicationContext.xml 用于配置Spring 容器相关的基础功能Bean
默认加载文件为 WEB-INF/servlet名称-servlet.xml,servlet名称-servlet.xml用于配置Controller、视图解析器、拦截器等前端交互相关配置
二者都可以通过再定义的方式自定义配置文件的位置
总之, 的配置是必不可少的
从执行顺序看,会先运行,会后运行,但是启动阶段都会运行
从数量看,二者都可以配置多个,还能指定执行顺序


最佳实践


可以参考 SpringMVC 项目 (MAVEN) Spring MVC 入门之页面跳转


<context-param><param-name>contextConfigLocationparam-name><param-value>classpath:applicationContext.xmlparam-value>
context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener><servlet><servlet-name>springmvcservlet-name><servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class><init-param><param-name>contextConfigLocationparam-name><param-value>classpath:springmvc-servlet.xmlparam-value>init-param><load-on-startup>1load-on-startup><async-supported>trueasync-supported>
servlet><servlet-mapping><servlet-name>springmvcservlet-name><url-pattern>/url-pattern>
servlet-mapping>

org.springframework.web.servlet.PageNotFound noHandlerFound


如果你到项目只使用 DispatcherServlet 加载所有到配置文件,你应该不会遇到这个问题,但是当你搭配使用 ContextLoaderListener 和 DispatcherServlet 时,一定要注意,DispatcherServlet 用于加载当 servlet.xml 配置一定要连带配置 Controller 当bean,否则你的系统在访问时会报404,当然建议直接把 Controller 的bean 声明直接放入到 servlet.xml 文件中.可以参考 DispatcherServlet 必须一起加载SpringMVC 相关配置文件和Controller的bean,可以放到两个文件中


进入 DispatcherServlet


org.springframework.web.servlet.DispatcherServlet


先看下 DispatcherServlet 的类继承关系


可以看到&#xff0c;DispatcherServlet 间接实现了 Servlet &#xff0c;此外就是SpringMVC 自己的特性类或接口了

在这里插入图片描述

SpringMVC 的默认配置文件加载&#xff1a;DispatcherServlet.properties


DispatcherServet 中的 static 代码块

static {try {ClassPathResource resource &#61; new ClassPathResource("DispatcherServlet.properties", DispatcherServlet.class);defaultStrategies &#61; PropertiesLoaderUtils.loadProperties(resource);} catch (IOException var1) {throw new IllegalStateException("Could not load &#39;DispatcherServlet.properties&#39;: " &#43; var1.getMessage());}}

DispatcherServlet.properties 文件

DispatcherServet 中提供了一个 static 代码块&#xff0c;在类初始化阶段会加载默认配置文件&#xff0c;该文件在 spring-webmvc 包中
&#xff1e;该文件内容包含SpringMVC 默认的一些配置
在这里插入图片描述


参考资料


[1]、《Spring 源码深度解析》


推荐阅读
author-avatar
狮子胯下
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有