Jakarta EE 在 IntelliJ IDEA 中开发简单留言板应用的实验指导(附完整代码)

Jakarta EE 在 IntelliJ IDEA 中开发简单留言板应用的实验指导(附完整代码)

       摘要:实验基于Jakarta EE 9+(兼容Tomcat 10+)、Maven作为构建工具,并在IntelliJ IDEA 2023.2(Community版免费)中进行。项目使用Maven Archetype WebApp模板生成基础结构,然后升级到Jakarta EE。

这个实验实现了一个简单的Mini Message Board:

  • 访问/board 显示留言表单和已提交的留言列表(按时间倒序)。
  • 表单包含昵称(nickname)留言内容(content)两个字段,均为必填。
  • 长度限制:nickname ≤ 50字符,content ≤ 500字符(服务端验证,无效时显示错误消息)。
  • 提交后,Servlet处理POST请求,将有效留言记录到内存(使用CopyOnWriteArrayList);重定向刷新页面。

我会提供:

  • 详细实验步骤:从项目创建到测试的指导。
  • 代码:完整、可复制的pom.xml、Java类(Servlet)、JSP文件、web.xml等。
  • 代码解释:每个代码块中添加详细注释,解释实现逻辑、Jakarta EE/HTTP相关知识和关键点。

实验不使用数据库(按要求用内存);扩展部分会添加持久化。

