首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jakarta.servlet.ServletException:类[com.practice.MyServlet]不是Servlet

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

Stack Overflow用户
提问于 2021-01-24 14:56:46
回答 1查看 8.5K关注 0票数 2

我是使用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(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)的根本原因 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) java.lang.ClassCastException:不能将com.practice.MyServlet转换为jakarta.servlet.Servlet java.lang.ClassCastException 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)注意,根本原因的全部堆栈跟踪在服务器日志中可用。

单击此处查看Project目录

MyServlet.java

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-24 16:09:45

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

从Tomcat10.x(Servlet5.0)开始,javax.*包被重命名为jakarta.*包。

换句话说,请确保在WAR (如tomcat-servlet-api-9.0.4.jar )中不要随意放置不同服务器的JAR文件。这只会引起麻烦。删除它并编辑servlet类的导入。

代码语言:javascript
复制
import javax.servlet.*;
import javax.servlet.http.*;

代码语言:javascript
复制
import jakarta.servlet.*;
import jakarta.servlet.http.*;

同时,还请确保声明了web.xml的根元素符合目标服务器的Servlet版本,这是Tomcat10.x的Servlet5.0(因此不是Servlet3.1,基本上与Tomcat8.0相匹配)。

代码语言:javascript
复制
<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>

另请参阅:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65872072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档