SpringBoot3 配置嵌入Servlet容器

1. 完整的正确配置

1.1 主应用类配置

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
// 扫描@WebServlet, @WebFilter, @WebListener注解
@ServletComponentScan  
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

1.2 自定义Servlet类

java 复制代码
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

/**
 * 注册Servlet 三大组件: Servlet  Filter Listener
 */

// 方式1:指定具体的URL模式
@WebServlet(name = "myServlet", urlPatterns = "/servlet")
// 方式2:或者使用value属性(和urlPatterns等价)
// @WebServlet("/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("Hello MyServlet");
        System.out.println("name: " + req.getParameter("name"));
    }
}

1.3 自定义Filter类

java 复制代码
/**
 * 注册Servlet 三大组件: Servlet  Filter Listener
 */
@WebFilter("/")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter--init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("myFilter--doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("MyFilter--destroy");
    }
}

1.4 自定义Listener类

java 复制代码
/**
 * 注册Servlet 三大组件: Servlet  Filter Listener
 */
@WebListener
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("web项目启动了。。。");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("web项目销毁了。。。");
    }
}

2. 常见问题及解决方案

问题1:Servlet没有被正确扫描

解决方案

java 复制代码
// 明确指定扫描的包路径
@ServletComponentScan(basePackages = "com.example.servlet")
// 或者
@ServletComponentScan(basePackageClasses = {MyServlet.class})

问题2:Spring Boot版本问题

在Springboot应用中 , @WebServlet("/servlet")

http://localhost:8081/servlet?name=lili 404 (Not Found)

对于Spring Boot 2.x+,确保使用正确的依赖:

pom.xml:

XML 复制代码
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>

对于Spring Boot 3.x+(使用Jakarta EE):

XML 复制代码
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>
相应的Servlet类:  // Spring Boot 3.x使用Jakarta
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

问题3:端口配置错误

检查application.properties或application.yml:

java 复制代码
# application.properties
server.port=8081

问题4:DispatcherServlet路径冲突

如果Spring MVC的DispatcherServlet映射到了/,可能会影响自定义Servlet。

解决方案:修改Servlet的URL模式:

java 复制代码
// 使用不同的路径
@WebServlet("/api/servlet")
// 或者使用路径前缀
@WebServlet("/custom/*")
相关推荐
十年Java程序媛16 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
vipxieliang20 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
吃饱了得干活20 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
jay神1 天前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
谢亮_vipxieliang1 天前
ValidX分组验证详解:不同场景使用不同验证规则
java·spring boot·后端·spring cloud·eclipse·hibernate
凤山老林2 天前
Spring Boot 集成 Spring Vault:集中式密钥管理与动态凭证轮换
spring boot·后端·spring·vault·集中式秘钥管理
2601_962071172 天前
八. Spring Boot2 整合连接 Redis(超详细剖析)
spring boot·redis·后端
钱栈up2 天前
VSCode 调试多模块 Maven + Spring Boot 后端:从启动失败到一次跑通
java·spring boot·maven
2601_962189602 天前
【SpringBoot】使用IDEA创建SpringBoot项目
java·spring boot·intellij-idea
步行cgn2 天前
Spring Boot 启动报错:MissingServletWebServerFactoryBean 的排查与解决
java·spring boot·后端