初學Servlet時使用IDEA中 利用Tomcat 10.0.4 構建類servlet報錯:類HelloServlet不是Servlet。


先直接來看我的錯誤:

 

 

我的原始代碼:

利用servlet跳轉到的java代碼是這樣的:

 

 

 1 import javax.servlet.ServletException;
 2 import javax.servlet.http.HttpServlet;
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 import java.io.IOException;
 6 import java.io.PrintWriter;
 7 
 8 public class HelloServlet extends HttpServlet {
 9     @Override
10     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
11 
12         //響應的類型
13         response.setContentType("text/html");
14         //獲取響應的輸出流
15         PrintWriter out = response.getWriter();
16         out.println("<html>");
17         out.println("<head>");
18         out.println("<title>Hello World!</title>");
19         out.println("</head>");
20         out.println("<body>");
21         out.println("<h1>Hello World!</h1>");
22         out.println("</body>");
23         out.println("</html>");
24     }
25 
26     @Override
27     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
28         doGet(req,resp);
29     }
30 }

 

然后是對應的web.xml里的servlet配置:

 

<?xml version="1.0" encoding="UTF-8"?>

<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"
         metadata-complete="true">

<!-- 注冊Servlet--> <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>HelloServlet</servlet-class> </servlet> <!-- 一個Servlet對應一個mapping(映射)--> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <!-- 路徑--> <url-pattern>/helloServlet</url-pattern> </servlet-mapping> </web-app>

 

 

接着又是pom.xml里引入的dependency:

 

 <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
<!--      下面是作用域。-->
<!--      <scope>provided</scope>-->
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
<!--      <scope>provided</scope>-->
    </dependency>

 

 

 然后就這樣,我運行在IDEA中運行Tomcat,瀏覽器自動跳轉到index.jsp界面(我的是http://localhost:8080/javawebMaven01/),然后再手動敲到Servlet路徑下(http://localhost:8080/javawebMaven01/helloServlet)。然后就出現了開頭的問題。

 

解決問題:

原因:Tomcat10版本太新。

 

 

這是因為使用了最新的tomcat10,而tomcat10有個最大的變動就是Tomcat 10 m1將JavaEE也換成了Jakarta® EE
Jakarta® EE較以前的JavaEE有一個非常非常重要的更新:包名不再是"javax.servlet.“而是改成了"jakarta.servlet.”

 

tomcat10把 javax.servlet 都改為了jakarta.servle(這個方法我用了,只會報錯,可能是只是改了包名,但其實倉庫里沒有這個包)

 

但是那兩個博主說的不全,我最后想到的是改為最新的dependency,這樣javax就會自己變為jakarta。所以還是去maven Repository中搜我們需要的最新的dependency,先是servlet-api:

 

 

 

這里選中第四個,而不是第一個,因為第四個最新(2021),然后進去找到10.0.4版本的。其dependency代碼如下:

 

<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>10.0.4</version>
</dependency>

 

 

然后是jsp-api:

 

 

 

 依舊是第四個最新的那個(2021),點進去找到10.0.4版本的,代碼如下:

 

<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jsp-api -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jsp-api</artifactId>
    <version>10.0.4</version>
</dependency>

 

把這兩個代碼放到項目的pom中,覆蓋掉原來的那兩個dependency,等待maven更新就好。

然后最會還有一步就是你寫的那個Java類中導入到javax包要手動改為jakarta:

 

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

 

最會再運行Tomcat,跳轉到網頁后手動敲到你的servlet路徑那,我修改完后截圖如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM