这两天梳理了一下 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> 标签中,例如:
  1. <!-- 配置DispatcherServlet -->
  2. <servlet>
  3. <servlet-name>dispatcher</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!-- 配置springMVC需要加载的配置文件
  6. spring-dao.xml,spring-service.xml,spring-web.xml
  7. Mybatis - > spring -> springmvc
  8. -->
  9. <init-param>
  10. <param-name>contextConfigLocation</param-name>
  11. <param-value>classpath:spring/spring-*.xml</param-value>
  12. </init-param>
  13. </servlet>
  14.  
  15. <!-- 配置DispatcherServlet作用范围(或者叫映射范围) -->
  16. <servlet-mapping>
  17. <!-- (与<servlet标签中的<servlet-name>的内容对应>) -->
  18. <servlet-name>dispatcher</servlet-name>
  19. <!-- 默认匹配所有的请求 -->
  20. <url-pattern>/</url-pattern>
  21. </servlet-mapping>
处理器映射器(HandlerMapping)、处理器适配器(HandlerAdapter)以及视图解析器(ViewResolver),这三个都在 spring-web.xml 文件中配置,例如:
  1. <!-- 配置SpringMVC -->
  2.  
  3. <!-- 1.开启SpringMVC注解模式 -->
  4. <!-- 简化配置:
  5. 自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
  6. 该注解确实可以代替映射器和适配器的配置
  7. 参考:https://blog.csdn.net/u013310119/article/details/51698347
  8. -->
  9. <mvc:annotation-driven />
  10.  
  11. <!-- 2.扫描web相关的bean(即,handler,或者说 Controller) --><!-- 和第1点结合起来 -->
  12. <context:component-scan base-package="com.hisen.web" />
  13.  
  14. <!-- 3.配置jsp相关 视图解析器ViewResolver -->
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  17. <property name="prefix" value="/WEB-INF/jsp/" />
  18. <property name="suffix" value=".jsp" />
  19. </bean>
  20. <!--
  21. 关于第3点,结合实际使用,看看它是怎么发挥作用的
  22. BookController 类中的如下代码
  23. return 一个文件名就行,前缀(路径)和后缀(文件类型)都已经在视图解析器里面配置好了(注:prefix表示前缀,suffix表示后缀)
  24. @RequestMapping(value = "/list", method = RequestMethod.GET)
  25. private String list(Model model) {
  26. List<Book> list = bookService.getList(0, 1000);
  27. model.addAttribute("list", list);
  28. return "list";// WEB-INF/jsp/"list".jsp
  29. }
  30. -->
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. 【RocketMQ源码学习】- 1. 入门

    为什么读RocketMQ 消息队列在互联网应用中使用较为广泛,学习她可以让我门更加了解使用技术的工作原理 透过学习她的源码,拓宽认知 RocketMQ经历了阿里双十一 有哪些名词 Producer 消 ...

  2. NOIP_TG

    本博客主要记录一些在刷题的途中遇到的一些巧妙的题目 砝码称重 一开始想到可以DP递推标记能凑成的数量 但发现同一种砝码可能有多个于是想多开一维状态存当前还剩多少砝码 真是愚蠢至极 直接把所有砝码单独看 ...

  3. 快速入门Maven(三)

    一.整合ssh框架的Maven项目 1.传递依赖 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况叫 依赖传递 2.依赖版本冲突的解决 (1)第一声明优先原则(就是谁写 ...

  4. Jenkins介绍

    持续集成: 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证 ...

  5. 第六版PMBOK中工具与技术的介绍:数据收集数据分析数据表现

    数据收集技术: 1.头脑风暴:收集关于项目方法的创意和解决方案.2.焦点小组:召集预定的相关方和主题专家,了解他们对所讨论的产品服务或成果的期望和态度.主持人引导大家互动式讨论.3.访谈:通过与相关方 ...

  6. POST PUT 小解

    POST 主要是用来提交数据让服务器进行处理的,PUT主要是请求数据的. POST 提交的数据放在HTTP正文里面,而PUTT提交的数据放在url里面.

  7. 使用unittest,if __name__ == '__main__':里代码不执行的解决办法

    参考:https://www.cnblogs.com/hanmk/p/8656574.html

  8. 19.Linux进程管理概述

    1.进程基本概述 当我们运行一个程序,那么我们将运行的程序叫进程. PS1: 当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限. PS2: 在进程运行的过程中,服务器上会有各种状态 ...

  9. Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第26篇. 本篇我们使用my ...

  10. kubectl get 后按2次tab键命令补全的失效原因分析

    kubectl get 后按2次tab键命令补全的失效原因分析 2019/10/28 Chenxin a.bash客户端工具 在centos用户下, cd ~;echo "source &l ...