一、基础知识(什么是servlet)

在idea中打开servlet的源码:

可以看见servlet就是一个接口;接口就是规定了一些规范,使得一些具有某些共性的类都能实现这个接口,从而都遵循某些规范。有的人往往以为就是servlet直接处理客户端的http请求,其实并不是这样,servlet并不会去监听8080端口;直接与客户端打交道是“容器”,比如常用的tomcat。客户端的请求直接打到tomcat,它监听端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。


简而言之,就是说Servlet是一个小型的JAVA程序,运行在Web 服务器中来处理用户的请求,我们实际上使用的各路Servlet都需要通过各种方式实现这个接口。

  1. Servlet的生命周期

从创建到毁灭:

  1. 调用 init() 方法初始化
  2. 调用 service() 方法来处理客户端的请求
  3. 调用 destroy() 方法释放资源,标记自身为可回收
  4. 被垃圾回收器回收

由上面可以看见,servlet的init方法和destroy方法,一般容器调用这两个方法之间的过程,就叫做servlet的生命周期。调用的整个过程就如上图所示。当请求来容器第一次调用某个servlet时,需要先初始化init(),但当某个请求再次打到给servlet时,容器会起多个线程同时访问一个servlet的service()方法。
由此可以看出,多个客户访问同一service()方法,会涉及线程安全的问题。

  • 如果service()方法没有访问Servlet的成员变量也没有访问全局的资源比如静态变量、文件、数据库连接等,而是只使用了当前线程自己的资源,比如非指向全局资源的临时变量、request和response对象等。该方法本身就是线程安全的,不必进行任何的同步控制。

  • 如果service()方法访问了Servlet的成员变量,但是对该变量的操作是只读操作,该方法本身就是线程安全的,不必进行任何的同步控制。

  • 如果service()方法访问了Servlet的成员变量,并且对该变量的操作既有读又有写,通常需要加上同步控制语句。

  • 如果service()方法访问了全局的静态变量,如果同一时刻系统中也可能有其它线程访问该静态变量,如果既有读也有写的操作,通常需要加上同步控制语句。

  • 如果service()方法访问了全局的资源,比如文件、数据库连接等,通常需要加上同步控制语句。

  1. 面试问题:
  • Servlet如何同时处理多个请求访问?

单实例多线程: 主要是请求来时,会由线程调度者从线程池李取出来一个线程,来作为响应线程。这个线程可能是已经实例化的,也可能是新创建的。

  • Servlet容器默认是采用单实例多线程的方式处理多个请求的:
  1. 当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);

  2. 容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等。

  3. 当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者;

  4. 线程执行Servlet的service方法;

  5. 请求结束,放回线程池,等待被调用; (注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题)

从上面可以看出:

  • 第一:Servlet单实例,减少了产生servlet的开销;
  • 第二:通过线程池来响应多个请求,提高了请求的响应时间;
  • 第三:Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;如果是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
  • 第四:每一个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求;

二、tomcat

尽管tomcat非常灵活而强大,可以作为web应用服务器,但是tomcat首先是一个Servlet容器,Servlet容器可以对Servlet进行管理,控制其生命周期。使其可以专注于自己应该做的事情,不需要考虑端口啊多线程啊socket之类的东西,也使得Servlet在各种环境下具有适应性。一个基本的流程:tomcat接收请求,找到合适的Servlet来处理请求,如果该Servlet没加载,就顺便编译加载到JVM,如果加载了,就调init方法初始化,调Service方法处理request并返回responser,观测Servlet状态变化,在结束时调用destory方法。

三、Spring MVC

 任何Spring Web的entry point,都是servlet。

大名顶顶的spring框架已经风靡多时,一个事物的出现和流行都是会有原因的,那么为什么spring 框架会出现呢?原因就是为了简化java开发。spring的核心就是通过依赖注入、面向切面编程aop、和模版技术,解耦业务与系统服务,消除重复代码。借助aop,可以将遍布应用的关注点(如事物和安全)从它们的应用对象中解耦出来。

  1. Spring 中的Bean
  • POJO和JavaBean的区别 :

“Plain Ordinary Java Object”,简单普通的java对象。主要用来指代那些没有遵循特定的java对象模型,约定或者框架的对象。

POJO的内在含义是指那些:
有一些private的参数作为对象的属性,然后针对每一个参数定义get和set方法访问的接口。没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。JavaBean 是一种JAVA语言写成的可重用组件。JavaBean符合一定规范编写的Java类,不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用。它的方法命名,构造及行为必须符合特定的约定:

  1. 所有属性为private。
  2. 这个类必须有一个公共的缺省构造函数。即是提供无参数的构造器。
  3. 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
  4. 这个类应是可序列化的。实现serializable接口。

因为这些要求主要是靠约定而不是靠实现接口,所以许多开发者把JavaBean看作遵从特定命名约定的POJO。spring中,应用对西那个生存于spring容器中,spring 容器创建对象,装配它们,管理它们的整个生命周期。spring容器通过依赖注入,管理构成应用的组件,它会创建相互协作的组件之间的关联。

  1. Bean的生命周期

Spring MVC Spring MVC的运行流程:

