jakarta.servlet.ServletException:类 [com.practice.MyServlet] 不是 Servlet

Posted

技术标签:

【中文标题】jakarta.servlet.ServletException:类 [com.practice.MyServlet] 不是 Servlet【英文标题】:jakarta.servlet.ServletException: Class [com.practice.MyServlet] is not a Servlet 【发布时间】:2021-04-28 12:12:55 【问题描述】:

我是使用 servlet 的初学者。我正在创建一个 servlet,但运行后我收到错误 谁能帮我解决这个问题。错误

键入异常报告

消息类 [com.practice.MyServlet] 不是 Servlet

描述 服务器遇到了一个意外情况 阻止它完成请求。

例外

jakarta.servlet.ServletException: 类 [com.practice.MyServlet] 是 不是 Servlet org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:682) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:332) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1568) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:748) 根本原因

java.lang.ClassCastException: com.practice.MyServlet 无法转换为 jakarta.servlet.Servlet org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:682) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:332) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1568) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:748) 注意完整的堆栈跟踪 根本原因可在服务器日志中找到。

Click here to see the Project directory MyServlet.java

package com.practice;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;
/**
 *
 * @author admin
 */
public class MyServlet extends HttpServlet 
    
    @Override
    public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
    
        PrintWriter out=response.getWriter();
        response.setContentType("test/html");
        out.print("<h1>This is get method of my servlet</h1>");
    

Web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">
    
    <servlet>
        <servlet-name>myservlet</servlet-name>
        <servlet-class>com.practice.MyServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>myservlet</servlet-name>
        <url-pattern>/myservlet</url-pattern>
    </servlet-mapping>
    
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

【问题讨论】:

请不要将文字作为图片发布。使用适当的文本编辑您的问题。见How to Ask 【参考方案1】:

您基本上是在 WAR 中包含 Tomcat 9.x (Servlet 4.0) 特定的 JAR 文件,然后针对 Tomcat 9.x (Servlet 4.0) 或更早版本编写/编译代码,然后将 WAR 部署到 Tomcat 10.x (Servlet 5.0) 或更新版本。这根本不是正确的方法。

自 Tomcat 10.x (Servlet 5.0) 起,javax.* 包已重命名为 jakarta.* 包。

换句话说,请确保您不要将不同服务器的 JAR 文件随机放入您的 WAR 中,例如 tomcat-servlet-api-9.0.4.jar。这只会带来麻烦。完全删除它并编辑您的 servlet 类的导入

import javax.servlet.*;
import javax.servlet.http.*;

import jakarta.servlet.*;
import jakarta.servlet.http.*;

同时,请确保声明 web.xml 的根元素符合目标服务器的 Servlet API 版本,在 Tomcat 10.x 和 Servlet 5.0 的情况下(以及 不是基本上匹配Tomcat 8.0的Servlet 3.1)。

<web-app
    xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0"
>
    <!-- Config here. -->
</web-app>

另见:

Tomcat versions Tomcat 9 casting servlets to javax.servlet.Servlet instead of jakarta.servlet.http.HttpServlet

【讨论】:

以上是关于jakarta.servlet.ServletException:类 [com.practice.MyServlet] 不是 Servlet的主要内容,如果未能解决你的问题,请参考以下文章