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
My class is not a servlet error
提问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.
你还没有显示你的类声明 - 我猜你的类没有扩展Servlet或HttpServlet.
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 库的范围更改为要由服务器提供的范围。

