近期在跟着打一個javaweb項目的時候,自己搭建Tomcat環境之后,訪問jsp頁面之后跳轉訪問Servlet資源時卻出現404錯誤,如下圖:
通常的話出現404錯誤肯定是先檢查自己的訪問路徑有沒有寫對,我檢查后我這個路徑是沒有錯的,代碼邏輯也是沒問題的(因為是照着培訓視頻打的,同時也有把培訓視頻的代碼替換我的代碼也是運行不了),於是我就開始在網上搜索解決方案了,以下是我在網上搜到的解決方案以及自己的一點片面見解,因為別人實力較菜,寫這篇文章也只是想着分享一下自己的解決方法,在說的過程中如果有錯誤的話,歡迎大家指出來,以免我誤導別人O(∩_∩)
一.servlet版本與tomcat版本不對應
這個問題真的很致命,因為我自己問題就是出現在這(我承認自己是有點弱智...),我用的Tomcat版本是8.5.x,然后一直用的是4.0的Servlet版本(版本得對應上,不過我之前沒對應上的時候好像也可以運行Servlet),這一次做的項目用到了EL表達式,終於在這一次出現問題了,在網上找了那么多方案,兜兜轉轉原來是出現在這里,於是我重新創建了JavaEE7的項目,選擇了3.1版本(我這個項目采用的是注解配置),后來重新布置了下環境,就能運行了
這里我也給出我在網上搜到的Servlet和Tomcat對應版本的表
ervlet Spec | JSP Spec | EL Spec | WebSocket Spec | JASPIC Spec | Apache Tomcat version | Actual release revision | Supported Java Versions |
---|---|---|---|---|---|---|---|
4.0 | TBD (2.4?) | TBD (3.1?) | TBD (1.2?) | 1.1 | 9.0.x | 9.0.0.M9 (alpha) | 8 and later |
3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.4 | 7 and later |
3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x (superseded) | 8.0.35 (superseded) | 7 and later |
3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x | 7.0.70 | 6 and later (7 and later for WebSocket) |
2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x | 6.0.45 | 5 and later |
2.4 | 2.0 | N/A | N/A | N/A | 5.5.x (archived) | 5.5.36 (archived) | 1.4 and later |
2.3 | 1.2 | N/A | N/A | N/A | 4.1.x (archived) | 4.1.40 (archived) | 1.3 and later |
2.2 | 1.1 | N/A | N/A | N/A | 3.3.x (archived) | 3.3.2 (archived) | 1.1 and later |
二.注解方式的WebServlet配置錯誤
這個錯誤也是很多新人比較容易犯的錯誤了,采用注解配置的話,idea自動生動的Servlet的模板是
@WebServlet( name="類名")
但其實這樣並沒有配置好路徑,我們可以將其改為以下兩種方式
①@WebServlet( name="類名",urlPatterns="/路徑")
舉例:@WebServlet( name="UserListSerlvet",urlPatterns="/userListServlet")
②@WebServlet( value="/路徑") ,此處value要是只有一個可以省略
舉例:@WebServlet( "/userListServlet")
上面的斜杠千萬不能落下
這里開始就說我在網上看到別人出現這個錯誤,幾個比較有代表性的解決方法
三.未能正確部署Web項目到Tomcat上
(解決方法來源於https://blog.csdn.net/eaphyy/article/details/72513914)
1首先,右擊項目,點擊 open module settings
2.配置 project,主要是本地 jdk 的安裝路徑,還有項目編譯輸出的路徑
3.配置 modules ,其中 paths 定位到 web-inf/classes ;dependencies 加入jdk和項目 web-inf/lib(其實這里默認選擇就可以)
4.配置 libraries ,點擊 + 號,選擇 java ,然后還是選擇你項目的 web-inf/lib
5.配置 facets ,此步很重要,配置 web resource directories ,路徑配錯,就會報 404 ,一定要定位到項目根目錄,也就是下面有整個項目源碼的地方(這里的話我一開始也有犯了這個錯誤,因為在項目里面新建個模板,然后也不知道為什么路徑會定位到別的地方,所幸最后改過來)
下圖是我引用的博主他犯的錯誤
博主原話:“本人就是定位到了另一個地方,導致 404,本來應該到 webroot,結定位到了 web”
6.配置 artifacts ,此步選擇第二個,選擇你的項目即可
7、部署到 tomcat,“Run”中的“Edit Configurations...”
(這里其實設置了Deployment的時候前面基本會默認幫我們修改)
四.文件放置到錯誤位置(非idea)
在網上搜索的時候看到了這篇文章,我覺得也應該是比較有效的解決方法,下面的評價都還不錯,但看他里面說的那些文件夾的名字好像是用eclipse編輯才會產生的文件名,因為我用的是idea,所以這里就不多闡述,用eclipse的朋友可以去看一下(不過因為這篇文章已經過了兩年多了,效果我也不太敢保證,就是在我看到的那一些文章中比較有代表性的吧)。
五.未能正確的配置web.xml文件
這里的話針對的是用web.xml配置訪問目錄的,這里的話其實要是知道怎么配置基本不會出現這個問題,不過要是編輯錯的話確實會出現404錯誤,這里就稍微提一下
1 <servlet> 2 <servlet-name>HWS</servlet-name> <!--給serverlet取名字,可任意--> 3 <servlet-class>com.web.servlet.HelloWorldServlet</servlet-class> <!--指明servlet路徑包名+類名,也就是全類名--> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>HWS</servlet-name> <!--對應上面的名字--> 7 <url-pattern>/hws</url-pattern> <!--這是在瀏覽器中輸入訪問這個servlet的資源定位符,可任意,注意斜桿--> 8 </servlet-mapping>
這里最后也給出Servlet的一些規范吧
JAVA servlet 2.x規范:
項目目錄結構必須要有WEB-INF,web.xml等文件夾和文件
在web.xml中配置servlet,filter,listener,以web.xml為java web項目的統一入口
JAVA servlet 3.x規范:
項目中可以不需要WEB-INF,web.xml等文件夾和文件
在沒有web.xml文件的情況下,通過注解實現servlet,filter, listener的聲明,例如
@WebServlet, @WebFilter,@WebListener,當使用注解時,容器自動進行掃描。
(原文鏈接:https://blog.csdn.net/m0_38059795/article/details/78694177)
Servlet3.1規范:https://www.cnblogs.com/heartstage/archive/2013/10/10/3362138.html
這篇文章是我花了比較多時間整理出來的吧,原創內容也不多,主要也是說想分享出來給那些同樣出現這個問題的朋友參考下,當然可能不一定能解決您的疑惑╮(╯▽╰)╭,最后也再啰嗦一句,因為本人實力較菜,所以如果這篇文章里面有說得不對的地方,也希望大家能指出來,我也不想誤導大家。