SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案

 更新时间:2025年03月13日 08:47:13   作者:回忆也交给时间  
SpringBoot中以Bean方式注册Servlet时遇到的问题,通过了解DispatcherServlet的原理,发现默认路径冲突是主要原因,本文介绍SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案,感兴趣的朋友一起看看吧

一.导言

 SpringBoot的真正核心是快速整合以及自动装配,所以在spring家族中springBoot不仅整合了Spring的IOC容器还兼容了WebServlet容器;这使得springBoot项目不仅支持快速开发微服务,同时具备开发MVC模式下的项目。

其中MVC模式的实现者之一就是WebServlet;由于springBoot的整合,在其项目中开发WebServlet也是可行方案之一。但是在使用servlet技术时我们遇到了一个问题:即在SpringBoot中,以Bean的方式注册servlet需要自定义两个及以上的servlet。

这是为什么呢?

二.测试验证问题

 首先验证一个servlet的情况

先配置servlet实现类:

public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet 1 的实现类");
        resp.getWriter().print("this is servlet 1");
    }
}

在config配置类中注册这个servletBean:

@Configuration
public class RegisterBean {
    @Bean
    public OneServlet createOneServlet(){
        //注册servlet 1
        return new OneServlet();
    }
}

直接启动springBoot启动器查看是否可以完成一次servlet的请求

地址栏输入:

http://localhost:9000/createOneServlet/

或者:

http://localhost:9000/OneServlet/

显示都是错误页面:

 验证两个servlet的情况

拓展一个servlet实现类:

public class TwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet 2 的实现类");
        resp.getWriter().print("this is servlet 2");
    }
}

以及使用Bean的方式完成注入:

@Configuration
public class RegisterBean {
    @Bean
    public OneServlet createOneServlet(){
        //注册servlet 1
        return new OneServlet();
    }
        @Bean
    public TwoServlet createTwoServlet(){
        //注册servlet 2
        return new TwoServlet();
    }
}

再次启动springBoot启动器:

运行:

http://localhost:9000/createOneServlet/

结果可以拿到请求,正常处理

 运行:

http://localhost:9000/createTwoServlet/

结果依旧可以拿到,正常处理请求:

 这就出现了刚开始提到的那个问题:springBoot项目运行时,一个servlet无法进行请求,当有两个时却可以进行请求

 解决这问题之前,我们需要一点前言知识,那就是需要先了解SpringMVC中的DispatcherServlet

三.解决单servlet无法正常请求的问题

 DispatcherServlet 是 Spring MVC 框架的核心组件,它充当前端控制器(Front Controller)的角色,负责接收所有的 HTTP 请求并将其分发到相应的处理器(Handler)。通过这种方式,DispatcherServlet 实现了请求的集中管理和分发。请求分发:接收所有进入的应用程序的HTTP请求,并根据配置将它们分发给合适的处理器(Controller)。

 当然DispatcherServlet的功能还有很多,我们只把关系到问题的部分单独拿出来。我们知道SpringMVC在JavaWeb的基础之上,演化了DispatcherServlet,它的本质依旧是一个servlet,在SpringMVC中将其单独拿出来作为前后端连接的大脑,通常它会将前端所有的请求都拦截下来,然后经过一系列验证之后移交给controller处理,处理完成之后又返回给它,返回给视图层。

由于springBoot中整合了SpringMVC,故而DispatcherServlet存在于spring容器中的。

 回到刚刚的问题,一个servlet为什么执行不起来,这还得分析我们注入servlet的方式

@Bean
    public OneServlet createOneServlet(){
        //注册servlet 1
        return new OneServlet();
    }

 由于我们注入使用的是最简单的注入方式,并没有配置这个servlet的请求路径;

DeepSeek:如果没有显式配置路径映射,Spring Boot 会尝试为 Servlet 分配默认路径,通常是 Servlet 的名称或类名的小写形式。如果默认路径与其他映射冲突,或 Servlet 未正确注册,可能导致无法访问。

在第一种情况下,springBoot是在尝试进行为servlet命名的,只是为其命名的映射路径刚好和DispatcherServlet的拦截请求冲突了,故而失败了

我们在失败的情况下编写一个controller,看相同的请求是不是交给DispatcherServlet处理了

controller:

@RestController
public class ServletTest {
    @GetMapping("/createOneServlet/")
    public String test(){
        return "return from Spring MVC";
    }
}

和第一次失败测试一样的请求:

http://localhost:9000/createOneServlet/

结果

 可以发现,配置一个controller之后确实请求被DispatcherServlet接管了,故而有springMVC框架进行返回