四、总结

  1. Tomcat和jettey类似,都是HTTP服务器和Servlet容器,负责给类似Spring这种servlet提供一个运行的环境,其中:Http服务器与Servlet容器的功能界限是:可以把HTTP服务器想象成前台的接待,负责网络通信和解析请求,Servlet容器是业务部门,负责处理业务请求。
  2. Tomcat和Servlet作为Web服务器和Servlet容器的结合,可以接受网络http请求解析为Servlet规范的请求对象和响应对象。比如,HttpServletRequest对象是Tomcat提供的,Servlet是规范,Tomcat是实现规范的Servlet容器,SpringMVC是处理Servlet请求的应用,其中DispatcherServlet实现了Servlet接口,Tomcat负责加载和调用DispatcherServlet。同时,DispatcherServlet有自己的容器(SpringMVC)容器,这个容器负责管理SpringMVC相关的bean,比如Controler和ViewResolver等。同时,Spring中还有其他的Bean比如Service和DAO等,这些由全局的Spring IOC容器管理,因此,Spring有两个IOC容器。
  3. 如果只是使用spring(不包含springmvc),那么是tomcat容器解析xml文件,通过反射实例化对应的类,根据这些servlet规范实现类,触发对应的代码处理逻辑,这个时候tomcat负责http报文的解析和servlet调度的工作
  4. 如果使用spring mvc,那么tomcat只是解析http报文,然后将其转发给dispatchsetvlet,然后由springmvc根据其配置,实例对应的类,执行对应的逻辑,然后返回结果给dispatchservlet,最后由它转发给tomcat,由tomcat负责构建http报文数据。

参考文章
参考文章
参考文章

Servlet、Tomcat、 SpringMVC 之间的关系相关推荐

  1. Servlet / Tomcat / Spring 之间的关系

    0.基础知识 在idea中打开servlet的源码: 可以看见servlet就是一个接口:接口就是规定了一些规范,使得一些具有某些共性的类都能实现这个接口,从而都遵循某些规范. 有的人往往以为就是se ...

  2. Servlet/Tomcat/ Spring 之间的关系

    0.基础知识 在idea中打开servlet的源码: 可以看见servlet就是一个接口:接口就是规定了一些规范,使得一些具有某些共性的类都能实现这个接口,从而都遵循某些规范. 有的人往往以为就是se ...

  3. 区分什么是Apache、Tomcat,之间有什么关系?

    很多新手不明白什么是Apache.Tomcat,甚至经常搞混这两者之间的关系,今天我就详细说明下: 1. 首先,Apache是web服务器,而Tomcat是应用服务器:这里什么是web服务器,应用服务 ...

  4. spring和servlet之间得关系

    servlet.filter和listener是javaweb得三大组成部分. 其中servlet通常是由web.xml统一管理. 而springmvc核心是disparcherservlet为入口. ...

  5. service、servlet和WebService三者之间的关系

    学习Java很久了,但是一直没怎么弄清楚过service和servlet的区别,下午找了同学聊了聊才发现,一直以来的理解都有错误,下面就为大家好好理清一下他们的关系. 一.service 我们一般理解 ...

  6. java servlet spring_带着新人简单看看servlet到springmvc

    好久都没有写博客了,不是因为自己懒了,而是总感觉自己知道的只是太少了,每次想写博客的时候都不知道怎么下手,不过最近看到一篇博客说的是springmvc,给了我比较大的兴趣,感觉一下子对整个spring ...

  7. Spring各模块的功能及互相之间的关系

    目录 spring-framework 的源码目录 Spring FrameWork 结构图 各个模块功能(该部分参考结构图来看) 模块概述(该部分参考源码目录来看) 核心容器 AOP和Instrum ...

  8. session,sessionid,cookie之间的关系解析

    session,sessionid,cookie之间的关系解析 文章目录 session,sessionid,cookie之间的关系解析 1.简介 2.session和cookie定义,创建,周期和联 ...

  9. 手把手教你用JSP+Servlet+Tomcat实现一个最简单的Web应用

    JSP+Servlet+Tomcat实现一个简单的Web应用 需要使用到的技术 ①JSP ② Servlet ③Tomcat Web开发中的常见概念 Demo *本文针对编程务实实验内容,简单演示一下 ...

最新文章

  1. iOS - Quartz 2D 画板绘制
  2. 阿里技术专家:数据一致性检测的应用场景与最佳实践
  3. 使用Angular 4、Bootstrap 4、TypeScript和ASP.NET Core开发的Apworks框架案例应用
  4. 分布式ID生成器的解决方案总结
  5. html5 css svg,6款基于SVG的HTML5CSS3应用和动画
  6. Node.js路径操作
  7. 快速学习、快速决策、快速改变;突破自我
  8. POJ 3597 Polygon Division (DP)
  9. oracle rsm0进程,12c DG broker DMON自动重启过程分析
  10. Atitit 提升开发效率 简化设计工具箱 vs 问题诊断 目录 1. 语言类类tool内嵌脚本解释器 1 1.1. 脚本语言 php nodejs python 1 1.2. Sql 1 2. D
  11. MySQL8.0 - 新特性 - 临时表改进 1
  12. 数据提取软件----GetData
  13. Unity3d十二 3d主要引擎名称Ogre Unreal Unity Gamebryo Bigworld
  14. TOP to Down设计简单例子 Creo3.0
  15. lfs库下载_lua使用lfs.dll库进行文件操作
  16. githug关卡小游戏,练习git
  17. 主流移动开发平台架构分析
  18. 【前端面试】04 HTTP协议
  19. Ceph集群搭建及其运用(块存储、ceph文件系统)
  20. 基于32单片机的智能插座

热门文章

  1. E - Water Distribution
  2. 使用Vue.js初次真正项目开发-2018/07/14
  3. openstack-networking-neutron(四)--iptables
  4. 已知服务器ftp的账号密码,求解数据库表的内容
  5. 基于Ruby的watir-webdriver自动化测试方案与实施(四)
  6. Visual LISP 第5章 编辑源程序代码(1)文本编辑工具
  7. 纯CSS实现提示框小三角
  8. 光脚丫学LINQ(025):如何验证DBML和外部映射文件
  9. Pytorch实践中文教程(1)
  10. 单核7:全景闹钟和单核工作法