Cómo configurar el contenedor de servlet integrado en SpringBoot
SpringBoot usa Tomcat como el contenedor de servlet integrado de forma predeterminada
1. Cómo personalizar y modificar la configuración relevante del contenedor Servlet
1.1 Modificar la configuración relacionada con el servidor
1.1.1 Modificar mediante archivo de configuración
server.port=8081
server.context-path=/crud
server.tomcat.uri-encoding=UTF-8
//通用的Servlet容器设置
server.xxx
//Tomcat的设置
server.tomcat.xxx
1.1.2 编写 EmbeddedServletContainerCustomizer
@Bean //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
return new EmbeddedServletContainerCustomizer() {
//定制嵌入式的Servlet容器相关的规则
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8083);
}
};
}
2. Registre los tres componentes principales de Servlet
2.1 Registrar servlet
Primero escribe un servlet
public class MyServlet extends HttpServlet {
//处理get请求
@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("Hello MyServlet");
}
}
Luego inyecte el Servlet escrito en el contenedor
@Configuration
public class MyServerConfig {
//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
registrationBean.setLoadOnStartup(1);
return registrationBean;
}
}
2.2 Filtro de registro
Primero escribe un filtro
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() {
}
}
Luego inyecte el filtro escrito
@Configuration
public class MyServerConfig {
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
return registrationBean;
}
2.3 Registrar oyente
Primero escribe un oyente
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项目销毁");
}
}
Reinyectar al oyente
@Configuration
public class MyServerConfig {
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
return registrationBean;
}
}
3. Reemplace Tomca con otros contenedores de Servlet integrados
En la fábrica de clases de implementación de la interfaz ConfigurableEmbeddedServletContainer, encontramos que hay tres contenedores de Servlet integrados predeterminados en SpringBoot:
Tomcat se usa por defecto
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
引入web模块默认就是使用嵌入式的Tomcat作为Servlet容器;
</dependency>
Modifiquemos la configuración predeterminada:
<!-- 引入web模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!--引入其他的Servlet容器-->
<dependency>
<artifactId>spring-boot-starter-jetty</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>
Primero excluimos Tomcat y luego presentamos otros contenedores.
Lo mismo
<!-- 引入web模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!--引入其他的Servlet容器-->
<dependency>
<artifactId>spring-boot-starter-undertow</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>
4. Utilice un contenedor de servlet externo
Contenedor de servlet integrado: la aplicación está empaquetada en un jar ejecutable
Ventajas: simple y portátil
Desventajas: JSP no es compatible de forma predeterminada, la optimización y personalización son más complicadas
Contenedor de servlet externo: Tomcat se instala afuera y la aplicación está empaquetada en un paquete war Los
pasos son los siguientes:
- Crea un proyecto de guerra; (puedes usar idea para crear una buena estructura de directorios)
- Especifique Tomcat como se proporciona, y la idea se cambia automáticamente cuando se crea la estructura del directorio.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
- Escriba una subclase de SpringBootServletInitializer y llame al método configure, si la estructura de directorio creada por IDEA, puede encontrar que esta clase ha sido creada
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
//传入SpringBoot应用的主程序
return application.sources(SpringBoot04WebJspApplication.class);
}
}
Además, una cosa a la que hay que prestar atención es el problema de la estructura del proyecto.
Después de crear el directorio correspondiente de la manera conveniente de IDEA, puede escribir código comercial e iniciar la aplicación.