又一坑,只怪自己是小白,idea里tomcat可以访问静态资源,却访问不了自己建的servlet~~) tomcat与servlet 、javaee、jakartaEE关系乱

又一坑,只怪自己是小白,idea里tomcat可以访问静态资源,却访问不了自己建的servlet~~) tomcat与servlet 、javaee、jakartaEE关系乱~~

2020.8.23 下午奋战5小时,踩得坑,最后只怪自己太任性~

今天开了博客,记录下自己踩过的两个坑,给自己个教训。

第一个坑,访问servlet 404

在学习java的过程中,决定用最基本的框架搭建个网上商城,使用IntelliJ IDEA 2020.1开发工具,用tomcat作为web服务器,使用jsp/servlet做最基本的跳转功能,搭建第一个servlet的时候怎么都不跳转,开始出现了404错误,网上搜索一番,主要原因还是因为Jar包没有导全,没有导入tomcat的servlet.api,按照我目前的知识任务 JAVAEE里只是web服务的接口类,所有实现需要WEB服务器去自己写,所有需要引入tomcat的实现包(原理应该跟JDBC一样,如果错了日后订正)
以上解决的博客很多,小伙伴自行查阅。

第二坑,访问servlet 500

坑来了,这个坑还是因为自己的迷之自信造成的,学习JAVA很多前辈都说学java8.0就行,这样会踩很少的坑,而且很多坑前辈都踩过了,可以帮你节约时间,而我却。。。。
IntelliJ IDEA 2020.1、java14、tomcat10.0,全是最新的,后果你懂的,开发过程中idea提示添加JAVAEE6.0,我估计这个应该是老版本,JAVA9.0还是多少以后,javaEE从JDK中剥离了出来。
运行第一个servlet遇到的问题:

HTTP状态 500 - 内部服务器错误 类型 异常报告

消息 类com.shop.web.Servlet不是Servlet

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

例外情况

jakarta.servlet.ServletException: 类com.shop.web.Servlet不是Servlet
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:693)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:339)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocolConnectionHandler.process(AbstractProtocol.java:845)org.apache.tomcat.util.net.NioEndpointConnectionHandler.process(AbstractProtocol.java:845) org.apache.tomcat.util.net.NioEndpointSocketProcessor.doRun(NioEndpoint.java:1563)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base/java.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:630)org.apache.tomcat.util.threads.TaskThreadWorker.run(ThreadPoolExecutor.java:630) org.apache.tomcat.util.threads.TaskThreadWrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:832) 根本原因。

java.lang.ClassCastException: class com.shop.web.Servlet cannot be
cast to class jakarta.servlet.Servlet (com.shop.web.Servlet is in
unnamed module of loader
org.apache.catalina.loader.ParallelWebappClassLoader @595c3f3a;
jakarta.servlet.Servlet is in unnamed module of loader
java.net.URLClassLoader @371a67ec)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:693)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:339)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocolConnectionHandler.process(AbstractProtocol.java:845)org.apache.tomcat.util.net.NioEndpointConnectionHandler.process(AbstractProtocol.java:845) org.apache.tomcat.util.net.NioEndpointSocketProcessor.doRun(NioEndpoint.java:1563)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base/java.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:630)org.apache.tomcat.util.threads.TaskThreadWorker.run(ThreadPoolExecutor.java:630) org.apache.tomcat.util.threads.TaskThreadWrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:832) ):注意 主要问题的全部 stack
信息可以在 server logs 里查看

Apache Tomcat/10.0.0-M5

java.lang.ClassCastException: class com.shop.web.Servlet cannot be cast to class jakarta.servlet.Servlet (com.shop.web.Servlet is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @595c3f3a; jakarta.servlet.Servlet is in unnamed module of loader java.net.URLClassLoader @371a67ec)

主要问题出在上面代码中,jakarta.servlet.Servlet这个是什么鬼?

调试过程(过程不分先后,只是想到了就写):

1.servlet运行不了,先建个html看看服务正常不?结果正常~
2.关闭IDEA,纯启动tomcat10后,运行tomcat里面的事例程序,运行正常,说明JAVA14和TOMCAT10可以一起使用(不知道这样理解对不)~
3.打开IDEA,把tomcat里事例程序引入IDEA路径,在run configuration里找到application context把项目路径导进去,这样就可以运行tomcat里面的项目,运行哪个导哪个,说明我的idea没有问题,servlet是可以任意跳转的。
4.最后搜索了半天,发现了这个图

又一坑,只怪自己是小白,idea里tomcat可以访问静态资源,却访问不了自己建的servlet~~) tomcat与servlet 、javaee、jakartaEE关系乱

tomcat官网看到下面的话,
Apache Tomcat version 10.0 implements the Servlet 5.0 and JavaServer Pages 3.0 specifications from Jakarta EE, and includes many additional features that make it a useful platform for developing and deploying web applications and web services.
看见了Jakarta EE,Servlet 5.0这两个,应该感觉版本不对,我还在用javaee6.0,别人api名字都改了,我还在傻傻的调试。
最后重新搞了个tomcat9.0,问题完美解决。

后思:

1.idea开始建立javaee项目的时候会有个web application 选择4.0的,不知道这个是不是servlet4.0,是idea2020.1不支持servlet5.0吗?
2.还是我的JAVAee6.0不行,把这个jar包换成Jakarta EE的包是不是就可以?

带着这两个问题继续前行,看有没有好心人解答~~~~~