前言

传统的Servlet容器有Eclipse Jetty,Apache Tomcat。

Eclipse Jetty

Jetty作为Eclipse基金会的一部分,是一个开源的项目。它是一个纯粹的基于Java的网页服务器和Java Servlet容器。支持静态动态内容。
特性:
Asynchronous HTTP Server 异步
Standards based Servlet Container servlet容器
websocket server
http/2 server 支持http2
Asynchronous Client (http/1.1, http/2, websocket)
OSGI(Springboot不支持), JNDI, JMX, JASPI, AJP support

Apache Tomcat

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器。
标准实现:Servlet、JSP、Expression Language、WebSocket

Tomcat核心组件(Components):Engine->Host->Context。

官网文档了解一下-Tomcat8.5

这里写图片描述

conf/server.xml是tomcat全局配置,请求编码格式在这里也可以配一下。

静态资源处理

conf/web.xml中可以看到,和我们应用程序xml大体一样。

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <!-- debug 开关 -->
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <!-- true访问目录url会显示目录列表  -->
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

<!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

这里写图片描述

jsp处理

conf/web.xml可查看Jsp配置
这里写图片描述

欢迎页面(Welcome file list)

当我们访问URL,没有指定文件时,默认会跳到一个页面,这是怎么回事呢,原因就在conf/web.xml文件中的<welcome-file-list>标签。
这里写图片描述

类加载(ClassLoading)

这里写图片描述

  • 启动(Bootstrap)类加载器:负责将 Java_Home/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。打印出来为null

  • 标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将Java_Home /lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

  • 应用程序(Application)类加载器:是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,因此一般称为系统(System)加载器。

JDBC数据源(DataSource)

这里写图片描述

context.xml中添加。代码中对应的是BasicDataSource。

<Resource name="jdbc/TestDB" auth="Cantainer"
type="javax.sql.DataSource"
username="root"
password="123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/" />

再在web.xml中引用。

<resource-ref>
    <res-ref-name>jdbc/TestDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
public class jdbcTest extend HttpServlet {
    private DataSource dataSource;
    public void init(ServletConfig servletConfig) throws ServletException {
        try{
            Context context = new InitialContext();
            Context evnContext = (Context)context.lookup("java.comp/env");
            //取web.xml的res-ref-name
            dataSource = (DataSource) envContext.lookup("jdbc/TestDB");
        } catch(Exception e) {

        }
    }
}
web.xml
<env-entry>
    <env-entry-name>Bean</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>Hello,World</env-entry-value>
</env-entry>

Servlet.java
String Bean = (String)envContext("Bean");
连接器

连接器中包括端口port、协议protocol、线程池、超时时间。
conf/server.xml文件中。
这里写图片描述
注释中有一个executor属性,可以自己定义

<Executor name="tomcatPool" namePrefix="Lion-exec-" maxThreads="150"
        minSpareThreads="4" />

嵌入式Tomcat

我们可以在application.properties中修改端口号。

server.port = 8808

从而可以搜索出是ServerProperties.class该类作为配置类。
这里写图片描述
该类里头有一个静态Tomcat类,跟server.xml相同意思。
这里写图片描述

可以看到EmbeddedWebServerFactoryCustomizerAutoConfiguration类创建TomcatWebServerFactoryCustomizer使用到了ServerProperties配置类。
这里写图片描述

TomcatWebServerFactoryCustomizer Customization for Tomcat-specific features common for both Servlet and Reactive servers.该类定制Tomcat功能,这些功能对于Servlet和Reactive服务器都是通用的。
这里写图片描述

其中ConfigurableTomcatWebServerFactory提供接口完成特点的设置。
这里写图片描述

//实现了ConfigurableTomcatWebServerFactory
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
        implements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {
}

TomcatServletWebServerFactoryCustomizer使用到了TomcatServletWebServerFactory
这里写图片描述

定制端口

@Bean
    public TomcatServletWebServerFactory setPort() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.setPort(2000);
        return factory;
    }

或者

@Bean
    public static WebServerFactoryCustomizer get() {
        return new WebServerFactoryCustomizer() {

            @Override
            public void customize(WebServerFactory factory) {
                if (factory instanceof TomcatServletWebServerFactory) {
                    TomcatServletWebServerFactory tomcatServletWebServerFactory = TomcatServletWebServerFactory.class.cast(factory);
                    tomcatServletWebServerFactory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                        @Override
                        public void customize(Connector connector) {
                            connector.setPort(8008);
                            connector.setProtocol("org.apache.coyote.http11.Http11NioProtocol");
                        }
                    });
                }
            }
        };
    }
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