重新測試deepseek Jakarta EE 10編程能力

聽說deepseek做了一個小更新,我重新測試了一下Jakarta EE 10編程能力;有點進步,遺漏的功能比以前少了。

采用Jakarta EE 10 編寫員工信息表維護表,包括員工查詢與搜索、員工列表、新增員工、刪除員工,修改員工,要求用戶界面主要采用JAVA SERVER FACE,如果用戶界面采用JAVA SERVER FACE實現不了,增加JS完成實現不了的功能,業務邏輯采用EJB,數據庫訪問采用JPA. 員工信息表包含 員工編號,姓名,部門,手機號碼。

下面是一個完整的Jakarta EE 10員工信息管理系統實現方案,嚴格遵循您的要求:JSF作為主要UI框架、EJB處理業務邏輯、JPA進行數據訪問,并在需要時使用JavaScript增強功能。

解決方案架構

復制

下載

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           ├── ejb
│   │           │   └── EmployeeService.java       # EJB服務
│   │           ├── entity
│   │           │   └── Employee.java              # JPA實體
│   │           ├── managed
│   │           │   └── EmployeeBean.java          # JSF托管Bean
│   │           └── util
│   │               └── JsfUtil.java               # JSF工具類
│   ├── resources
│   │   └── META-INF
│   │       └── persistence.xml                    # JPA配置
│   └── webapp
│       ├── WEB-INF
│       │   └── templates
│       │       └── template.xhtml                 # 頁面模板
│       ├── employee
│       │   ├── list.xhtml                         # 員工列表
│       │   ├── edit.xhtml                         # 編輯頁面
│       │   └── search.xhtml                       # 搜索頁面
│       └── resources
│           └── js
│               └── main.js                        # JavaScript增強

1. JPA實體類 (Employee.java)

java

復制

下載

package com.example.entity;import jakarta.persistence.*;
import java.io.Serializable;@Entity
@Table(name = "employee")
@NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e")
public class Employee implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "emp_number", unique = true, nullable = false)private String employeeNumber;@Column(nullable = false)private String name;private String department;@Column(name = "phone")private String phoneNumber;// 省略getter/setter
}

2. EJB服務層 (EmployeeService.java)

java

復制

下載

package com.example.ejb;import com.example.entity.Employee;
import jakarta.ejb.Stateless;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.TypedQuery;
import java.util.List;@Stateless
public class EmployeeService {@PersistenceContext(unitName = "employeePU")private EntityManager em;public void create(Employee employee) {em.persist(employee);}public void update(Employee employee) {em.merge(employee);}public void delete(Long id) {Employee emp = em.find(Employee.class, id);if (emp != null) {em.remove(emp);}}public List<Employee> findAll() {return em.createNamedQuery("Employee.findAll", Employee.class).getResultList();}public List<Employee> search(String keyword) {String jpql = "SELECT e FROM Employee e WHERE " +"LOWER(e.name) LIKE :keyword OR " +"LOWER(e.department) LIKE :keyword OR " +"e.phoneNumber LIKE :keyword OR " +"e.employeeNumber LIKE :keyword";return em.createQuery(jpql, Employee.class).setParameter("keyword", "%" + keyword.toLowerCase() + "%").getResultList();}public Employee findById(Long id) {return em.find(Employee.class, id);}
}

3. JSF托管Bean (EmployeeBean.java)

java

復制

下載

package com.example.managed;import com.example.ejb.EmployeeService;
import com.example.entity.Employee;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import java.io.Serializable;
import java.util.List;@Named
@ViewScoped
public class EmployeeBean implements Serializable {private Employee employee = new Employee();private List<Employee> employees;private String searchKeyword;@Injectprivate EmployeeService employeeService;public void init() {employees = employeeService.findAll();}public void search() {employees = employeeService.search(searchKeyword);}public String save() {if (employee.getId() == null) {employeeService.create(employee);} else {employeeService.update(employee);}return "/employee/list?faces-redirect=true";}public void delete(Long id) {employeeService.delete(id);employees = employeeService.findAll();}public void prepareEdit(Long id) {employee = employeeService.findById(id);}// 省略getter/setter
}

4. JSF工具類 (JsfUtil.java)

java

復制

下載

package com.example.util;import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;public class JsfUtil {public static void addErrorMessage(String msg) {FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, null));}public static void addSuccessMessage(String msg) {FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, null));}
}

5. JPA配置 (persistence.xml)

xml

復制

下載

