• (7)Spring Boot web开发 --- servlet容器



    配置嵌入式 Servlet 容器

    Spirng Boot 默认使用自带的嵌入式 Servlet 容器 ;

    1. 修改和定制默认的 Servlet 容器的相关配置

      • 通过 application.properties/yml 文件

        # 服务器基本配置,都是以 server 开头
        server.port=8081
        
        # 具体的 servlet 容器配置,写上具体的 servlet 名字,比如这里是 tomcat
        server.tomcat.uri-encoding=utf-8
        
      • 编写 WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>()

        这种方式是通过代码来设置:

            /**
             * 通用的管理
             *
             * @return
             */
            @Bean
            public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer() {
                return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
        
                    @Override
                    public void customize(ConfigurableServletWebServerFactory factory) {
                        factory.setPort(8089);
                    }
                };
            }
        
            /**
             * 针对具体的 servlet ,这里是 tomcat
             *
             * @return
             */
            @Bean
            public ConfigurableServletWebServerFactory webServerFactory() {
                TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
                factory.setPort(9000);
                factory.setUriEncoding();
                return factory;
            }
        
        
        

        关于 EmbeddedServletContainerCustomizer 接口,我在我使用的 Spring Boot2.1.3)版本中,没有这个接口,我去官网文档看了下也没有相关的记录了,可能被废弃了;

        上面的例子也是在官网找到的,其中官网例子还有个东西,就是通过编码设置 session 过期时间:

      在这里插入图片描述

      这句代码是通不过的,因此,设置 session 过期时间,只能在配置文件里面配置 ;

      如果编码和配置文件,都配置了相同的属性,编码中的属性优先级高 ,其实应该是后读取的原因;


    注册 三大组件

    三大组件分别 Servlet、Filter、Listener ,分别使用 ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean 注册;

    servlet 为例子:

    首先写一个 Servlet ,可能有人已经忘记了,怎么写了,这是梦最初的地方啊,从一个简单的 servlet 学起;

    
    public class MyServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().write("helle 啊啊啊");
        }
    }
    
    

    然后注册,在配置类里面写:

     /**
         * 注册 servlet
         */
        @Bean
        public ServletRegistrationBean servletRegistrationBean() {
            // 接受两个参数,第一个是要映射的 servlet,第二个参数是变长数组,指定匹配哪些路径
            return new ServletRegistrationBean(new MyServlet(), "/my","/sss");
        }
    
    

    两外两个大同小异;

    Spring Boot 也自动的帮我们自动的注册了 SpringMvc 的前端控制器 DispatcherServlet ,默认的拦截规则是 :/ 拦截所有请求,包括静态页面,但是不拦截 jsp/* 才会拦截 jsp

    我们也可以在配置文件里面,进行更改默认的拦截规则 :server.servletPath


    使用其他 servlet 容器

    Jetty 适合做长连接,视频聊天这样的场景,Tomcat 不适合;而 Undertow 适合高并发,但是不支持 jsp

    其中内中的 Servlet 容器都不支持 jsp

    我们可以根据业务需要,选择哪一个容器,反正 Spring Boot 都支持 ;

    切换很简单,只需要在 pom 文件中引入即可 ,同时排除 tomcat 的依赖,因为spring-boot-starter-web 场景启动器,默认使用就是 tomcat

     		<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <!--排除 tomcat 依赖-->
                <exclusions>
                    <exclusion>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                        <groupId>org.springframework.boot</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
    		<!--引入 jetty-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>
    

    排除完 tomcat 以后,要保证项目中没有和 tomcat 有关的东西了,一般应该都没有,除了自己配置服务器的应用,配置了 tomcat 的配置:

     /**
         * 针对具体的 servlet ,这里是 tomcat
         *
         * @return
         */
        @Bean
        public ConfigurableServletWebServerFactory webServerFactory() {
            TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
            factory.setPort(9000);
            return factory;
        }
    

    Spring Boot 默认的 Servlet 容器是 Tomcat,启动可以看到:
    在这里插入图片描述

    切换成 jetty 以后,启动可以看到:

    在这里插入图片描述

    切换 Undertow 一样的操作;


    使用外置的 Servlet 容器

    内置的 servlet 用起来,确实爽,内置一时爽,一直内置一直爽,但是它也有一个致命的缺点,就是不支持 JSP

    但是项目有时候,确实有 jsp 存在啊,因此,有时候,需要使用外置的 Servlet 容器,在项目创建之初就要选择好,还记得第一篇中讲到的快速构建项目,在第二步的时候,需要改动下:

    在这里插入图片描述

    然后一路继续创建项目;

    创建好的项目的pom文件和使用 jar 打包的,有些许不同:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	...
    	...
    	<groupId>com.example</groupId>
    	<artifactId>demo</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<!-- 打包方式-->
    	<packaging>war</packaging>
    	<name>demo</name>
    	<description>Demo project for Spring Boot</description>
    
    	...
    
    	<dependencies>
    		...
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-tomcat</artifactId>
    			<!-- 内置的tomcat 被排除-->
    			<scope>provided</scope>
    		</dependency>
    		
    	  ...
    	  ...
    	</dependencies>
    
    	....
    	,,,,
    
    </project>
    

    然后项目结构需要添加点东西进来:

    首先 IDEA 添加 tomcat ,是个 javaweb 码农都会的操作,略过;

    然后按照下面一通瞎造作:

    在这里插入图片描述
    这时候,自动生成的 WEB-INF 目录位置不对,需要自己拖拽下,成品如下:

    还多了一个类,这个类,不要去碰,是保正项目正确运行的保障:
    在这里插入图片描述

    然后运行:

    在这里插入图片描述

    OK,完事!


  • 相关阅读:
    金蝶数据库执行语句
    金蝶 更新价格分录表触发器
    金蝶触发器,生成条码信息
    SQL从中文中获取拼音首字母
    C语言 typedef用法
    这姑娘漂亮不,说实话,有糖吃
    条码开发的意义在哪里
    ERP开发,重点不在功能
    金蝶出入库数据库表里加字段后出现的问题解决
    解决金蝶未检测到K/3许可文件,并且该账套已超过演示版期限问题
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665578.html
Copyright © 2020-2023  润新知