Jakarta EE(基于 JPA)在 IntelliJ IDEA 中开发简单留言板应用的实验指导

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),或具体错误截图,请提供更多细节。如果是拼写错误或其他含义,再解释一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95812.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gitea:轻量级的自托管Git服务

欢迎光临我的个人博客查看最新文章&#xff1a;rivers blog 在当今的软件开发世界中&#xff0c;代码托管平台是必不可少的工具。而对于寻求自主控制和数据隐私的团队与开发者来说&#xff0c;Gitea提供了一个完美的解决方案。 1、 Gitea简介 Gitea&#xff08;发音为ɡɪˈti…

深度学习-----简单入门卷积神经网络CNN的全流程

&#xff08;一&#xff09;卷积神经网络&#xff08;CNN&#xff09;的核心思想传统全连接网络的缺陷图像平铺展开后&#xff0c;旋转或位置变化会导致输入差异大&#xff0c;难以识别举例&#xff1a;手写数字“8”在不同位置或旋转后的识别困难&#xff08;图像在计算机中是…

Scikit-learn Python机器学习 - 特征降维 压缩数据 - 特征选择 - 单变量特征选择 SelectKBest - 选择Top K个特征

锋哥原创的Scikit-learn Python机器学习视频教程&#xff1a; 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识&#xff0c;包括机器学习概述&#xff0c;特征工程(数据…

Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?

文章摘要 本文详细记录了我在Datawhale AI夏令营期间&#xff0c;如何另辟蹊径&#xff0c;使用Coze&#xff08;扣子空间&#xff09;和精心设计的Prompt&#xff0c;从零开始构建一个专业的“智能SEO Agent”产品网页的完整过程。文章将完整展示我编写的“万字”级Prompt&…

SVN和Git两种版本管理系统对比

一、SVN&#xff08;Subversion&#xff09;简介SVN是一种集中式版本控制系统。它有一个中心仓库&#xff08;repository&#xff09;&#xff0c;所有的代码变更都记录在这个中心仓库中。每个开发者从中心仓库检出&#xff08;checkout&#xff09;代码到本地工作副本&#xf…

【机器学习】综合实训(一)

项目一 鸢尾花分类该项目需要下载scikit-learn库&#xff0c;下载指令如下&#xff1a;pip install scikit-learn快速入门示例&#xff1a;鸢尾花分类# 导入必要模块 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklea…

vulhub通关笔记1—docker unauthorized-rce

1.docker unauthorized-rce 基本情况 docker swarm是一个将docker集群变成单一虚拟的docker host工具&#xff0c;使用标准的Docker API&#xff0c;能够方便docker集群的管理和扩展&#xff0c;由docker官方提供&#xff1a; 需要在每台机器上安装docker&#xff0c;并且运行…

zotero扩容

最近出差&#xff0c;想要把本地的主机上的文件同步到笔记本&#xff0c;发现zotero不够用&#xff0c;然后寻找了一些zotero扩容的方法&#xff0c;这里记录一下&#xff0c;方便以后查阅。 zotero扩容创建账户登录账户进一步扩容设置Apps Connection设置zoterozotero自带同步…

Kafka基础理论

Kafka概述 kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。kafka采取了发布/订阅模式&#xff0c;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接受感兴趣的消息。…

苍穹外卖项目实战(day-5完整版)-记录实战教程及问题的解决方法

Redis基本操作及下载安装包&#xff08;Redis及可视化工具&#xff09;&#xff0c;都在我的上一篇文章&#xff1a;Redis基本知识及简单操作&#xff0c;这里不再赘述 店铺营业状态修改功能 &#xff08;1&#xff09;需求分析与设计 &#xff08;2&#xff09;SpringDataRe…

第R8周:RNN实现阿尔兹海默病诊断

数据集包含2149名患者的广泛健康信息&#xff0c;每名缓则的ID范围从4751到6900不等&#xff0c;该数据集包含人口统计详细信息&#xff0c;生活方式因素、病史、临床测量、认知和功能评估、症状以及阿尔兹海默症的诊断。 一、准备工作 1、硬件准备 import numpy as np import …

MySQL复制技术的发展历程

在互联网应用不断发展的二十多年里&#xff0c;MySQL 一直是最广泛使用的开源关系型数据库之一。它凭借开源、轻量、灵活的优势&#xff0c;支撑了无数网站、移动应用和企业系统。支撑 MySQL 长期发展的关键之一&#xff0c;就是 复制&#xff08;Replication&#xff09;技术。…

C++从字符串中移除前导零

该程序用于去除字符串开头的零字符。当输入"0000123456"时&#xff0c;程序会输出"123456"。核心函数removeZero()通过while循环找到第一个非零字符的位置&#xff0c;然后使用erase()方法删除前面的所有零。主函数读取输入字符串并调用该函数处理。程序简…

【面试题】C++系列(一)

本专栏文章持续更新&#xff0c;新增内容使用蓝色表示。C面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff08;1&#xff09;封装是将数据和函数组合到一个类里。主要目的是隐藏内部的实现细节&#xff0c;仅暴露必要的接口给外部。通过封装&#…

当没办法实现从win复制东西到Linux虚拟机时的解决办法

① 先确认是否已安装bash复制sudo apt list --installed | grep open-vm-tools如果 没有任何回显 → 没装&#xff0c;跳到 ③如果看到 open-vm-tools 已安装 → 继续 ②② 启动正确的服务&#xff08;单词别打错&#xff09;bash复制systemctl status vmtoolsd # 查看…

用Markdown写自动化用例:Gauge实战全攻略!

你作为一名自动化测试工程师&#xff0c;正在为一个复杂的Web应用编写测试脚本&#xff1a;传统工具要求写大量代码&#xff0c;维护起来像解谜游戏&#xff0c;团队非技术成员完全插不上手。这时&#xff0c;Gauge这个“自动化神器”如魔法般出现——它允许用Markdown写可读的…

Unity开发保姆级教程:C#脚本+物理系统+UI交互,3大模块带你通关游戏开发

文章目录基础概念Unity开发环境搭建版本选择&#xff1a;为什么2021 LTS是最佳起点&#xff1f;三步安装&#xff1a;从下载到项目创建界面认知&#xff1a;5分钟掌握核心操作区配置优化&#xff1a;让开发更顺畅验证环境&#xff1a;创建你的第一个CubeC#基础语法与Unity脚本结…

Depth Anything V2论文速读

这篇论文主要讲了两方面1.为了解决模型在正常标注的现实图像上训练的缺陷问题、提出了新的模型训练数据和训练方法真实标记图像存在缺点&#xff1a;标签噪声&#xff08;深度传感器可能存在空洞、玻璃等物体反射导致精度不准确&#xff09;、标签细节粗糙&#xff08;深度图边…

数据库原理及应用_数据库管理和保护_第5章数据库的安全性_理论部分

前言 "<数据库原理及应用>(MySQL版)".以下称为"本书"中第5章前6节内容 引入 数据库的安全性是非常重要的,表现在两个方面:一数据的访问权限,二数据的物理安全.本书在这一章前6节基本上都是理论性的内容,选择其中重要部分进行解读. 5.1数据库安全性…

QT6 配置 Copilot插件

下载项目&#xff1a;解压 GitHub - github/copilot.vim: Neovim plugin for GitHub Copilot Node.js必须安装 Node.js — Download Node.js 例如先安装一个qt6 ,qt Cteatror选择新版本的 设置 效果&#xff0c;注释里面写要求&#xff0c;tab同意 #include "mainwindow…