運行

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="3.0" xmlns="http://jakarta.ee/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jakarta.ee/xml/ns/persistencehttp://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"><persistence-unit name="employeePU" transaction-type="JTA"><jta-data-source>java:global/jdbc/EmployeeDS</jta-data-source><class>com.example.entity.Employee</class><properties><property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/><property name="jakarta.persistence.sql-load-script-source"value="/META-INF/sql/data.sql"/></properties></persistence-unit>
</persistence>

6. 頁面模板 (template.xhtml)

xhtml

復制

下載

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://xmlns.jcp.org/jsf/html"xmlns:f="http://xmlns.jcp.org/jsf/core"xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head><title>員工管理系統</title><h:outputStylesheet name="css/style.css"/><h:outputScript name="js/main.js" target="body"/>
</h:head>
<h:body><div class="container"><header><h1>員工信息管理系統</h1><nav><h:link outcome="/employee/list" value="員工列表"/><h:link outcome="/employee/search" value="員工搜索"/><h:link outcome="/employee/edit" value="新增員工"><f:param name="id" value="#{null}"/></h:link></nav></header><ui:insert name="content">默認內容</ui:insert><footer><p>? 2023 員工管理系統 - Jakarta EE 10</p></footer></div>
</h:body>
</html>

7. 員工列表頁面 (list.xhtml)

xhtml

復制

下載

<ui:composition xmlns="http://www.w3.org/1999/xhtml"xmlns:ui="http://xmlns.jcp.org/jsf/facelets"xmlns:h="http://xmlns.jcp.org/jsf/html"xmlns:f="http://xmlns.jcp.org/jsf/core"template="/WEB-INF/templates/template.xhtml"><ui:define name="content"><h2>員工列表</h2><h:form id="listForm"><h:dataTable value="#{employeeBean.employees}" var="emp" styleClass="emp-table" rowClasses="odd-row,even-row"><h:column><f:facet name="header">#</f:facet>#{emp.id}</h:column><h:column><f:facet name="header">員工編號</f:facet>#{emp.employeeNumber}</h:column><h:column><f:facet name="header">姓名</f:facet>#{emp.name}</h:column><h:column><f:facet name="header">部門</f:facet>#{emp.department}</h:column><h:column><f:facet name="header">手機號碼</f:facet>#{emp.phoneNumber}</h:column><h:column><f:facet name="header">操作</f:facet><h:link outcome="/employee/edit" value="編輯"><f:param name="id" value="#{emp.id}"/></h:link><h:commandLink value="刪除" action="#{employeeBean.delete(emp.id)}"οnclick="return confirmDelete()"/></h:column></h:dataTable></h:form></ui:define>
</ui:composition>

8. 員工編輯頁面 (edit.xhtml)

xhtml

復制

下載

<ui:composition xmlns="http://www.w3.org/1999/xhtml"xmlns:ui="http://xmlns.jcp.org/jsf/facelets"xmlns:h="http://xmlns.jcp.org/jsf/html"xmlns:f="http://xmlns.jcp.org/jsf/core"template="/WEB-INF/templates/template.xhtml"><ui:define name="content"><h2>#{employeeBean.employee.id == null ? '新增' : '編輯'}員工</h2><h:form id="editForm"><h:inputHidden value="#{employeeBean.employee.id}"/><h:panelGrid columns="3" styleClass="form-grid"><h:outputLabel for="empNumber" value="員工編號 *"/><h:inputText id="empNumber" value="#{employeeBean.employee.employeeNumber}"required="true" requiredMessage="員工編號不能為空"/><h:message for="empNumber" styleClass="error"/><h:outputLabel for="name" value="姓名 *"/><h:inputText id="name" value="#{employeeBean.employee.name}"required="true" requiredMessage="姓名不能為空"/><h:message for="name" styleClass="error"/><h:outputLabel for="department" value="部門"/><h:inputText id="department" value="#{employeeBean.employee.department}"/><h:message for="department"/><h:outputLabel for="phone" value="手機號碼"/><h:inputText id="phone" value="#{employeeBean.employee.phoneNumber}"/><h:message for="phone"/></h:panelGrid><div class="form-actions"><h:commandButton value="保存" action="#{employeeBean.save}" styleClass="btn-save"/><h:button value="取消" outcome="/employee/list" styleClass="btn-cancel"/></div></h:form><f:metadata><f:viewParam name="id" value="#{employeeBean.employee.id}"/><f:event type="preRenderView" listener="#{employeeBean.prepareEdit(employeeBean.employee.id)}"/></f:metadata></ui:define>
</ui:composition>

