这两天梳理了一下 SSM 的配置,做一个小总结
 
可能有一些不对的地方,如果您发现了什么错误,非常希望能帮忙指出,谢谢
我参考了很多文章,都标明了来源(链接),可能会影响阅读的连贯性,抱歉
 
1、Tomcat 的角色是什么?
web 服务器、应用服务器、web 容器(Servlet 容器)之间的关系,可以参考刘大的文章:
其中,对于我解惑很重要的一点是(个人的一个理解,事实不一定完全是这样,至少通过这样的理解,可以帮助我弄清楚逻辑):
Tomcat 既可以只做 web 容器也可以既做 web 服务器,又做 web 容器
对于前者,Tomcat 接收其他 web 服务器转发过来的请求,然后调用 servlet 进行处理即可
对于后者,Tomcat 自己接收浏览器发过来的请求(不需要其他 web 服务器中转了),然后调用 servlet 进行处理
 
2、SpringMVC 中各角色的认识及其相关配置
在搭建 SSM 框架的时候,会有一些配置文件
对于 web.xml 和 spring-web.xml 文件,先弄清楚 SpringMVC 的工作原理图(更准确地说,是流程图),有利于理解这些配置文件中的内容
关于 SpringMVC 的原理图,可以参考以下公众号文章:
其中的一张图是:
其中,需要程序员开发的有两个,一个是 Handler(就是 SSM 中的 Controller 类),另一个是 jsp 文件(就是视图解析器解析的对象)
对于不需要程序员开发的
前端控制器(DispatcherServlet)、处理器映射器(HandlerMapping)、处理器适配器(HandlerAdapter)以及视图解析器(ViewResolver)
我们需要对它们进行配置
其中,前端控制器(DispatcherServlet),配置在 web.xml 文件的 <servlet> 标签中,例如:
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC需要加载的配置文件
spring-dao.xml,spring-service.xml,spring-web.xml
Mybatis - > spring -> springmvc
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet> <!-- 配置DispatcherServlet作用范围(或者叫映射范围) -->
<servlet-mapping>
<!-- (与<servlet标签中的<servlet-name>的内容对应>) -->
<servlet-name>dispatcher</servlet-name>
<!-- 默认匹配所有的请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
处理器映射器(HandlerMapping)、处理器适配器(HandlerAdapter)以及视图解析器(ViewResolver),这三个都在 spring-web.xml 文件中配置,例如:
<!-- 配置SpringMVC -->

    <!-- 1.开启SpringMVC注解模式 -->
<!-- 简化配置:
自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
该注解确实可以代替映射器和适配器的配置
参考:https://blog.csdn.net/u013310119/article/details/51698347
-->
<mvc:annotation-driven /> <!-- 2.扫描web相关的bean(即,handler,或者说 Controller) --><!-- 和第1点结合起来 -->
<context:component-scan base-package="com.hisen.web" /> <!-- 3.配置jsp相关 视图解析器ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!--
关于第3点,结合实际使用,看看它是怎么发挥作用的
BookController 类中的如下代码
return 一个文件名就行,前缀(路径)和后缀(文件类型)都已经在视图解析器里面配置好了(注:prefix表示前缀,suffix表示后缀)
@RequestMapping(value = "/list", method = RequestMethod.GET)
private String list(Model model) {
List<Book> list = bookService.getList(0, 1000);
model.addAttribute("list", list);
return "list";// WEB-INF/jsp/"list".jsp
}
-->
3、web 容器(servlet 容器)是怎么加载 DispatcherServlet 的?
由第 2 点中的 SpringMVC 工作原理图可知,SpringMVC 的核心是 DispatcherServlet
那么,web 容器(servlet 容器)是怎么加载 DispatcherServlet,来让 SpringMVC 发挥作用呢?
首先,需要强调的一点是,在 JavaWeb 的初始阶段,是没有框架这一说的,程序员一开始是直接使用 servlet 编程的。
而 SpringMVC 中的核心类 DispatcherServlet 本质上也是一个 Servlet
所以,对于 web 容器是怎么加载 DispatcherServlet 的这个问题,可以转化为:
在 JavaWeb 的初始阶段,web 容器是怎么管理 servlet 的?
我觉得可以转化为这个问题:Servlet 的生命周期是什么?参考以下文章即可:
大概的点是:
servlet 有三个主要的方法,init()、service()、destroy()
web 容器初始化时,创建 servlet 实例,并调用其 init() 方法,进行一些初始化操作
web 容器启动后,有请求发过来,web 容器会调用 servlet 的 service() 方法,处理请求
web 容器关闭或者重启时,调用 servlet 的 destroy() 方法,告知 JVM 该 servlet 实例可以被垃圾回收了
回到原来的问题,即,web 容器(servlet 容器)是怎么加载 DispatcherServlet,来让 SpringMVC 发挥作用呢?
DispatcherServlet 配置在 web.xml 文件中共,Tomcat 是怎么读取 web.xml 文件的?
可以参考以下文章:
即,在 web 容器启动时,web 容器会去 web.xml 读取相关配置信息(参数配置、监听器、过滤器),并根据 <servlet> 标签的内容创建 DispatcherServlet 实例并初始化(调用 init() 方法)它
 
