Java 我的课程不是 servlet 错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1036702/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 22:32:43  来源:igfitidea点击:

My class is not a servlet error

javaservlets

提问by Ankur

I have the following servlet code

我有以下 servlet 代码

public void doPost(HttpServletRequest request, HttpServletResponse response){

    Backup bup = new Backup();
    bup.doBackup();

    response.setContentType("text/html");
    PrintWriter out;
    try {
        out = response.getWriter();

    out.println("You backed up your data - well hopefully");
    out.flush();
    out.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

And the following stack trace

以及以下堆栈跟踪

javax.servlet.ServletException: Class view.BackupServlet is not a Servlet org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) java.lang.Thread.run(Thread.java:619)

root cause

java.lang.ClassCastException: view.BackupServlet cannot be cast to javax.servlet.Servlet org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) java.lang.Thread.run(Thread.java:619)

javax.servlet.ServletException: Class view.BackupServlet 不是 Servlet org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JioEndpoint$ Worker.run(JioEndpoint.java:454) java.lang.Thread.run(Thread.java:619)

根本原因

java.lang.ClassCastException:view.BackupServlet 无法转换为 javax.servlet.Servlet org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter. java:293) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util. net.JioEndpoint$Worker.run(JioEndpoint.java:454) java.lang.Thread.run(Thread.java:619)

and the web.xml is

而 web.xml 是

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-<br>app_2_4.xsd">
<display-name>Backup</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description>BackupServlet</description>
    <display-name>BackupServlet</display-name>
    <servlet-name>BackupServlet</servlet-name><br>
    <servlet-class>view.BackupServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>BackupServlet</servlet-name>
    <url-pattern>/BackupServlet</url-pattern>
  </servlet-mapping>
</web-app>`

采纳答案by Jon Skeet

You haven't shown your class declaration - my guess is that your class doesn't extend Servletor HttpServlet.

你还没有显示你的类声明 - 我猜你的类没有扩展ServletHttpServlet.

If it does, then check how many different servlet.jar files you have in your deployment - it could be that it's being loaded by two different classloaders.

如果,则检查您的部署中有多少个不同的 servlet.jar 文件 - 可能是它由两个不同的类加载器加载。

回答by victor hugo

Your class containing the method doPostmust extend javax.servlet.Servlet, but preferrably javax.servlet.HttpServlet

包含该方法的类doPost必须扩展javax.servlet.Servlet,但最好是javax.servlet.HttpServlet

public class BackupServlet extends HttpServlet {
    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) {
     .
     .
     .
    }
}

回答by Srini Kandula

This is most likely you have multiple versions of servlet libraries(.jar files) being loaded my the server. If you are using maven/gradle as build tool make sure you change the scope of the servlet library to scope if it is meant to be provided by the server.

这很可能是您在服务器上加载了多个版本的 servlet 库(.jar 文件)。如果您使用 maven/gradle 作为构建工具,请确保将 servlet 库的范围更改为要由服务器提供的范围。