zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    继承
    类和对象
    Scanner类
    面向对象思想
    final关键字
    The difference between text mode and binary mode with file streams
    Linux下常见权限操作相关命令
    Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext
    手动运行jar包,指定配置文件
    jdk 1.8.0_131 Class JavaLaunchHelper is implemented
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/13180908.html
Copyright © 2011-2022 走看看