Notes
  • Introduce
  • Go
    • Grammar
      • Basic
      • Goroutines & Channels
      • Test
    • System Library
      • Module
      • sync
      • context
      • net
    • Concurrency in Go
    • The Go Memory Model
    • Code Snippet
  • Rust
    • The Rust Programming Language
    • Rust by Example
  • JAVA
    • Preface
    • Grammar
      • Basic
      • Data Types
      • Operator
      • Exceptions
    • Class Libraries
      • Collection
      • Stream
      • IO
      • NIO
      • RMI
    • Concurrency
      • Preface
      • JMM
      • Synchronized & CAS
      • Deadlock
      • Thread
      • Lock & Condition
      • Utility Class
      • Thread-safe Collection
      • Atomic Class
      • Fork/Join
      • Concurrency Design Patterns
        • Immutable
        • Copy-on-Write
        • ThreadLocal
        • Multitheading If
        • Division
    • JVM
      • Class & Instance Initialization
      • Runtime Data Area
      • Garbage Collection
    • Web Container
      • Tomcat Architecture
      • Jetty Architecture
    • Spring
    • Tuning
      • Programming
  • Computer Science
    • Computer Organization
    • Algorithm
      • Complexity
      • Linear List
      • Sort
      • Binary Search
      • Skip List
      • Hash Table
      • Tree
      • Graph
      • String Matching
      • Bloom Filter
      • Greedy Algorithm
      • Divide and Conquer
      • Back Tracking
      • Dynamic Programming
    • Network Protocol
      • Pysical Layer
      • Data Link Layer
      • Network Layer
      • Transport Layer
      • Application layer
      • HTTP
      • HTTP/2 in Action
    • Operating System
      • Basic
      • System Initialization
      • Diagnostic Tools
      • CPU Diagnosis
      • Memory Diagnosis
      • Disk Diagnosis
      • Network Diagnosis
      • Monitor System
    • Design Patterns
      • UML
      • OOP
      • Principle
      • Refactoring & Specification
      • Creational
        • Singleton
        • Factory
        • Builder
        • Prototype
      • Structural
        • Proxy
        • Bridge
        • Decorator
        • Adapter
        • Facade
        • Composite
        • FlyWeight
      • Behavioral
        • Observer
        • Template Method
        • Strategy
        • State
        • Iterator
        • Chain of Responsibility
    • Distributed System
      • Protocol & Algorithm
      • Transcation
      • Theory
      • Resource Management
      • Scheduling
      • Computing
      • Message Queue
      • Cache
      • Consistent Hashing
  • database
    • InfluxDB
      • In-Memory Index
      • Meta
    • MySQL
      • SQL
      • Architecture
      • Log
      • Transaction
      • Indexing
      • Lock
      • Storage
    • Redis
    • Elasticsearch
      • Local Debug
    • HBase
    • Kafka
    • ZooKeeper
  • Reading
    • RocketMQ
    • 演说之禅
    • So Good They Can't Ignore You
    • 学会提问
    • Lecture
  • Other
    • v2ray
    • Kubernetes
    • Git
    • Maven
    • Anaconda And Conda
    • Fuck! Shit!
      • Remove Final by Reflection
      • Ingress Host
      • ExecuterService submit
  • Open source contribution
Powered by GitBook
On this page
  • 基本介绍
  • Servlet
  • Filter
  • Listener
  • Servlet、Spring、SpringMVC 容器

Was this helpful?

  1. JAVA

Web Container

PreviousGarbage CollectionNextTomcat Architecture

Last updated 5 years ago

Was this helpful?

基本介绍

了解 Web 容器需要要先了解 。

Servlet

Sun 公司推出了 Servlet 技术,Servlet 没有 main 方法,必须把它部署在 Servlet 容器中,Servlet 容器一般也具有 HTTP 服务器的功能,所以 Servlet 容器 + HTTP 服务器 = Web 容器。

Web 容器主要做的工作是:接受连接、解析请求数据、处理请求、发送响应。

HTTP 服务器不直接跟业务类打交道,而是把请求交给 Servlet 容器,Servlet 容器会将请求转发到某个具体的 Servlet,若还没创建,则先加载并实例化。

Servlet 规范是关于 Servlet 接口和 Servlet 容器的规范。Tomcat 和 Jetty 都按照 Servlet 规范要求实现了 Servlet 容器,再加上了 HTTP 服务器的功能。

public interface Servlet {
    // Spring 的 DispatchServlet 在这里创建了自己的 SpringMVC 容器
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    
    // 最重要的方法,业务类的逻辑在这里实现
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
}

public abstract class HttpServlet extends GenericServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException { }
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException { }
}

Web 应用的目录结构:

| -  MyWebApp
      | -  WEB-INF/web.xml        -- 配置文件,用来配置 Servlet 等
      | -  WEB-INF/lib/           -- 存放 Web 应用所需各种 JAR 包
      | -  WEB-INF/classes/       -- 存放你的应用类,比如 Servlet 类
      | -  META-INF/              -- 目录存放工程的一些信息

创建一个 Servlet 类后,有两种方式注册,通过 web.xml 或通过注解:

<servlet>
  <servlet-name>myServlet</servlet-name>
  <servlet-class>MyServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>myServlet</servlet-name>
  <url-pattern>/myservlet</url-pattern>
</servlet-mapping>
@WebServlet("/myAnnotationServlet")
public class AnnotationServlet extends HttpServlet { }  

Servlet 规范定义了 ServletContext 接口对应一个 Web 应用。一个 Web 应用的所有 Servlet 可以通过 ServletContext 来共享数据。

Filter

Filter:是干预过程的,让你对请求和响应做一些统一的定制化处理。Servlet 容器会实例化所有的 Filter,并链接成一个 FilterChain,Filter 的 doFilter 负责调用 FilterChain 的下一个 Filter。

public interface Filter {
    default public void init(FilterConfig filterConfig) throws ServletException {}
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException;
    default public void destroy() {}
}

Listener

Listener:是基于状态的,Web 应用在 Servlet 容器中运行时,Servlet 容器内部会发生各种事件,如 Web 应用的启动、停止、用户的请求到达,Servlet 容器提供了一些默认的监听器来监听这些事件。Spring 实现了自己的监听器(ContextLoaderListener),监听 ServletContext 的启动事件,创建并初始化全局的 Spring 容器(注意区分 DispatchServlet init 方法中初始化的 SpringMVC 容器)。

ContextLoaderListener 初始化的是全局的 Spring 根容器,即 Spring 的 IoC 容器。DispatchServlet init 方法中初始化的容器是 SpringMVC 容器,它的父容器是 Spring IoC 容器。子容器可访问父容器中的 Bean(如 Service),但是父容器不能访问子容器的 Bean(如 Controller)。

Servlet、Spring、SpringMVC 容器

Tomcat 架构
Jetty 架构
HTTP 协议