实验准备

  • 前提:IntelliJ IDEA 2023.2已安装,JDK 17+配置好(File > Project Structure > SDKs > Add JDK)。Tomcat 10+下载(https://tomcat.apache.org/),解压到本地目录(e.g., C:\Tomcat10)。
  • 时间:约1小时(包括调试)。
  • 测试工具:浏览器(Chrome)、curl命令(Windows CMD)。

详细实验步骤

步骤1: 使用Maven Archetype创建项目

  1. 打开IntelliJ IDEA 2023.2,点击“File > New > Project”。
  2. 选择“Maven Archetype”。
  3. 配置:
    • Name:MiniMessageBoard。
    • Location:选择保存目录。
    • Archetype:点击“Add Archetype...”,填写:
      • GroupId:org.apache.maven.archetypes
      • ArtifactId:maven-archetype-webapp
      • Version:1.4(稳定版)。
    • 点击“OK”,然后“Next”。
  4. 项目属性:
    • GroupId:com.example
    • ArtifactId:minimessageboard
    • Version:1.0-SNAPSHOT
  5. 点击“Create”。IntelliJ生成项目,包括pom.xml和src/main/webapp/index.jsp。

步骤2: 更新pom.xml到Jakarta EE并添加依赖

  1. 双击pom.xml,替换为以下内容(升级到Jakarta EE 9,添加JSTL for JSP):
    • 解释:Archetype默认旧Java EE,更新依赖确保jakarta.*命名空间;JSTL用于JSP标签(如<c:forEach>循环显示列表)。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>minimessageboard</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><!-- Jakarta EE Web API (包含Servlet, JSP等) --><dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-web-api</artifactId><version>9.1.0</version><scope>provided</scope></dependency><!-- JSTL for JSP (标签库, 用于<c:forEach>等) --><dependency><groupId>jakarta.servlet.jsp.jstl</groupId><artifactId>jakarta.servlet.jsp.jstl-api</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.glassfish.web</groupId><artifactId>jakarta.servlet.jsp.jstl</artifactId><version>2.0.0</version></dependency></dependencies><build><plugins><

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

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

相关文章

JavaScript经典面试题一(JavaScript基础)

目录 一、JavaScript中的变量提升 1. 机制 2. 示例 3. 注意事项 4. 总结 二、var、let和const的区别。 1. 作用域&#xff08;Scope&#xff09; 2. 变量提升&#xff08;Hoisting&#xff09; 3. 重新赋值和重新声明 4. 示例 示例1&#xff1a;作用域和块级行为 示…

数据库造神计划第七天---增删改查(CRUD)(3)

&#x1f525;个人主页&#xff1a;寻星探路 &#x1f3ac;作者简介&#xff1a;Java研发方向学习者 &#x1f4d6;个人专栏&#xff1a;《从青铜到王者&#xff0c;就差这讲数据结构&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此简单&a…

AWS SQS 可观测性最佳实践

AWS SQS AWS SQS&#xff08;Amazon Simple Queue Service&#xff09;是一种完全托管的消息队列服务&#xff0c;用于在分布式系统中解耦和缓冲消息。它支持高可用性、可扩展性和安全性&#xff0c;能够处理大量消息&#xff0c;确保消息的可靠传输和顺序性。开发者可以轻松集…

AI推理范式:从CoT到ReAct再到ToT的进化之路

在人工智能领域&#xff0c;如何让模型像人类一样进行复杂推理和问题解决&#xff0c;一直是核心挑战。近年来&#xff0c;思维链&#xff08;Chain-of-Thought, CoT&#xff09;、推理与行动&#xff08;ReAct&#xff09; 和 思维树&#xff08;Tree-of-Thoughts, ToT&#x…

2025时序数据库选型:深入解析IoTDB从主从架构基因到AI赋能的创新之路

原创经验总结,拒绝空谈,用数据和实战说话 时序数据时代的"四重考验" 在智慧工厂、新能源车、金融市场等场景中,每秒百万级的数据点如潮水般涌来。这些时序数据背后隐藏着四大核心挑战:极高的写入并发、强时间关联性查询、海量数据生命周期管理,以及乱序与高基…

深入浅出LVS负载均衡群集:原理、分类与NAT模式实战部署

深入浅出LVS负载均衡群集&#xff1a;原理、分类与NAT模式实战部署 文章目录深入浅出LVS负载均衡群集&#xff1a;原理、分类与NAT模式实战部署一、企业群集&#xff1a;从单台服务器到分布式架构的必然选择1. 什么是群集&#xff1f;2. 为什么需要群集&#xff1f;二、企业群集…

Flash Table实测:JAI赋能低代码开发,重塑企业级应用构建范式

目录&#x1f50d; 引言1.1 什么是Flash Table1.2 低代码平台的进化与FlashTable的革新✨FlashTable背景&#xff1a;为什么需要新一代低代码平台&#xff1f;2.1 传统开发的痛点2.2 低代码平台的局限2.3 FlashTable的差异化定位&#x1f4bb; FlashTable安装&#xff1a;Docke…

SonarQube代码质量管理平台本地化搭建和使用

SonarQube 是一个开源的代码质量管理平台&#xff0c;主要用于持续检查代码质量&#xff0c;支持多种编程语言。 本文章记录了在windows环境中&#xff0c;搭建和使用SonarQube的完整过程。 ①SonarQube平台搭建 SonarQube最新社区版本下载地址&#xff1a; https://www.son…

基于双向LSTM深度学习网络模型的文本序列推荐系统matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.完整程序 1.程序功能描述 在信息爆炸的时代&#xff0c;用户面临着海量文本信息的筛选难题&#xff0c;文本序列推荐系统应运而生。双向长短期记忆网络&#xff08;Bi-directional Long …

Transformer实战(17)——微调Transformer语言模型进行多标签文本分类

Transformer实战(17)——微调Transformer语言模型进行多标签文本分类 0. 前言 1. 多标签文本分类 2. 数据加载与处理 3. 模型微调 小结 系列链接 0. 前言 与单标签分类不同,多标签分类要求模型能够为同一文本分配多个相关标签,这在新闻分类、文献标注、内容推荐等场景中尤…

开源 C++ QT Widget 开发(十六)程序发布

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 C QT Widget 开发&#xff08;一&#xff09;工程文件结构-CSDN博客 开源…

MATLAB2-结构化编程和自定义函数-台大郭彦甫视频

目录 if elseif else switch case otherwise while exercise练习 for 预宣告 练习题 break tips编程的小技巧 functions函数 练习题 函数句柄 if elseif else 如果condition为真&#xff0c;执行语句 if condition1statement1 elseif condition2statement2 elsest…

LVGL移植2048小游戏全攻略

目录 准备脚手架 修改源码 对接触摸 测试编译 测试运行 这一节将以一个已经编写好的 lvgl 小游戏 2048 描述如何将已经编写完成的 lvgl 程序移植到开发板上。 准备脚手架 在这之前&#xff0c;我们先准备基础的 LVGL 脚手架。可以直接从 lv_g2d_test 里复制过来进行修改…

在Unity2021中使用Profiler的Deep Profile功能时内存超高怎么办?

这通常是因为Deep Profile会记录每一帧所有函数调用的详细信息&#xff0c;导致内存急剧增长&#xff0c;尤其在大型项目或复杂场景中4。别担心&#xff0c;我来帮你分析原因并提供一些解决办法。 理解 Deep Profile 的内存开销与替代方案 Deep Profile是Unity Profiler的一个…

Ubuntu 设置中文输入法

一、使用 IBus&#xff08;Ubuntu 默认框架&#xff09;步骤 1&#xff1a;安装中文输入法sudo apt install ibus-libpinyin ibus-pinyin步骤 2&#xff1a;添加输入法打开 Settings > Keyboard > Input Sources。点击 “”&#xff0c;搜索 Chinese (Intelligent Pinyin…

【Zephyr电源与功耗专题】14_BMS电池管理算法(三重验证机制实现高精度电量估算)

文章目录前言一、算法系统框架设计介绍1.1&#xff1a;核心设计方式1.2&#xff1a;系统架构图1.3&#xff1a;核心参数配置二、核心算法详解2.1&#xff1a;硬件数据采集与滤波2.2&#xff1a;三重算法机制2.2.1&#xff1a;库仑计法&#xff08;电流积分&#xff09;2.2.2&am…

Python网络与多任务编程:TCP/UDP实战指南

Python网络与多任务编程&#xff1a;TCP/UDP实战指南 一、网络编程 1.1 前言 网络编程是现代软件开发中不可或缺的一部分&#xff0c;它使得不同设备之间的数据交换成为可能。Python提供了强大的标准库来支持各种网络编程需求。 1.1.1 IP地址简介 IP地址是互联网上设备的唯一标…

Android8 binder源码学习分析笔记(四)——ServiceManager启动

前文回顾&#xff1a; Android8 binder源码学习分析笔记&#xff08;三&#xff09;&#xff1a; https://blog.csdn.net/g_i_a_o_giao/article/details/151365630?spm1001.2014.3001.5502 Android8 binder源码学习分析笔记&#xff08;二&#xff09;&#xff1a; https://…

Redis 大 Key 与热 Key:生产环境的风险与解决方案

&#x1f525; Redis 大 Key 与热 Key&#xff1a;生产环境的风险与解决方案 文章目录&#x1f525; Redis 大 Key 与热 Key&#xff1a;生产环境的风险与解决方案&#x1f9e0; 一、问题定义与识别&#x1f4a1; 什么是大 Key&#xff1f;&#x1f525; 什么是热 Key&#xff…

C++算法题中的输入输出形式(I/O)

本文主要帮助刷leetcode题型快速适应完整带输入输出的题&#xff08;机试、考试、比赛等&#xff09;接收能用cin就用cin 。cin 自动分割单词 的特性&#xff08;cin 读取字符串时会自动跳过空格 / 换行&#xff0c;将连续非空格字符作为一个 “单词”&#xff09;一、单组输入…