Jakarta EE(基于 JPA)在 IntelliJ IDEA 中開發簡單留言板應用的實驗指導
? ? ? ?摘要:Jakarta EE 并不僅限于使用 H2 數據庫,它支持任何符合 JDBC 或 JPA 標準的數據庫,例如 MySQL、PostgreSQL、Oracle 等。H2 通常用于開發測試或嵌入式場景,因為它輕量且易配置,但生產環境往往選擇更健壯的數據庫如 MySQL。同樣,.NET 開發可以使用 MySQL(通過 MySQL Connector/NET),但它也支持 SQL Server、SQLite 等多種數據庫,并不局限于 MySQL。
? ? ? ?下面我為你提供一個使用 Jakarta EE(基于 JPA)在 IntelliJ IDEA 中開發簡單留言板應用的步-by-step 指南。這個應用會使用 H2 數據庫(文件模式,以持久化數據),通過一個 JSP 表單提交留言,并使用 EntityManager 將內容寫入 H2。假設你使用 IntelliJ IDEA Ultimate 版(Community 版不支持 Jakarta EE,需要 Ultimate),并已安裝 JDK 17+ 和 Maven。
步驟 1: 創建 Jakarta EE 項目
1. 打開 IntelliJ IDEA,選擇 File > New > Project。
2. 在 New Project 對話框中,選擇 Jakarta EE。
3. 項目名稱設為 MessageBoardApp,選擇 Maven 作為構建工具,JDK 選 17 或更高。
4. 在 Version 字段選擇 Jakarta EE 10 或 11,選擇 Web application模板,并確保包括 Servlet?和 JPA規范(如果沒有,稍后手動添加)。
5. 點擊 Create。IntelliJ 會生成項目結構,包括 pom.xml和基本文件。
步驟 2: 添加依賴
打開 pom.xml,添加以下依賴(H2 驅動、Hibernate 作為 JPA 實現,如果你用 EclipseLink 可以替換)。使用 Alt+Insert(Windows)或 ?N(macOS)添加依賴,然后加載 Maven 變更。
<dependencies><!-- Jakarta EE API --><dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-api</artifactId><version>10.0.0</version> <!-- 或 11.0.0,根據你的 Jakarta EE 版本 --><scope>provided</scope></dependency><!-- Hibernate JPA 實現 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>6.4.0.Final</version> <!-- 最新版本 --></dependency><!-- H2 數據庫 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.3.232</version> <!-- 最新版本 --></dependency>
</dependencies>
步驟 3: 配置持久化單元 (persistence.xml)
? ? ? ?在 src/main/resources/META-INF目錄下創建 persistence.xml(如果不存在,右鍵 META-INF > New > XML Configuration File > persistence.xml)。
? ? ? ?使用以下配置(文件模式 H2,數據保存在項目根目錄下的 `messageboard.db` 文件中;自動創建表):
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="3.0" xmlns="https://jakarta.ee/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"><persistence-unit name="MessageBoardPU" transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><class>com.example.entity.Message</class> <!-- 稍后創建的實體類 --><properties><property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/><property name="jakarta.persistence.jdbc.url" value="jdbc:h2:./messageboard"/><property name="jakarta.persistence.jdbc.user" value="sa"/><property name="jakarta.persistence.jdbc.password" value=""/><property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/><property name="hibernate.hbm2ddl.auto" value="update"/> <!-- 自動更新 schema --><property name="hibernate.show_sql" value="true"/> <!-- 顯示 SQL 日志,便于調試 --></properties></persistence-unit>
</persistence>
步驟 4: 創建留言實體類 (Message)
在 src/main/java下創建包com.example.entity,然后新建類Message.java:
package com.example.entity;import jakarta.persistence.*;
import java.time.LocalDateTime;@Entity
@Table(name = "messages")
public class Message {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String content;@Columnprivate LocalDateTime timestamp = LocalDateTime.now();// Getter 和 Setterpublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public LocalDateTime getTimestamp() {return timestamp;}public void setTimestamp(LocalDateTime timestamp) {this.timestamp = timestamp;}
}
步驟 5: 創建 Servlet 處理留言提交
在 src/main/java下創建包com.example.servlet,新建類 MessageServlet.java:
package com.example.servlet;
package com.example.servlet;import com.example.entity.Message;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/postMessage")
public class MessageServlet extends HttpServlet {private EntityManagerFactory emf;@Overridepublic void init() {emf = Persistence.createEntityManagerFactory("MessageBoardPU");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String content = req.getParameter("content");if (content != null && !content.isEmpty()) {EntityManager em = emf.createEntityManager();em.getTransaction().begin();Message message = new Message();message.setContent(content);em.persist(message);em.getTransaction().commit();em.close();}resp.sendRedirect("/index.jsp"); // 重定向回首頁}@Overridepublic void destroy() {if (emf != null) {emf.close();}}
}
這個 Servlet 接收 POST 請求,將留言持久化到 H2。
步驟 6: 創建 JSP 表單修改 src/main/webapp/index.jsp:jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>留言板</title>
</head>
<body><h1>歡迎留言</h1><form action="/postMessage" method="post"><textarea name="content" placeholder="輸入你的留言"></textarea><br><button type="submit">提交</button></form>
</body>
</html>
步驟 7: 配置并運行應用服務器按 Ctrl+Alt+S 打開 Settings,選擇 Build, Execution, Deployment > Application Servers
添加 Tomcat(推薦簡單 web app)或 GlassFish,指定安裝路徑。
在 Run Configurations 中添加 Tomcat/GlassFish Local 配置,部署你的 WAR artifact。
運行應用,訪問 http://localhost:8080/(端口依服務器而定)。
提交留言后,數據會寫入 H2 的 messageboard.db 文件。
步驟 8: 在 IntelliJ 中查看 H2 數據庫打開 Database 工具窗口(View > Tool Windows > Database)
點擊 + > Data Source > H2。
URL 設為 jdbc:h2:./messageboard(項目根目錄),用戶 sa,無密碼。
測試連接,成功后可瀏覽表和數據。
? ? ? ?如果運行時遇到問題,如類未找到,確保 Maven 依賴已加載,并重啟 IntelliJ。留言提交后,刷新數據庫查看寫入的內容。如果想添加讀取留言功能,可以在 JSP 中使用 EntityManager 查詢并顯示列表。
8. IntelliJ IDEA(以下簡稱IDEA)中“沒有JPA”怎么辦?
? ? ? ? IntelliJ IDEA(以下簡稱IDEA)中“沒有JPA”通常是因為: - 你使用的是Community版(免費版),它不支持Jakarta EE規范(如JPA、Servlet等)的內置模板和Facet(功能模塊)。需要升級到Ultimate版(付費版)才能獲得完整支持。 - 項目未正確配置Facet或依賴。 下面是添加JPA支持的步驟。根據你的情況選擇方法。我假設你是用Maven構建的項目(如之前的留言板示例),并已安裝JDK 17+。
方法1: 如果使用IDEA Ultimate版(推薦,內置支持)
1. 檢查/升級IDEA版本: - 打開IDEA,點擊 **Help > About** 查看版本。如果是Community版,下載Ultimate版(試用30天免費)從官網:https://www.jetbrains.com/idea/download/。
- Ultimate版支持Jakarta EE,包括JPA的代碼補全、實體生成、數據庫集成等。
2. 在現有項目中添加JPA Facet:
- 右鍵項目根目錄 > Open Module Settings(或按 F4)。
- 在左側選擇 Facets。
- 點擊 +?> 選擇 JPA。
- 在JPA Facet配置中,選擇Hibernate作為默認實現(或EclipseLink),并指向你的persistence.xml文件(位于src/main/resources/META-INF)。
- 點擊 Apply > OK。
- IDEA會自動下載所需插件/依賴,并啟用JPA功能(如實體類注解高亮、JPQL查詢支持)。
3. 如果項目是從頭創建: - 如之前所述,選擇 New > Project > Jakarta EE時,確保勾選 JPA規范。IDEA會自動生成Facet和基本配置。
方法2: 如果使用IDEA Community版(手動添加依賴,無Facet支持) Community版不支持Facet,但你可以通過Maven手動添加JPA依賴,代碼仍能運行(只是缺少一些IDE增強功能,如自動代碼生成)。
1. 添加Maven依賴:
- 打開pom.xml,添加以下(如果已添加,可跳過):
<dependencies><!-- Jakarta EE API (包括JPA) --><dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-api</artifactId><version>10.0.0</version> <!-- 或11.0.0 --><scope>provided</scope></dependency><!-- JPA實現 (如Hibernate) --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>6.4.0.Final</version> <!-- 檢查最新版本 --></dependency>
</dependencies>
- 右鍵pom.xml?> Maven > Reload Project以加載依賴。
- IDEA會下載jar包,你可以使用JPA注解(如@Entity、@Id)編寫代碼,但不會有時自動補全或驗證。
2. 手動配置persistence.xml:
- 如之前響應所述,在`src/main/resources/META-INF創建persistence.xml,配置H2連接。
3. 啟用插件(可選增強):
- 打開 File > Settings > Plugins,搜索并安裝“Database Tools and SQL”(Community版可用),以支持數據庫瀏覽(如H2查看)。
- 對于JPA代碼補全,Community版有限制,但基本注解會工作。
測試JPA是否添加成功
- 在實體類(如Message.java)中添加`@Entity`注解,如果無報錯且有高亮,則成功。
- 運行應用,提交留言,檢查H2數據庫是否寫入數據(用Database工具窗口連接jdbc:h2:./messageboard)。
- 如果遇到“ClassNotFoundException”或依賴問題,重啟IDEA或運行mvn clean install。
? ? ? ?如果你的IDE是其他(如Eclipse),或具體錯誤截圖,請提供更多細節。如果是拼寫錯誤或其他含義,再解釋一下。