概要

  • 什么是tomcat?
  • tomcat作用
  • Servlet由来?做什么的?
  • Servlet是如何工作的?
  • Tomcat的组成
  • tomcat组件功能介绍

tomcat介绍

1.什么是tomcat?

Tomcat是Servlet的运行环境,可以称之为容器,Tomcat是运行在JVM上的应用服务器

2.tomcat作用

  1. 接受请求并解析请求
  2. 处理请求
  3. 返回响应

3.Servlet由来?做什么的?

Servlet是SUN为了让Java能实现动态的可交互的网页,从而进入web编程的领域而定义的一套标准.

这套标准是这么说的: 你想用Java开发动态网页, 可以定义一个自己的”Servlet”,但一定要实现HTTPServlet接口,然后重载doGet(),doPost()方法.用户从流浪器GET的时候,调用doGet方法,从流浪器向服务器发送表单数据的时候,调用doPost方法,如果你想访问用户从浏览器传递过来的参数,用HttpServletRequest对象就好了,里面有getParameter,getQueryString方法,如果你处理完了,想向浏览器返回数据,用HttpServletResponse对象调用getPrintWriter方法就可以输出数据了.

如果你想实现一个购物车,需要session,很简单,从HttpServletRequest调用getSession方法就可以了.

4.Servlet是如何工作的?

  1. 由servlet容器创建一个实现ServletRequest或HttpServletRequest的实例,该request中包含请求类型,URL,协议,参数,Cookies等
  2. 由servlet容器创建一个实现ServletReponse或HttpServletReponse的实例,用来向Web客户端发送响应。
  3. 调用Servlet的service方法,将request对象和response对象作为参数传入。Servlet从request对象中读取信息,并通过response对象发送响应信息.

5.Tomcat的组成

  1. Server(服务器)和Service(服务)

  2. Connector(连接器)

    • HTTP
      • Nio
      • Apr
    • AJP(apache私有协议,用于tomcat和apache静态服务器通信)
  3. Container(容器)

    • Engine
    • Host
    • Context
    • Wrapper
  4. Component(组件)

    • Manager(管理器)
    • logger(日志管理)
    • loader(载入器)
    • pipeline(管道)
    • valve(管道中的阀)

image-20200108141046197

tomca组件功能

1.Server

Server为定义的接口,默认实现是StandardServer,主要作用有

  • 定义了 Servlet 容器的相关配置,即server.xml中的配置
  • 启动Server将启动所有的Tomcat组件,关闭Server将关闭所有组件

Server接口中重要的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface Server extends Lifecycle {

public int getPort();

public void setPort(int port);

public String getAddress();

public void setAddress(String address);

public String getShutdown();

public void setShutdown(String shutdown);

public void addService(Service service);

public Service findService(String name);

public Service[] findServices();

public void removeService(Service service);

}

2.Service

Service为定义的接口,默认实现是StandardService,主要作用有

  • 逻辑上包含Connector和Container
  • Mapper:它封装了请求资源URI与每个相对应的处理wrapper容器的映射关系

Service接口中重要的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public interface Service extends Lifecycle {

public Engine getContainer();

public void setContainer(Engine engine);

public String getName();

public void setName(String name);

public Server getServer();

public void setServer(Server server);

public void addConnector(Connector connector);

public Connector[] findConnectors();

public void removeConnector(Connector connector);

Mapper getMapper();
}

3.Connector

Connector为定义的连接器类,默认实现的协议有http、https、AJP,主要作用有

  • 根据不同的协议解析客户端的请求
  • 将解析完的请求转发给Connector关联的Engine容器处理

Connector默认支持的协议如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* Defaults to using HTTP/1.1 NIO implementation.
*/
public Connector() {
this("org.apache.coyote.http11.Http11NioProtocol");
}


public Connector(String protocol) {
boolean aprConnector = AprLifecycleListener.isAprAvailable() &&
AprLifecycleListener.getUseAprConnector();

if ("HTTP/1.1".equals(protocol) || protocol == null) {
if (aprConnector) {
protocolHandlerClassName = "org.apache.coyote.http11.Http11AprProtocol";
} else {
protocolHandlerClassName = "org.apache.coyote.http11.Http11NioProtocol";
}
} else if ("AJP/1.3".equals(protocol)) {
if (aprConnector) {
protocolHandlerClassName = "org.apache.coyote.ajp.AjpAprProtocol";
} else {
protocolHandlerClassName = "org.apache.coyote.ajp.AjpNioProtocol";
}
} else {
protocolHandlerClassName = protocol;
}

// Instantiate protocol handler
ProtocolHandler p = null;
try {
Class<?> clazz = Class.forName(protocolHandlerClassName);
p = (ProtocolHandler) clazz.getConstructor().newInstance();
} catch (Exception e) {
log.error(sm.getString(
"coyoteConnector.protocolHandlerInstantiationFailed"), e);
} finally {
this.protocolHandler = p;
}
}

4.Engine

image-20200107175614257

Engine为定义的接口,默认实现是StandardEngine,主要有以下模块:

  • Cluster:实现tomcat管理
  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式。只是简单的将Connector传过来的变量传给Host容器

5.Host

image-20200107175652268

Host为定义的接口,默认实现是StandardHost,主要有以下模块:

  • Cluster:实现tomcat管理
  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式

6.Context

image-20200107175858093

Context为定义的接口,默认实现是StandardContext,主要有以下模块:

  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式
  • Manager: 它主要是应用的session管理模块
  • Resources: 它是每个web app对应的部署结构的封装
  • Loader:它是对每个web app的自有的classloader的封装

7.Wrapper

image-20200107180004981

Wrapper为定义的接口,默认实现是StandardWrapper,主要有以下模块:

  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式
  • Servlet和Servlet Stack:保存Wrapper包装的Servlet