配置嵌入式的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容器