错误信息:在本地Servlet项目里没有报错,但是浏览器跳转该servlet时报错
型 异常报告
消息 实例化Servlet类[com.wangdao.lx.MyServlet1]异常
描述 服务器遇到一个意外的情况,阻止它完成请求。
例外情况
jakarta.servlet.ServletException: 实例化Servlet类[com.wangdao.lx.MyServlet1]异常
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:676)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:842)
根本原因。
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
java.base/java.lang.ClassLoader.defineClass1(Native Method)
java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2487)
org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:676)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:842)
根本原因。
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1437)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245)
java.base/java.lang.ClassLoader.defineClass1(Native Method)
java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2487)
org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1401)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:676)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:842)
):注意 主要问题的全部 stack 信息可以在 server logs 里查看
错误原因
:Tomcat 10或更高版本,那么javax.servlet.http.HttpServlet
这个类已经从javax.servlet
包移动到了jakarta.servlet
包。因此,如果你的应用程序是用新的jakarta.servlet
包编写的,但你使用了旧的Servlet API jar,或者相反,就会导致这个错误。
具体错误信息:这个异常报告表明在尝试实例化MyServlet1
这个Servlet类时出现了问题。具体来说,服务器无法找到javax.servlet.http.HttpServlet
这个类,这通常意味着Servlet API的jar文件没有被正确地包含在应用程序的类路径中。
这里有几个可能的原因和解决方案:
- 缺少Servlet API jar :确保你的Web应用程序的
WEB-INF/lib
目录中包含了Servlet API的jar文件。对于Java EE应用程序,这通常是javax.servlet-api.jar
。 - 错误的Servlet API版本 :如果你正在使用的是Tomcat 10或更高版本,那么
javax.servlet.http.HttpServlet
这个类已经从javax.servlet
包移动到了jakarta.servlet
包。因此,如果你的应用程序是用新的jakarta.servlet
包编写的,但你使用了旧的Servlet API jar,或者相反,就会导致这个错误。 - 类路径问题:确保你的开发环境(如Eclipse、IntelliJ IDEA等)和部署环境都将Servlet API的jar文件包含在了类路径中。
- 部署问题 :如果你是在部署到服务器上时遇到这个问题,可能是因为部署过程中没有正确地复制
WEB-INF/lib
目录下的jar文件。 - 服务器配置问题:在某些情况下,服务器的配置可能会导致这个问题。检查服务器的文档,确保没有相关的配置错误。
解决这个问题的步骤可能包括:
- 确认
WEB-INF/lib
目录下是否有正确的Servlet API jar文件。 - 如果你在使用Maven或Gradle,检查
pom.xml
或build.gradle
文件,确保依赖项是正确的。 - 如果你的应用程序是用新的
jakarta.servlet
包编写的,确保你使用的是相应的Tomcat版本和Servlet API jar。 - 清理并重新构建你的应用程序。
- 如果问题依然存在,检查服务器日志以获取更多信息,或者在你的开发环境中查看是否有任何配置错误。
解决方法:因为我电脑上有两个版本的tomcat
所以要把项目的tomcat自带的jar包从8版本切换到10版本的jar包
具体操作:
把原来这个地方的8版本的jar包删了
最后再把servlet里的import的jar包删了,import新的jar包,具体jar包类型请看上面错误原因。
为什么不用tomcat8,而选择tomcat10,因为,html里的表单若是中文,get或post方法提交表单时,在重写servlet的方法里若控制台输出参数值,则容易出现乱码。
因此以后选择tomcat10