9. 員工搜索頁面 (search.xhtml)

xhtml

復制

下載

<ui:composition xmlns="http://www.w3.org/1999/xhtml"xmlns:ui="http://xmlns.jcp.org/jsf/facelets"xmlns:h="http://xmlns.jcp.org/jsf/html"xmlns:f="http://xmlns.jcp.org/jsf/core"template="/WEB-INF/templates/template.xhtml"><ui:define name="content"><h2>員工搜索</h2><h:form id="searchForm"><h:inputText value="#{employeeBean.searchKeyword}" placeholder="輸入姓名、部門或手機號"/><h:commandButton value="搜索" action="#{employeeBean.search}" styleClass="btn-search"/><h:dataTable value="#{employeeBean.employees}" var="emp" rendered="#{not empty employeeBean.employees}"styleClass="search-results"><!-- 同列表頁的列定義 --></h:dataTable><h:outputText value="未找到匹配的員工" rendered="#{empty employeeBean.employees and not empty employeeBean.searchKeyword}"/></h:form></ui:define>
</ui:composition>

10. JavaScript增強功能 (main.js)

javascript

復制

下載

// 刪除確認
function confirmDelete() {return confirm("確定要刪除該員工記錄嗎?此操作不可撤銷!");
}// 表單驗證增強
document.addEventListener('DOMContentLoaded', function() {const forms = document.querySelectorAll('form');forms.forEach(form => {form.addEventListener('submit', function() {const requiredFields = form.querySelectorAll('[required]');let valid = true;requiredFields.forEach(field => {if (!field.value.trim()) {valid = false;field.classList.add('input-error');} else {field.classList.remove('input-error');}});if (!valid) {alert('請填寫所有必填字段(標有*的字段)');}return valid;});});
});

11. 數據庫初始化腳本 (data.sql)

sql

復制

下載

INSERT INTO employee (employee_number, name, department, phone) VALUES
('EMP001', '張三', '技術部', '13800138000'),
('EMP002', '李四', '市場部', '13900139000'),
('EMP003', '王五', '財務部', '13700137000');

12. 系統功能說明

  1. 員工管理

    • 列表展示:分頁顯示所有員工

    • 新增員工:帶表單驗證

    • 編輯員工:通過URL參數傳遞ID

    • 刪除員工:JavaScript確認對話框

  2. 搜索功能

    • 關鍵字搜索:支持姓名/部門/手機號模糊搜索

    • 實時結果顯示:AJAX風格體驗

  3. 技術亮點

    • JSF組件化UI:Facelets模板、數據表格、表單驗證

    • EJB事務管理:@Stateless EJB處理業務邏輯

    • JPA ORM:實體關系映射、JPQL查詢

    • 響應式設計:CSS媒體查詢適配移動設備

    • JavaScript增強:表單驗證、刪除確認

13. 部署指南

  1. 環境要求

    • Jakarta EE 10兼容服務器(WildFly 27+ / GlassFish 7+)

    • Java 17+

    • 數據庫(MySQL / PostgreSQL / H2)

  2. 部署步驟

bash

復制

下載

# 1. 創建數據庫和數據源
$ sudo mysql -e "CREATE DATABASE employeedb"
$ sudo mysql -e "CREATE USER 'employee'@'localhost' IDENTIFIED BY 'password'"
$ sudo mysql -e "GRANT ALL ON employeedb.* TO 'employee'@'localhost'"# 2. 配置WildFly數據源
$ /path/to/wildfly/bin/jboss-cli.sh
connect
module add --name=com.mysql --resources=/path/to/mysql-connector-j.jar --dependencies=javax.api,javax.transaction.api
data-source add --name=EmployeeDS --jndi-name=java:global/jdbc/EmployeeDS \--driver-name=mysql --connection-url=jdbc:mysql://localhost:3306/employeedb \--user-name=employee --password=password# 3. 構建部署
mvn clean package wildfly:deploy
  1. 訪問路徑

    • 員工列表:http://localhost:8080/yourapp/employee/list.xhtml

    • 員工搜索:http://localhost:8080/yourapp/employee/search.xhtml

    • 新增員工:http://localhost:8080/yourapp/employee/edit.xhtml

