传统的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。
之前在SSM中,我们需要一个web.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>
类似这样的流程,具体的加载过程如图所示:
启动(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)加载器。
但在使用SpringBoot的过程中我们发现我们需要在yml文件中配置好对应的端口就可以使用
配置端口号,项目名等我们除了可以通过application.yml配置文件配置外,我们可以用代码自定义配置tomcat的相关设置(通过EmbeddedServletContainerCustomizer类)。
@Configuration
public class MyConfig {
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
factory.setPort(10086);
}
};
}
}
这样的话端口就可以设置为10086了
三大组件:监听器,过滤器和servlet
由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。注册三大组件用以下方式ServletRegistrationBean,FilterRegistrationBean,ServletListenerRegistrationBean
@Configuration
public class MyConfig {
@Bean
public ServletRegistrationBean myServlet(){
//映射/myServlet请求
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
registrationBean.setLoadOnStartup(1);
return registrationBean;
}
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
return registrationBean;
}
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
return registrationBean;
}
}
当然MyXXXX都是要自己写的,对应的是三个接口的实现HttpServlet,Filter,ServletContextListener
smartcat.994