先直接來看我的錯誤:
我的原始代碼:
利用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路徑那,我修改完后截圖如下: