前言
传统的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。
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");
}
});
}
}
};
}