Tomcat与Servlet的笔记

最近要使用springMvc框架做一个项目。突然想研究一下,Tomcat服务器和Servlet的关系。

一.Tomcat的模块结构和简单流程

看了很多关于介绍Tomcat服务器的资料,这里写一个总结。Tomcat服务器主要有几个模块构成
,Server,Service,Connector,Container(Engine、Host、Context、Wrapper)
它们的关系如下:

  • Server:代表的就是整个Tomcat服务器。Server的作用是提供接口让外界可以访问其中的Service集合。
  • Service:是Server的子容器,它的主要作用是把
    Connector和Container聚合起来作为一个服务。一个Server可以有多个Service.
  • Connector:属于Service的子容器,主要作用是负责接收浏览器的发过来的 tcp连接请求,并把这个请求封装成Request和Response对象。然后会产生一个线程(产生一个线程池)来处理这个请求并把产生的Request 和 Response 对象传给处理这个请求的线程。接下来处理这个请求的线程会传给 Container 组件要做的事了。Connector有多个,因为一般有很多请求需要处理。
  • Container:属于Service的子容器,它是一个接口,实现包含4个容器,Engine、Host、Context、Wrapper,这四个容器也是父子关系。

  • Host: 主要指的是虚拟主机,虚拟主机可以定义不同端口,一个Engine可以有多个Host,这里不是重点,略过了。可以看我以前写的一个博客Tomcat的虚拟主机

  • Context:context代表的就是一个Web项目,一个Host可以有多个Context。Context是用来管理web项目的Servlet的,后面再详解。
  • Wrapper:实现类是StandardWrapper,代表的是一个包装过的Servlet。

为什么需要web服务器?

有时候,老爱专牛角尖,在想为什么需要tomcat服务器呢,为什么不是其他服务器呢?实际上,只要是web服务器都可以。web服务器的一大功能就是会把浏览器传过来的请求封装成Servlet可以接受的Request和Response。这样就不用自己写Socket程序来处理传输过来的请求。**

二.Servlet是如何被加载的?如何被初始化的?

  1. 调用Server的start方法。值得注意的是,这个方法里面会遍历Service集合,并调用所有Service的start方法。因此启动tomcat会启动其中所有的项目!!!
  2. Service启动会触发一个监听器(生命周期监听器),让Service中的所有Container启动。导致所有的Context中启动。细节是,每一个Context其中有一个类ContextConfig会开始解析相应项目的web.xml,并把解析内容整合放到Context中。ContextConfig执行startInternal方法获取到ServletContext.因此一个web项目对应一个ServletContext,ServletContext是一个web项目中所有Servlet共用的。
  3. Context根据load-on-start创建Wrapper子容器,Wrapper调用loadServlet方法,实例化Servlet,并创建ServletConfig。因此Servlet和ServletConfig是绑定在一起的。当然在这个过程中,如果有相应的监听器,也会初始化监听器。

三.Servlet如何工作,如何根据url找到servlet?

至此,Tomcat启动完成了。上面没有提到Connector,因为还没有请求过来。当请求过来的时候,Connector包装Tcp请求成Request和Response对象,且Request中存储了访问的URL信息,在Connector处理的阶段就已经确认要访问的Wrapper子容器了。 在封装完成后,把Request和Response对象出啊到Container中确定好的Wrapper中,执行

Service(Request request,Response response);

在SpringMvc中,只有一个DispatherServlet,找到这个之后接下来的映射就交给SpringMvc自身的映射器来处理。

<servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/springMvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

DispatcherServlet 配置的 url-pattern 为 / ,因此这个项目的任何一个请求都会转到这个Servlet上。

四.Servlet在Tomcat中模型是什么?

根据前面的知识,接到一个http请求,Tomcat就封装成一个Request和 Response。如果多个浏览器访问相同的url,那么多个浏览器访问相同的servlet,执行service方法。差别是每个service中的参数对象不一样。因为Servlet在Tomcat中只初始化一次,因此只有一个实例,每一个请求线程都会共用这一个实例。为了防止线程不安全,servlet中不能有类变量(或者说不能有可以被线程改变的类变量)
总结:Servlet是单实例多线程模型,Tomcat在接到一个请求的时候,会在线程池中新开一个线程去处理这个请求。
一般的Tomcat服务器可以处理的并发量是300左右。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值