jakarta.servlet.ServletException: 类com.tang.HelloServlet不是Servlet

文章讲述了在Tomcat10中servletAPI发生改变导致的问题及其两种解决方案。一种是修改POM文件,添加新的javaxservlet相关依赖,包括jakarta.servlet-api,jakarta.servlet.jsp-api等。另一种解决方案是回退到Tomcat9版本。

问题描述:

 

 

问题根因:

tomcat10 的servlet 的 api包发生变化 

解决方法:

1.第一种方法:

改pom里面的javax的servlet的依赖:

  <dependencies>

    <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>10.0.4</version>

      </dependency>
      <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>5.0.0</version>
      </dependency>
      <dependency>
        <groupId>jakarta.servlet.jsp</groupId>
        <artifactId>jakarta.servlet.jsp-api</artifactId>
        <version>3.0.0</version>
      </dependency>
      <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>3.0.1</version>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
      </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>


  </dependencies>

2.第二种方法:

重装tomcat 9的版本

 

修改后运行结果:

<think>好的,我现在需要解决用户在实例化ReadServlet时遇到的ServletException异常问题。首先,我得回想一下常见的Servlet初始化异常的原因。可能的原因包括Servlet没有正确配置在web.xml或者使用注解的情况下没有正确扫描到,或者Servlet缺少无参构造函数,或者依赖注入的问题,也有可能是路径问题导致Servlet无法被加载。根据用户提到的JakartaServlet API,我需要注意最新的规范变化,比如Jakarta EE9之后包名从javax.servlet变更为jakarta.servlet,所以用户可能使用了旧版本的依赖导致找不到。这时候需要检查pom.xml或构建文件中的依赖是否正确,比如是否添加了jakarta.servlet-api的依赖,并且版本是否匹配。 另外,Servlet必须有一个公共的无参构造函数,如果用户在ReadServlet中定义了带参数的构造函数,而没有显式定义无参构造,就会导致容器无法实例化该,从而抛出实例化异常。这时候需要检查ReadServlet的代码,确保存在无参构造。还有可能是初始化过程中抛出异常,比如在init()方法中有代码出错。这时候需要查看服务器日志,确定具体的异常堆栈信息,找到根源。例如,如果日志中显示ClassNotFoundException,可能是依赖缺失;如果显示NoSuchMethodError,可能是版本冲突。此外,部署描述符(web.xml)中的配置是否正确,比如<servlet-class>是否指向了正确的全限定名,或者如果使用注解@WebServlet,是否配置正确,没有冲突。最后,还要考虑加载问题,比如Servlet是否被打包到了正确的WEB-INF/classes目录或WAR文件中,确保容器能够加载到该。 总结下来,我需要建议用户逐步检查这些方面:依赖配置、定义、构造函数、部署描述符或注解、服务器日志,以及路径是否正确。同时,提供具体的代码示例和配置示例,帮助用户对照检查。</think>### Jakarta Servlet API中ReadServlet实例化异常解决方案 当出现`jakarta.servlet.ServletException: ReadServlet instantiation exception`时,通常由以下原因导致: #### 1. **Servlet未正确配置** - **问题**:未在`web.xml`中声明`ReadServlet`或注解`@WebServlet`未正确使用。 - **解决**: - **XML配置示例**: ```xml <servlet> <servlet-name>ReadServlet</servlet-name> <servlet-class>com.example.ReadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ReadServlet</servlet-name> <url-pattern>/read</url-pattern> </servlet-mapping> ``` - **注解配置示例**: ```java @WebServlet(name = "ReadServlet", urlPatterns = "/read") public class ReadServlet extends HttpServlet { ... } ``` - **验证**:检查路径是否与配置完全匹配[^1]。 #### 2. **缺少无参构造函数** - **问题**:若`ReadServlet`定义了带参数的构造函数但未显式提供无参构造方法,容器无法实例化。 - **解决**: ```java public class ReadServlet extends HttpServlet { public ReadServlet() {} // 必须存在 // 其他代码 } ``` #### 3. **依赖未正确引入** - **问题**:未添加`jakarta.servlet-api`依赖或版本不兼容(Jakarta EE 9+需使用`jakarta.servlet:jakarta.servlet-api:5.0.0+`)。 - **Maven配置示例**: ```xml <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> ``` #### 4. **加载失败** - **问题**:`ReadServlet.class`未部署到`WEB-INF/classes`或WAR包中。 - **解决**:检查构建工具(如Maven)是否将编译后的文件打包至正确位置。 #### 5. **初始化方法异常** - **问题**:`init()`方法中抛出未捕获的异常。 - **解决**:检查`ReadServlet`的`init()`方法,添加日志并确保异常处理: ```java @Override public void init() throws ServletException { try { // 初始化代码 } catch (Exception e) { throw new ServletException("初始化失败: " + e.getMessage()); } } ``` #### 6. **服务器日志分析** - **关键步骤**:查看服务器日志(如Tomcat的`catalina.out`),定位具体错误: - `ClassNotFoundException`:依赖缺失或路径错误。 - `NoSuchMethodError`:版本冲突。 - `InstantiationError`:抽象/接口未实现。 --- ### 验证流程图 ```plaintext 检查依赖配置 → 确认Servlet定义 → 验证构造函数 → 检查部署描述符 → 分析服务器日志 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值