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;
@Column
private LocalDateTime timestamp = LocalDateTime.now();
// Getter 和 Setter
public 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;
@Override
public void init() {
emf = Persistence.createEntityManagerFactory("MessageBoardPU");
}
@Override
protected 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"); // 重定向回首页
}
@Override
public 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),或具体错误截图,请提供更多细节。如果是拼写错误或其他含义,再解释一下。