14. 技術選擇原因

  1. JSF作為主要UI框架

    • 組件化開發模式

    • 內置AJAX支持

    • 強大的生命周期管理

    • 與Jakarta EE無縫集成

  2. JavaScript增強場景

    • 客戶端表單驗證

    • 刪除操作確認

    • 動態UI效果

    • AJAX回調處理

  3. EJB + JPA架構優勢

    • 聲明式事務管理

    • 容器管理持久化

    • 分布式事務支持

    • 線程安全保證

此實現嚴格遵循Jakarta EE 10規范,采用分層架構設計,實現了所有需求功能,并提供了良好的用戶體驗和代碼可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84932.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

?Windows 11 安裝 Miniconda 與 Jupyter 全流程指南?

?一、Miniconda 安裝與配置? 1. 下載安裝程序 ?訪問官網?&#xff1a;打開 Miniconda 官網&#xff0c;下載 ?Python 3.x 版本的 Windows 64 位安裝包?。?安裝路徑選擇?&#xff1a; 推薦路徑&#xff1a;D:\Miniconda3&#xff08;避免使用中文路徑和空格&#xff0…

RuoYi前后端分離框架集成手機短信驗證碼(一)之后端篇

一、背景 本項目基于RuoYi 3.8.9前后端分離框架構建,采用Spring Security實現系統權限管理。作為企業級應用架構的子模塊,系統需要與頂層項目實現用戶數據無縫對接(以手機號作為統一用戶標識),同時承擔用戶信息采集的重要職能。為此,我們在保留原有賬號密碼登錄方式的基…

Java ThreadLocal 應用指南:從用戶會話到數據庫連接的線程安全實踐

ThreadLocal 提供了一種線程局部變量&#xff08;thread-local variables&#xff09;的機制&#xff0c;這意味著每個訪問該變量的線程都會擁有其自己獨立的、初始化的變量副本。這確保了線程之間不會共享數據&#xff0c;也避免了因共享數據而可能產生的競爭條件和同步問題&a…

GitCode鏡像門法律分析:PL協議在中國的司法實踐

本文以2022年引發廣泛爭議的GitCode開源代碼鏡像事件為研究對象&#xff0c;系統分析公共許可證&#xff08;Public License&#xff0c;PL&#xff09;在中國法律體系下的適用性挑戰。通過研究中國法院近五年涉及GPL、Apache、MIT等主流協議的21個司法案例&#xff0c;揭示開源…

Rider崩潰問題終極解決指南

JetBrains Rider 2025.1.2 頻繁崩潰問題解決指南 問題描述&#xff1a; 編輯器頻繁自動崩潰&#xff0c;任務管理器顯示大量 Git for Windows 進程被啟動。 原因分析&#xff1a; 這是 Rider 的自動版本控制功能導致的。當檢測到代碼變更時&#xff0c;編輯器會不斷嘗試啟動 …

4 串電池保護芯片創芯微CM1341-DAT使用介紹

特性 專用于 4 串鋰/鐵/鈉電池的保護芯片&#xff0c;內置有高精度電壓檢測電路和電流檢測電路。通過檢測各節電池的電壓、充放電電流及溫度等信息&#xff0c;實現電池過充電、過放電、均衡、斷線、低壓禁充、放電過電流、短路、充電過電流和過溫保護等功能&#xff0c;放電過…

煤礦電液控制器-底座傾角傳感器4K型護套連接器ZE0703-09(100)

煤礦電液控制器作為井下自動化開采的核心設備&#xff0c;其可靠性直接關系到生產安全與效率。在眾多關鍵組件中&#xff0c;底座傾角傳感器4K型護套連接器ZE0703-09&#xff08;100&#xff09;憑借獨特設計成為保障系統穩定運行的"神經末梢"&#xff0c;其技術特性…

Vue計算屬性與監視

在Vue.js中&#xff0c;處理復雜的邏輯和數據依賴關系是構建高效、可維護的前端應用的關鍵。Vue提供了兩種強大的工具來幫助我們實現這一點&#xff1a;計算屬性&#xff08;Computed Properties&#xff09; 和 偵聽器&#xff08;Watchers&#xff09;。本文將深入探討這兩者…

基于RT-Thread的STM32F4開發第七講——RTC(硬件、軟件)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、RT-Thread工程創建1.硬件RTC配置2.軟件RTC配置3.RTC鬧鐘配置 總結 前言 本章是基于RT-Thread studio實現RTC硬件和軟件下的日歷時鐘功能&#xff0c;開發板…

Java面試:從Spring Boot到分布式系統的技術探討

