配置嵌入式Servlet容器
一、定制和修改Servlet容器的相关配置
1. 修改和server相关的配置:直接在主配置文件中设置
server.xxx
:通用的Servlet容器设置
server.tomcat.xxx
:Tomcat的设置
2. 定制嵌入式Servlet容器,来修改Servlet配置:编写一个嵌入式的Servlet容器WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
,并且要加入到容器中@Bean
具体代码:
config/MyServerConfig
:
@Configuration
public class MyServerConfig {
/*
* TODO 编写一个嵌入式的Servlet容器,来修改相关配置
* WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
* 并且要加入到容器中
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
// 定制嵌入式Servlet的相关配置
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
factory.setPort(8083);
}
};
}
}
二、注册Servlet三大组件(Servlet,Filter,Listener)
先定制自己的组件类,然后使用下面三个方式在MyServerConfig
中注册自己的组件类(需要加入到容器中@Bean
)
1. Servlet
(1)MyServlet extends HttpServlet
(2)ServletRegistrationBean<Servlet>
具体代码:
servlet/MyServlet
:
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 {
resp.getWriter().write("Hello MyServlet");
}
}
config/MyServerConfig
:
// (1)Servlet:ServletRegistrationBean<Servlet>
@Bean
public ServletRegistrationBean<Servlet> myServlet(){
ServletRegistrationBean<Servlet> registrationBean = new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
return registrationBean;
}
效果:输入 http://localhost:8083/myServlet
,页面显示:Hello MyServlet
2. Filter:
(1)MyFilter implements Filter
(2)FilterRegistrationBean<Filter>
具体代码:
filter/MyFilter
:
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("MyFilter process...");
// 放行
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
config/MyServerConfig
:
// (2)Filter:FilterRegistrationBean<Filter>
@Bean
public FilterRegistrationBean<Filter> myFilter(){
FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
// 拦截请求
registrationBean.setUrlPatterns(Arrays.asList("/hello", "/myServlet"));
return registrationBean;
}
效果:输入 http://localhost:8083/myServlet
或者 http://localhost:8083/hello
,后台显示:MyFilter process...
3. Listener:
(1)MyListener implements ServletContextListener
(2)ServletListenerRegistrationBean<EventListener>
具体代码:
listener/MyListener
:
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("contextInitialized。。。web应用启动");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed。。。web项目销毁");
}
}
config/MyServerConfig
:
// (3)Listener:ServletListenerRegistrationBean<EventListener>
@Bean
public ServletListenerRegistrationBean<EventListener> myListener(){
ServletListenerRegistrationBean<EventListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
return registrationBean;
}
效果:
(1)项目启动,控制台显示:contextInitialized。。。web应用启动
(2)项目销毁(要点左下角的Exit,而不是Stop),控制台显示:contextDestroyed。。。web项目销毁
三、切换为其他嵌入式Servlet容器(Tomcat默认,Jetty,Undertow)
1. 在pom.xml中先排除Tomcat
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
2. 引入其他的Servlet容器
<dependency>
<artifactId>spring-boot-starter-jetty</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>