SpringBoot-Servlet配置及容器切换
容器配置
1. 配置文件
# 简单配置可以通过application.yml文件直接进行配置
server.port=8080
2. 代码配置
@Configuration
public class Config {
@Bean
WebServerFactoryCustomizer webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
factory.setPort(8080);
}
};
}
}
WebServerFactoryCustomizer
:旧版本叫做EmbeddedServletContainerCustomizer
ConfigurableWebServerFactory
:记得泛型声明,默认方法factory是空的
组件注册
1. servlet注册
- 组件
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("response");
}
}
- 注册
@Configuration
public class Config {
ServletRegistrationBean<MyServlet> servletServletRegistrationBean(){
return new ServletRegistrationBean(new MyServlet(), "/myServlet");
}
}
servletServletRegistrationBean
:自动注册的包装Bean
new MyServlet()
:需要注册的Servlet实例对象
/myServlet
:访问映射地址
@Configuration
public class Config {
ServletRegistrationBean<MyServlet> servletServletRegistrationBean(){
ServletRegistrationBean bean = new ServletRegistrationBean();
bean.setLoadOnStartup(0);
bean.setServlet(new MyServlet());
bean.setUrlMappings(Arrays.asList("/", "/myservlet"));
return bean;
}
}
也可以先生成对象,再进行设置。
PS:除去简单映射,例如
LoadOnStartup
等信息也可以进行配置
2. Filter注册
- 组件
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("filter");
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
- 注册
@Configuration
public class Config {
@Bean
FilterRegistrationBean<MyFilter> filterFilterRegistrationBean(){
FilterRegistrationBean<MyFilter> filter = new FilterRegistrationBean<MyFilter>();
filter.setFilter(new MyFilter());
filter.setUrlPatterns(Arrays.asList("/", "/index"));
return filter;
}
- 过滤器可以通过路径进行过滤,分部进行设置
- 也可以通过
ServletRegistrationBean
集合直接自动过滤,具体可以查看构造方法
3. Listener注册
- 组件
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("do something");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("do nothing");
}
}
支持的Listener
类型
ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionAttributeListener
HttpSessionListener
ServletContextListener
- 注册
@Configuration
public class Config {
@Bean
ServletListenerRegistrationBean<MyListener> servletListenerRegistrationBean(){
ServletListenerRegistrationBean<MyListener> listener = new ServletListenerRegistrationBean<MyListener>();
listener.setListener(new MyListener());
listener.setEnabled(true);
listener.setOrder(1);
return listener;
}
同样的,可以设置监听方法,还有其他可配置参数。
容器切换
1. 三大容器
容器 | 优点 | 缺点 | 默认 |
---|---|---|---|
tomcat |
功能齐全 | 庞大,荣泽 | true |
jetty |
轻量 | 功能不全 | false |
undertow |
异步,高效 | 不支持jsp
|
false |
2. 容器切换
-
tomcat
spring-boot-starter-web
默认使用tomcat
spring-boot-starter-tomcat
:就会引入tomcat
jetty
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 去除tomcat依赖 -->
<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>
undertow
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 去除tomcat依赖 -->
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入undertow -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>