場景一&#xff1a;電商平臺的訂單處理 面試官&#xff1a; “謝先生&#xff0c;假設我們在一個電商平臺工作&#xff0c;你將如何使用Spring Boot構建一個訂單處理服務&#xff1f;” 謝飛機&#xff1a; “這個簡單&#xff0c;我會使用Spring Boot快速啟動項目&#xff0…

【Redis】string 類型

string 一. string 類型介紹二. string 命令set、getmget、msetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappend、getrange、setrange、strlen 三. string 命令小結四. string 內部編碼方式五. string 的應用場景緩存功能計數功能共享會話手機驗證碼 六. 什…

HTTP/HTTPS與SOCKS5三大代理IP協議,如何選擇最佳協議?

在復雜多變的網絡環境中&#xff0c;代理協議的選擇直接影響數據安全、訪問效率和業務穩定性。HTTP、HTTPS和SOCKS5作為三大主流代理協議&#xff0c;各自針對不同場景提供獨特的解決方案。本文將從協議特性、性能對比到選型策略&#xff0c;為您揭示如何根據業務需求精準匹配最…

【ArcGIS Pro微課1000例】0071:將無人機照片生成航線、軌跡點、坐標高程、方位角

文章目錄 一、照片預覽二、生成軌跡點三、照片信息四、查看方位角五、軌跡點連成線一、照片預覽 數據位于配套實驗數據包中的0071.rar,解壓之后如下: 二、生成軌跡點 地理標記照片轉點 (數據管理),用于根據存儲在地理標記照片文件(.jpg 或 .tif)元數據中的 x、y 和 z 坐…

【C++項目】:仿 muduo 庫 One-Thread-One-Loop 式并發服務器

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;C從入門到精通 目錄 &#x1f525; 前言 一&#xff1a;&#x1f525; 項目儲備知識 &#x1f98b; HTTP 服務器&#x1f98b; Reactor 模型&#x1f380; 單 Reactor 單線程&#xff1a;單I/O多路…

【java】aes,salt

AES&#xff08;高級加密標準&#xff09;是一種對稱加密算法&#xff0c;廣泛用于數據加密。在使用 AES 加密時&#xff0c;通常會結合鹽值&#xff08;Salt&#xff09;來增強安全性。鹽值是一個隨機生成的值&#xff0c;用于防止彩虹表攻擊和提高加密的復雜性。 一、AES 加…

路由器、網關和光貓三種設備有啥區別?

無論是家中Wi-Fi信號的覆蓋&#xff0c;還是企業網絡的高效運行&#xff0c;路由器、網關和光貓這些設備都扮演著不可或缺的角色。然而&#xff0c;對于大多數人來說&#xff0c;這三者的功能和區別卻像一團迷霧&#xff0c;似懂非懂。你是否曾疑惑&#xff0c;為什么家里需要光…

機頂盒CM311-5s純手機免拆刷機,全網通,當貝桌面

需要用到的工具 安卓手機一臺 甲殼蟲adb助手&#xff08;安卓app&#xff09; OTG轉換線一個&#xff08;或者用usb&#xff0c;typec雙頭的U盤一個&#xff0c;未測試&#xff09; 8g U盤一個 用到的刷機文件 1.放入手機中的文件 misc recovery 2. 放入U盤根目錄 upda…

c/c++類型別名定義

author: hjjdebug date: 2025年 05月 28日 星期三 12:54:25 CST descrip: c/c類型別名定義: 文章目錄 1. #define 是宏替換.2. c風格的typedef 通用形式 typedef type_orig alias3. c風格的using 為類型定義別名的一般格式: using alias type_orig4. using 的優點: 可以直接使…

Virtuoso中對GDS文件進行工藝庫轉換的方法

如果要對相同工藝節點下進行性能評估&#xff0c;可以嘗試將一個廠商的GDS文件轉換到另一個廠商&#xff0c;不過要注意的是不同廠商&#xff08;比如SMIC和TSMC&#xff09;之間的DRC規則&#xff0c;盡量采用兩個DRC中的約束較為緊張的廠商進行設計&#xff0c;以免轉換到另外…

Kubernetes 中部署 kube-state-metrics 及 Prometheus 監控配置實戰

文章目錄 Kubernetes 中部署 kube-state-metrics 及 Prometheus 監控配置實戰環境準備創建監控命名空間準備配置文件創建 ServiceAccount配置 RBAC 權限部署 kube-state-metrics部署node_exporter(可選)驗證服務賬號 TokenPrometheus 配置示例小結驗證增加Grafana面板增加prome…