知道了问题所在就可以进行修改了,推荐两种解决方案

1.更改DispatcherServlet的默认拦截路径

在SpringBoot中DispatcherServlet的默认拦截路径是  "/*" ;故而将其改到其它位置后,他就不会影响SpringBoot为没有配置映射路径的servlet命名了

更改application.properties文件:

spring.mvc.servlet.path= /test/

将DispatcherServlet的默认匹配路径更改到   “ /test/* ”  下

注销controller类的实现:

//    @GetMapping("/createOneServlet/")
//    public String test(){
//        return "return from Spring MVC";
//    }

再次启动,测试单servlet未配置路径是否有问题:

http://localhost:9000/createOneServlet/

结果:

可以看到,servlet成功将其请求处理了

2.配置单个servlet的请求路径

配置servlet实现类使用@WebServlet注解:

@WebServlet(urlPatterns = "/createOneServlet")
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet 1 的实现类");
        resp.getWriter().print("this is servlet 1");
    }
}

在springBoot启动器上配置自动扫描servlet的注解@ServletComponentScan:

@SpringBootApplication
@ServletComponentScan
public class ServletTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServletTestApplication.class, args);
    }
}

启动测试:

http://localhost:9000/createOneServlet/

结果:

 可以发现依旧运行出来了结果

如上就是推荐在SpringBoot中注册servlet的两种方式

为什么两个自定义servlet不写映射却可以呢?

DeepSeek:两个自定义 Servlet 可以访问的原因

自动注册:当有多个 Servlet 时,Spring Boot 会为每个 Servlet 生成默认路径,通常基于类名或者Bean。
路径唯一性:多个 Servlet 的默认路径通常不会冲突,因此可以正常访问。

也就是基于这样的原因,DispatcherServlet没有产生拦截,因为这两个自定义servlet已经在Servlet容器中完成注册,根据Java servlet的匹配规范,即最长匹配原则,/(类名|Bean)的匹配长度比DispatcherServlet /* 精度更高,故而两个servlet的情况下,即使不修改SpringMVC的配置依旧可以正常访问。

到此这篇关于SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案的文章就介绍到这了,更多相关SpringBoot集成WebServlet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot使用sharding jdbc的配置方式

    spring boot使用sharding jdbc的配置方式

    这篇文章主要介绍了spring boot使用sharding jdbc的配置方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • SpringBoot中@ConfigurationProperties实现配置自动绑定的方法

    SpringBoot中@ConfigurationProperties实现配置自动绑定的方法

    本文主要介绍了SpringBoot中@ConfigurationProperties实现配置自动绑定的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java哈希表的概念及实现完整代码

    Java哈希表的概念及实现完整代码

    这篇文章主要介绍了Java哈希表的概念及实现的相关资料,哈希表是一种高效查找数据的结构,通过哈希函数将关键字映射到数组的索引位置,当发生冲突时,可以通过闭散列或开散列(链地址法)来解决,需要的朋友可以参考下
    2024-11-11
  • SpringBoot结合ElasticSearch实现模糊查询的项目实践

    SpringBoot结合ElasticSearch实现模糊查询的项目实践

    本文主要介绍了SpringBoot结合ElasticSearch实现模糊查询的项目实践,主要实现模糊查询、批量CRUD、排序、分页和高亮功能,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • mybatisplus的公共字段插入的实现

    mybatisplus的公共字段插入的实现

    这篇文章主要介绍了mybatisplus的公共字段插入,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 基于SpringBoot+Redis实现分布式锁

    基于SpringBoot+Redis实现分布式锁

    本文主要介绍了基于SpringBoot+Redis实现分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • SpringBoot配置Https入门实践

    SpringBoot配置Https入门实践

    本文主要介绍了SpringBoot配置Https入门实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • SpringBoot整合PageHelper实现分页查询功能详解

    SpringBoot整合PageHelper实现分页查询功能详解

    PageHelper是mybatis框架的一个插件,用于支持在mybatis执行分页操作。本文将通过SpringBoot整合PageHelper实现分页查询功能,需要的可以参考一下
    2022-03-03
  • 浅谈log4j的rootLogger及其他坑爹的地方

    浅谈log4j的rootLogger及其他坑爹的地方

    这篇文章主要介绍了log4j的rootLogger及其他坑爹的地方,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • IDEA如何切换JDK版本

    IDEA如何切换JDK版本

    本文主要介绍了IDEA如何切换JDK版本,JDK版本之间的关系是一个向后兼容的关系,所以我们需要切换JDK的版本号,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论