用友NC系统支持JSF+PrimeFaces配置参考

本文详细介绍了在NC57和NC65版本中集成JSF(JavaServer Faces)的过程,包括所需库的安装、配置文件的调整、ManagedBean的注册以及PrimeFaces组件的使用。此外,还提供了登录验证的两种实现方式。

适用产品版本:NC57以及NC65

bean管理方式:ManagedBean,须配置文件注册

配置步骤:

1、需要的类包括:jsf-api-2.2.20.jar,jsf-impl-2.2.20.jar,el-api-2.2.jar, el-impl-2.2.jar,下载后放置到nchome\external\lib目录下(也可放置在自定义web应用的\WEB-INF\lib目录下)。

2、在nchome\hotwebs目录下创建web应用,并在WEB-INF目录下配置web.xml和faces-config.xml

      其中web.xml中增加jsf支持   

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp">

...
<!-- Define the JSF servlet (manages the request processing life cycle for JavaServer Faces) -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   
以下是一个完整的 **JSF + PrimeFaces + EJB + JPA** 项目示例,涵盖用户管理功能(增删改查)。项目基于 **Jakarta EE 9+** 标准,使用 **Maven** 构建,数据库为 **MySQL**。 --- ## **一、项目结构** ``` jsf-primefaces-ejb-jpa-demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/ │ │ │ ├── entity/ # JPA 实体类 │ │ │ ├── ejb/ # EJB 会话 Bean │ │ │ ├── jsf/ # JSF 托管 Bean │ │ │ └── util/ # 工具类(如 JPA 工具) │ │ ├── resources/ │ │ │ └── META-INF/ │ │ │ └── persistence.xml # JPA 配置 │ │ └── webapp/ │ │ ├── WEB-INF/ │ │ │ ├── faces-config.xml # JSF 配置 │ │ │ └── web.xml # Web 配置 │ │ └── *.xhtml # PrimeFaces 页面 │ └── test/ # 测试代码 └── pom.xml # Maven 依赖 ``` --- ## **二、核心代码实现** ### **1. JPA 实体类(User.java)** ```java package com.example.entity; import jakarta.persistence.*; import java.io.Serializable; @Entity @Table(name = "users") @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, unique = true) private String username; @Column(nullable = false) private String email; // Getter/Setter... } ``` ### **2. EJB 会话 Bean(UserService.java)** ```java package com.example.ejb; import com.example.entity.User; import jakarta.ejb.Stateless; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import java.util.List; @Stateless public class UserService { @PersistenceContext(unitName = "myPU") private EntityManager em; public List<User> findAll() { TypedQuery<User> query = em.createNamedQuery("User.findAll", User.class); return query.getResultList(); } public void create(User user) { em.persist(user); } public void update(User user) { em.merge(user); } public void delete(Long id) { User user = em.find(User.class, id); if (user != null) { em.remove(user); } } } ``` ### **3. JSF 托管 Bean(UserController.java)** ```java package com.example.jsf; import com.example.ejb.UserService; import com.example.entity.User; import jakarta.annotation.PostConstruct; import jakarta.faces.application.FacesMessage; import jakarta.faces.context.FacesContext; 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 UserController implements Serializable { @Inject private UserService userService; private List<User> users; private User selectedUser = new User(); @PostConstruct public void init() { users = userService.findAll(); } public void save() { if (selectedUser.getId() == null) { userService.create(selectedUser); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("用户创建成功")); } else { userService.update(selectedUser); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("用户更新成功")); } selectedUser = new User(); // 重置表单 users = userService.findAll(); // 刷新列表 } public void delete(User user) { userService.delete(user.getId()); users.remove(user); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("用户删除成功")); } // Getter/Setter... } ``` ### **4. PrimeFaces 页面(userList.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:p="http://primefaces.org/ui"> <h:head> <title>用户管理</title> </h:head> <h:body> <h:form> <p:growl id="messages" showDetail="true" /> <p:dataTable value="#{userController.users}" var="user" selection="#{userController.selectedUser}" selectionMode="single" rowKey="#{user.id}"> <p:column headerText="ID"> #{user.id} </p:column> <p:column headerText="用户名"> #{user.username} </p:column> <p:column headerText="邮箱"> #{user.email} </p:column> <p:column headerText="操作"> <p:commandButton value="删除" action="#{userController.delete(user)}" update=":messages userTable" icon="pi pi-trash" /> </p:column> </p:dataTable> <p:dialog widgetVar="userDialog" header="用户表单" modal="true"> <p:panelGrid columns="2"> <h:outputLabel value="用户名:" /> <p:inputText value="#{userController.selectedUser.username}" required="true" /> <h:outputLabel value="邮箱:" /> <p:inputText value="#{userController.selectedUser.email}" required="true" /> </p:panelGrid> <p:commandButton value="保存" action="#{userController.save()}" update=":messages userTable" oncomplete="PF('userDialog').hide()" /> </p:dialog> <p:commandButton value="新增用户" onclick="PF('userDialog').show()" type="button" icon="pi pi-plus" /> </h:form> </h:body> </html> ``` --- ## **三、关键配置** ### **1. persistence.xml** ```xml <persistence xmlns="https://jakarta.ee/xml/ns/persistence" version="3.0"> <persistence-unit name="myPU" transaction-type="JTA"> <jta-data-source>java:comp/env/jdbc/MyDS</jta-data-source> <properties> <property name="jakarta.persistence.schema-generation.database.action" value="update" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" /> </properties> </persistence-unit> </persistence> ``` ### **2. faces-config.xml** ```xml <faces-config xmlns="https://jakarta.ee/xml/ns/jakartaee" version="3.0"> <application> <message-bundle>messages</message-bundle> </application> </faces-config> ``` ### **3. web.xml** ```xml <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" version="5.0"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <resource-ref> <description>MySQL DataSource</description> <res-ref-name>jdbc/MyDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app> ``` --- ## **四、Maven 依赖(pom.xml)** ```xml <project> <dependencies> <!-- Jakarta EE API --> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>9.1.0</version> <scope>provided</scope> </dependency> <!-- PrimeFaces --> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>13.0.0</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies> </project> ``` --- ## **五、部署与运行** 1. **配置数据源**: - 在应用服务器(如 WildFly/Payara)中创建 JDBC 数据源,JNDI 名为 `java:comp/env/jdbc/MyDS`。 2. **打包部署**: ```bash mvn clean package ``` - 生成 WAR 文件并部署到服务器。 3. **访问页面**: - 启动服务器后访问 `http://localhost:8080/jsf-primefaces-ejb-jpa-demo/userList.xhtml`。 --- ## **六、功能演示** 1. **用户列表**:显示所有用户(PrimeFaces `<p:dataTable>`)。 2. **新增用户**:点击按钮弹出对话框(`<p:dialog>`),填写表单后保存。 3. **删除用户**:点击行内删除按钮触发确认提示。 4. **消息通知**:操作结果通过 `<p:growl>` 显示。 --- ## **七、常见问题解决** ### **1. 数据源配置错误** - **现象**:部署时报 `DataSource not found`。 - **解决**: - 确保数据源 JNDI 名称与 `persistence.xml` 一致。 - 在 WildFly 中通过 `standalone.xml` 或管理控制台配置数据源。 ### **2. PrimeFaces 主题不生效** - **原因**:未正确引入主题 CSS。 - **解决**: - 在 `web.xml` 中添加: ```xml <context-param> <param-name>primefaces.THEME</param-name> <param-value>saga</param-value> </context-param> ``` ### **3. 事务未提交** - **现象**:EJB 方法调用后数据未保存。 - **解决**: - 确保 EJB 方法在事务上下文中(默认 `@Stateless` 已启用事务)。 - 检查 `persistence.xml` 是否为 `transaction-type="JTA"`。 --- ## **八、扩展建议** 1. **分页查询**: - 在 EJB 中使用 `CriteriaQuery` 实现动态分页。 2. **文件上传**: - 结合 PrimeFaces `<p:fileUpload>` 和 EJB 处理文件存储。 3. **REST 接口**: - 添加 Jakarta REST(JAX-RS)支持,与 JSF 共享 EJB 逻辑。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值