CRUD工程师——嵌入式Web容器

传统的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

猜你喜欢

转载自www.cnblogs.com/SmartCat994/p/13180908.html
今日推荐