这两天梳理了一下 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. LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

    今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数. 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个 ...

  2. SLAM中的卡方分布

    视觉slam中相邻帧特征点匹配时,动辄上千个特征点,匹配错误的是难免的,而误匹配势必会对位姿精度以及建图精度造成影响,那么如何分辨哪些是误匹配的点对儿呢?如果已知两帧的的单应矩阵,假设单应矩阵是没有误 ...

  3. Blazor(一):运行初体验,全新的.net web的开发

    官网:https://dotnet.microsoft.com/apps/aspnet/web-apps/client 作者BBS:http://bbs.hslcommunication.cn/ 我们 ...

  4. [USACO15DEC]高低卡(白金)High Card Low Card (Platinum)

    题目描述 Bessie the cow is a hu e fan of card games, which is quite surprising, given her lack of opposa ...

  5. Axios 详解

    首先祝广大程序猿们节日快乐! 一.axios简介 基于promise,用于浏览器和node.js的http客户端 二.特点 支持浏览器和 node.js 支持 promise 能拦截请求和响应 能转换 ...

  6. Python编程系列---使用装饰器传参+字典实现动态路由

    # 实现一个空路由表,利用装饰器将url和功能函数的对应关系自动存到这个字典中 router_dict = {} # 定义一个装饰器 # 再给一层函数定义,用来传入一个参数,这个参数就是访问的页面地址 ...

  7. postman设置环境变量与全局变量

    1.环境变量可以设置多组 设置环境变量 编辑环境变量 2.全局变量只能设置一组 可以在Pre-request Script和Tests中设置全局变量 如:pm.globals.set("na ...

  8. 17.Linux高可用之Keepalived

    1.什么是高可用,为什么要设计高可用? 两台机器启动着相同的业务系统,当有一台机器宕机,另外一台服务器能快速的接管,对于访问的用户是无感知的. 减少系统不能提供服务的时间. 2.高可用使用什么工具来实 ...

  9. 百万年薪python之路 -- socket粘包问题解决

    socket粘包问题解决 1. 高大上版解决粘包方式(自定制包头) 整体的流程解释 整个流程的大致解释: 我们可以把报头做成字典,字典里包含将要发送的真实数据的描述信息(大小啊之类的),然后json序 ...

  10. 小白终于弄懂了:c#从async/await到Task再到Thread

    1. 为什么会有/怎么解决: async/await的无限嵌套 public async Task<int> myFuncAsync1() { //some code int num = ...