关于Tomcat的理解

在了解Tomcat的容器概念之前,我们先从我们的意图出发:

1、我们要请求的资源有哪些?

静态资源css/img/txt/html/...这些资源怎么来的?

静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力;

动态资源呢?动态资源就是通过servlet请求处理后返回得到。

那什么是servlet呢?servlet是任务java EE web应用程序的一个关键组件!servlet是用于接受和响应HTTP请求的java类(标准!)

Java Servlet要求必须运行在Web服务器当中(即servlet容器),与Web服务器之间属于分工和互补关系。确切的说,在实际运行的时候Java Servlet与Web服务器会融为一体,如同一个程序一样运行在同一个Java虚拟机(JVM)当中。

Servlet对每个请求都是单独启动一个线程,而不是进程。

这种处理方式大幅度地降低了系统里的进程数量,提高了系统的并发处理能力。另外因为Java Servlet是运行在虚拟机之上的,也就解决了跨平台问题。如果没有Servlet的出现,也就没有互联网的今天。

Servlet的容器——》Tomcat!

1. 有Servlet类就有管理Servlet的容器,更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上)。

每个应用服务器都包含了一个web容器,用于管理servlet的声明周期,将请求URL映射到对应的servlet代码、接受和响应HTTP请求以及管理过滤器等等。

2. tomcat是一个servlet容器,<Server>标签代表着这个容器包含的所有内容,里面可以有一个或多个<service>标签,其作用就是通俗意义上的服务器了。<connector>标签中定义了端口号,http协议,ajp协议,即作为接受客户端请求的渠道。<engine>引擎标签,负责处理客户端的请求。<host>为主机标签,里面部署的就是我们需要发布的web应用。一个service可以有多个connector,多个host,但只有一个引擎。

3. Tomcat运行在JVM之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下指责:

  1. 管理Servlet程序的生命周期;
  2. 将URL映射到指定的Servlet进行处理;
  3. 与Servlet程序合作处理HTTP请求——根据HTTP请求生成HttpServletRequest/Response对象并传递给Servlet进行处理,将Servlet中的HttpServletResponse对象生成的内容返回给浏览器;
  4. 将JSP编译成servlet!

web.xml配置

既然是管理servlet的声明周期。那就肯定是有启动servlet的功能!这部分就要我们自己编写“指令”告诉容器如何部署启动应用程序中的servlet了!有两种方式:使用部署描述符web.xml方式和java编程方式!部署一个servlet到容器中大致需要以下几个步骤:

1. 告知容器什么时候启动servlet!

<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

2.规定servlet应该对哪些URL响应(过滤):

<servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

3. 配置监听器

监听器的作用是管理何时启动应用程序、关闭、HTTP会话的创建和销毁等!

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

4.启动全文使用的上下文

当spring web启动的时候,会同时启动两个应用上下文,一个是由DispatcherServlet创建,另外一个是由ContextLoaderListener创建。

1. DispatcherServlet:主要负责控制器,视图解析器、以及映射处理器的映射(注入)

<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

2.ContextLoaderListener:主要负责加载应用中其他bean(JDBC、Email等等)

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/confg/applicationContext.xml</param-value>
    </context-param>

 

假设来自客户的请求为:http://localhost:8080/test/index.jsp

  1. 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得;
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应;
  3. Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host;
  4. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机);
  5. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context;
  6. Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理);
  7. path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet;
  8. Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类;
  9. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法;
  10. Context把执行完了之后的HttpServletResponse对象返回给Host;
  11. Host把HttpServletResponse对象返回给Engine;
  12. Engine把HttpServletResponse对象返回给Connector;
  13. Connector把HttpServletResponse对象返回给客户browser;
    摘自:

https://www.jianshu.com/p/571c474279af?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

 

转载于:https://my.oschina.net/u/3697586/blog/1815928

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值