This Post is under 軟體開發
目的:自學以Java開發Web應用程式時,我們會在網路上搜尋參考資料,但免不了仍會遇到很多坑(佈署到Tomcat後,以瀏覽器開啟出現 404,但是不知問題出在哪裡)。必須克服了這些坑才會好不容易看到HelloWorld。這些坑的來源是:第一,幾乎沒有單一份文件可以完全滿足你的需求,因此必須同時看很多文件,而這些文件描述的部分可能彼此難以串接,這難以串接的部分就是坑的所在。第二是,開發與執行環境常常在更新,這些文件所描述的可能半年之後就過期了,又產生了另一種坑。因此本文也只是將目前所整理到的相關資料做個統整,可以在目前為止順利地開發出一個Java Web應用程式,但不保證未來還持續有效。
目標:使用 IntelliJ IDEA Community 建立第一個 Spring Boot Web 應用程式,佈署到 Java Servlet Container(此例為Tomcat),以瀏覽器開啟,如下圖。意義是使用免費的Java開發環境,開發MVC web應用程式。
Step1:安裝軟體開發工具
- JDK21
- 開發環境:IntelliJ IDEA 2023.3.5 (Community Edition)
軟體下載與安裝方式可參考下列資訊,但要注意要在電腦的環境變數中設置JDK的路徑:
Step2:建立 Spring Boot 專案
- 線上版 Spring Initializr 產生下載 Spring Boot Project 壓縮檔,參考這篇 [Java] Java / Spring Boot Web 開發環境與語言架構指南。Project 選Maven、選擇JDK版本、加入 Spring Web Dependencies。
- 再以 IntelliJ IDEA Community 開啟此 Spring Boot Project (先解壓縮),專案名如sbdemo。
- 建立一個Controller,Mapping 到 hello。
- 在IntelliJ IDEA Community中測試執行,參考這篇Spring Boot 零基礎入門 (4) – 第一個 Spring Boot 程式
Step3:佈署到(IntelliJ IDEA Community)外部的Tomcat,以瀏覽器執行
- 參考這篇如何將 Spring Boot 應用程式部署到 Tomcat 應用程式伺服器
- 注意!Spring Boot 3.23 使用 Servlet 5 API,只能佈署到 Tomcat 10 以上。參考這篇 404 Error when deploying Spring Boot WAR file on Tomcat 9。
- 以瀏覽器開啟,得到上圖畫面。注意 9090 為此電腦 Tomcat 的 port。
以上在MVC框架中,充其量只實作了一個最簡單的Controller,於是我們當然會繼續想往 Model(database連接)的方向前進,參考這篇 Spring Boot 零基礎入門 (25) – 資料庫連線設定、IntelliJ 資料庫管理工具介紹進行設定(特別聲明,以下404問題與這篇參考文件無涉)。就在修改pom檔加入dependencies與application.properties部分內容就重建專案並佈署到Tomcat後,發現一直出現 404,進一步檢查 war 的 WEB-INF\classes 竟然空無一物(所以才404)。將pom與application.properties還原到原先內容仍然無法解決問題。曾經懷疑是瀏覽器快取的問題,但清除快取或將電腦重開都無法解決。後來還是將整個專案砍掉重練就可以了。因此猜測專案設定可能在某個階段跑掉了(曾經因網頁快取,而設定過 mvn clean package,但這不一定是原因)導致rebuild仍無法產生WEB-INF\classes的 class。由於現下還在開發最起始階段,就算砍掉重練也不覺可惜。但建議開發者應該做好版控,以便隨時可以rollback回先前專案完好的狀態。
附錄:其他 IntelliJ IDEA Community 與佈署到 Tomcat 的注意事項
- 初學者常犯錯誤。使用Maven建立專案檔時,若有更動pom內容,最好都 reload maven,才會下載相關Dependencies。參考 IntelliJ IDEA cannot resolve import javax.servlet.*。
- 在IntelliJ IDEA Community中測試執行專案,參考 Tomcat in Intellij Idea Community Edition
- 安裝 SmartTomcat plugin,參考 Tomcat + Servlet + IntelliJ。
- 不用裝plugin,設定使用 external tool Use Tomcat in Intellij IDEA Community。此文中順便提到 Run Maven to build project and package and deploy to Tomcat web directory,非常重要且省事的佈署 war 的方法。
- 當war 佈署到 Tomcat 之後,瀏覽器開啟,出現 404 not found error。很多時候是因為Tomcat 10 implement Servlet5 API and Tomcat 9 use Servlet 4 API。眼下許多文件中的範例都是以 Servlet 4 API 寫的,所以只能跑在 Tomcat 9,但是Spring Boot 3.2.3卻是以Servlet5 API 實作的,必須跑在Tomcat 10,參考這篇 404 Error when deploying Spring Boot WAR file on Tomcat 9。
- 接續上個問題(雖然跟Spring Boot沒有直接相關),以Servlet 4 API 寫的servlet(只能跑在Tomcat9含以下)無法跑在Tomcat10(因為我們已優先將電腦環境變數設定成要跑Spring Boot 3的Tomcat10)。由於Tomcat 在電腦裏頭必須設定環境變數CATALINA_HOME指到當前的Tomcat 安裝目錄,換言之同時安裝兩個不同版本的Tomcat方式可能行不通,如果以Tomcat 10為主,原本以Servlet 4 API寫的servlet就必須有所調整。參考 Tomcat 10.0.4 doesn’t load servlets (@WebServlet classes) with 404 error、Servlet 5.0 JAR throws compile error on javax.servlet.* but Servlet 4.0 JAR does not。解決的方法就是在.pom與.java將 javax.servlet 換成 jakarta.servlet。
- 網址列允許中文與網頁輸出有Unicode亂碼的問題
- Tomcat 中文編碼基本設定
- JSP: UTF-8 encoding in JSP page
- <%@ page contentType=”text/html; charset=UTF-8″ %>
- Servlet:
- resp.setContentType(“text/html; charset=UTF-8”);
- Console log for debug: System.out.println(i);