SpringBoot中如何配置嵌入式的Servlet容器

一、如何定制和修改Servlet容器的相关配置

方式一:修改service相关的配置文件

可以参照着 ServerProperties 这个类来看,里面由大量的配置信息:

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {

	/**
	 * Server HTTP port.
	 */
	private Integer port;
	...
	...
	/**
	 * Servlet properties.
	 */
	public static class Servlet {
		/**
		 * Context path of the application.
		 */
		private String contextPath;
		...
		...	
	/**
	 * Tomcat properties.
	 */
	public static class Tomcat {
		/**
		 * Character encoding to use to decode the URI.
		 */
		private Charset uriEncoding = StandardCharsets.UTF_8;
		...
		...	

然后在 application.properties 配置文件中修改配置

#配置端口号
server.port=8081

#项目访问路径
server.servlet.context-path=/hello

#tomcat配置中URI的字符编码
server.tomcat.uri-encoding=utf-8

#通用的servlet容器配置
server.xxx

#tomcat的配置
server.tomcat.xxx

像这样对应着配置文件修改,就可以自己定制化servlet啦

方式二:编写一个WebServerFactoryCustomizer

/**
 * 这是一个配置类
 * @author fanfan
 */
@Configuration
public class MyServerConfig {
    //配置嵌入式的Servlet容器
    @Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
            //定制嵌入式容器相关的规则
            @Override
            public void customize(ConfigurableWebServerFactory factory) {
            	//修改端口为8083
                factory.setPort(8083);
            }
        };
    }
}

二、注册Servlet三大组件【Servlet、Filter、Listener】

注册Servlet

编写一个Servlet类

/**
 * 注册servlet
 * @author fanfan
 */
public class MyServlet extends HttpServlet {
    //处理get请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    //处理post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello MyServlet...");
    }
}

接下来注册Servlet

@Configuration
public class MyServerConfig {
    //注册servlet
    @Bean
    public ServletRegistrationBean myServlet(){
        return new ServletRegistrationBean(new MyServlet(),"/hello");
    }
}

访问 http://localhost:8080/hello

测试成功
在这里插入图片描述
可以简单看看 ServletRegistrationBean 的 ServletRegistrationBean(T servlet, String… urlMappings)这个构造器

	/**
	 * Create a new {@link ServletRegistrationBean} instance with the specified
	 * {@link Servlet} and URL mappings.
	 * @param servlet the servlet being mapped
	 * @param urlMappings the URLs being mapped	
	 */
	public ServletRegistrationBean(T servlet, String... urlMappings) {
		this(servlet, true, urlMappings);
	}

注册Filter

编写一个Filter类

/**
 * @author fanfan
 */
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Hello MyFilter...");
    }
    @Override
    public void destroy() {
    }
}

接下来注册Filter

@Configuration
public class MyServerConfig {
    //注册filter
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        registrationBean.setUrlPatterns(Arrays.asList("/hello"));
        return registrationBean;
    }
}

此时调用了setFilter

	/**
	 * Set the filter to be registered.
	 * @param filter the filter
	 */
	public void setFilter(T filter) {
		Assert.notNull(filter, "Filter must not be null");
		this.filter = filter;
	}

和setUrlPatterns,因为需要一个集合对象,所以路径参数需要转换

	/**
	 * Set the URL patterns that the filter will be registered against. This will replace
	 * any previously specified URL patterns.
	 * @param urlPatterns the URL patterns
	 * @see #setServletRegistrationBeans
	 * @see #setServletNames
	 */
	public void setUrlPatterns(Collection<String> urlPatterns) {
		Assert.notNull(urlPatterns, "UrlPatterns must not be null");
		this.urlPatterns = new LinkedHashSet<>(urlPatterns);
	}

访问 http://localhost:8080/hello

测试成功
在这里插入图片描述

注册Listener

编写一个Listener类

/**
 * @author fanfan
 */
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("MyListener它来了...");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("MyListener它走了~~~");
    }
}

接下来注册Listenner

@Configuration
public class MyServerConfig {
    //注册listener
    @Bean
    public ServletListenerRegistrationBean myListener(){
        return new ServletListenerRegistrationBean(new MyListener());
    }
}

开启服务器
在这里插入图片描述
关闭服务器,在这正常退出
在这里插入图片描述
测试成功
在这里插入图片描述

三、使用其他的嵌入式Servlet容器

在这里插入图片描述
SpringBoot默认容器是Tomat

打开pox.xml文件,移除默认的tomcat启动器

在这里插入图片描述

 <exclusion>
     <artifactId>spring-boot-starter-tomcat</artifactId>
     <groupId>org.springframework.boot</groupId>
 </exclusion>

添加 jetty 容器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

启动服务器测试,Jetty 启动成功
在这里插入图片描述

添加 undertow 容器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

启动服务器测试,undertow 启动成功
在这里插入图片描述
注:添加其他容器前一定要移除掉默认的Tomcat容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值