4、扩展
在了解 web.xml 文件的时候,我有个疑问,就是:
在 <context-param> 和 <init-param> 中配置信息,有什么不同?
可以参考:
大致意思是:
在 <context-param> 中配置的内容,整个应用都读取
在 <init-param> 中配置的内容,只有特定的 servlet 可以读取(该标签是 <servlet> 的字标签)
那么,spring-web.xml 和 spring-dao.xml 等配置文件的路径在哪个标签中配置呢?
我的结论:
都可以
理由:
根据 SpringMVC 工作原理图,只需要在 DispatchServlet 创建的时候,能读取到相关信息就行了
 
 

SSM配置梳理的更多相关文章

  1. (转)nginx域名访问的白名单配置梳理

    nginx域名访问的白名单配置梳理 原文:http://www.cnblogs.com/kevingrace/p/6086652.html 在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip ...

  2. java -- SSM配置完成后,能访问jsp文件不能访问html文件,报错解析

    SSM配置完成后,能访问jsp文件不能访问html文件,报错解析 在确保路径没有任何问题的,情况下,相同的页面,jsp能够正常访问,html却不能正常访问(404). 解决方法: 在web.xml中添 ...

  3. 简单SSM配置详解

    SSM:spring+springMVC+Mybatis 学习网友的http://www.cnblogs.com/invban/p/5133257.html,并对其进行了详细的解说. 源码下载:htt ...

  4. Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理

    通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...

  5. Linux下路由配置梳理

    在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:---------------------------------------------------------- ...

  6. nginx应用总结(1)-- 基础知识和应用配置梳理

    在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...

  7. 4.SSM配置shiro权限管理

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.搭建SSM项目: http://www.cnblogs.com/yysbolg/p/6909021.html ...

  8. ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)

    Detectron概述 Detectron是Facebook FAIR开源了的一个目标检测(Object Detection)平台. 用一幅图简单说明下Object Detection.如Mask R ...

  9. Linux下路由配置梳理(转)

    转自:https://www.cnblogs.com/kevingrace/p/6490627.html 在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:----- ...

随机推荐

  1. 重新整理django中Auth模块

    0907自我总结 重新整理django中Auth模块 from django.contrib import auth 一.设置 默认Auth表单 auth默认是使用自带的user表单 自定义Auth表 ...

  2. Python3程序设计指南:02 数据类型

    目录 1.标识符与关键字 1.1 规则 1.2 约定 2.Integral类型 2.1 整数 2.1.1 数值型操作符与函数 2.1.2 使用数据类型创建对象 2.1.3 整数位逻辑操作符 2.2 布 ...

  3. STM32SPI连续读写多个字节会产生时间间隔

    最近在做一个音频芯片的项目用到SPI接口配置寄存器,发现只要连续两次向从机发送(接收)帧,当STM32处于主机模式时,这两帧数据中间会产生一个时钟的间隙. 起初我想能不能利用状态标志来去除间隙,后来怎 ...

  4. 安装Go语言及搭建Go语言开发环境

    一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...

  5. 使用mongoose-paginate-v2查询缓慢问题

    场景 mongoose-paginate-v2 是一个mongoose上的分页插件,我也用过很多次了,但是最近在创建项目遇到了问题. 老代码中不使用分页插件进行查询,然后自己使用中间件进行分页 old ...

  6. SpringMvc启动源码解析

    1. 前言 上篇文章介绍了Spring容器的初始化https://www.cnblogs.com/xiaobingblog/p/11738747.html,接下来介绍SpringMvc容器的初始化 2 ...

  7. 玩转u8g2 OLED库,一篇就够

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. 向net core 3.0进击——项目发布与部署

    目录 前言 发布 测试 小结 前言 在经历过好多折腾后,总算是把部署走通了一遍,之前只是简单创建个工程在linux下部署,后来一直将这件事搁置,直到最近刚好团队入手一个小服务器,很显然是linux的, ...

  9. Kafka、Redis和其它消息组件比较

    Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的 ...

  10. django-Views之request(二)

    book/views.py def index(request): http_list = { '<h1>请求协议: <span style="color:red" ...