Oracle Account
Manage your account and access personalized content.
Sign up for an Oracle Account
Sign in to Cloud
Access your cloud dashboard, manage orders, and more.
Sign up for a free trial
使用 EJB、JPA 和 JavaServer Faces 通过 JDeveloper 10
g
构建 Web 应用程序
目的
在本教程中,您将使用 Oracle JDeveloper(10.1.3.1.0 或 10.1.3.2.0)构建 Web 应用程序。EJB 3.0 和 Java 持久性 API (JPA) 用于构建数据模型。对于 Web 客户端,JSF (JavaServer Faces) 用于构建用户界面,该界面包括一个主从页面和一个编辑页面。
所需时间
1 小时
主题
本教程包括下列主题:
注:
此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。
该应用程序反映了模型-视图-控制器体系结构。模型由 EJB 组件提供,视图和控制器由 JavaServer Faces 提供。我们将使用由 JSF 兼容组件构成的 ADF Faces 集来构建更丰富的 Web 用户界面。
您将先构建该应用程序的数据模型部分。
Java 持久性 API (JPA) 为对象关系映射提供了一个 POJO 持久性模型。Java 持久性 API 是由 EJB 3.0 软件专家组开发的,是 JSR 220 的一部分,但其使用并不仅限于 EJB 软件组件。它还可以直接供 Web 应用程序和应用程序客户端使用,甚至可以在 Java EE 平台外部(例如,在 Java SE 应用程序中)使用。
企业 JavaBeans (EJB) 技术是封装业务逻辑的 Java 平台企业版 (Java EE) 的服务器端组件体系结构。利用 EJB 技术可以加快并简化基于 Java 技术的分布式、事务性、安全、可移植应用程序的开发。
Java 持久性 API 是用于管理持久性和对象/关系映射的标准 API。它为使用 Java 域模型管理关系数据库的应用程序开发人员提供了一个对象/关系映射工具。Java 持久性 API 是 Java EE 平台的一部分。它还可以用于 Java SE 环境。
在本教程中,您将通过开发会话 bean 和实体 bean 实现一个持久性模型。这些 bean 使用 EJB 3.0 批注和 JPA 来实现模型的持久性。
-
EJB 3.0 实体表示数据库中的持久性数据,如客户表中的一行或者员工表中的一条员工记录。实体还可以在多个客户端间共享。您将使用 Entity Manager API 来创建、更新、删除和查询持久性模型。
-
会话 bean 执行独立的、去耦合的任务,如检查客户的信用记录。
然后,您将创建一个用于查看部门和员工信息的主从表单。创建完这个基本的主从页面之后,您将为选定的员工创建一个编辑页面。
开发和测试应用程序时,您将使用 JDeveloper 的嵌入式 Java EE 应用服务器。
返回主题列表
您需要为 DEPARTMENTS 和 EMPLOYEES 表构建持久性对象。这些持久性对象以实体 bean 的形式实现。默认情况下,为部门和员工数据创建 getter 和 setter 方法。这些方法将作为会话 bean 的一部分实现。然后,您将基于部门和相关员工创建一个主从 JSF 页面,并创建一个编辑 JSF 页面以便更新员工数据。
返回主题列表
开始本教程之前,您应该:
可以访问或已经安装了 Oracle JDeveloper(10.1.3.1.0 或 10.1.3.2.0)生产版。可以从
Oracle 技术网下载它。
可以访问或已经安装了 Oracle 数据库 10g(第 2 版或第 1 版)。可以从 Oracle 技术网 (
http://www.oracle.com/technology/software/products/database/oracle10g/index.html
) 下载它。
或者,您也可以安装免费的 Oracle XE 数据库。可以从 Oracle 技术网 (
http://www.oracle.com/technology/products/database/xe/index.html
) 下载它。
可以访问或已经安装了 Oracle 数据库 10g 随附的 Oracle 示例模式。
本教程使用 HR 模式。具体来说,页面使用了 DEPARTMENT 和 EMPLOYEES 表。
可以在线获取有关在 JDeveloper 中安装 HR 模式并创建到其的连接的指导:
http://www.oracle.com/technology/obe/obe1013jdev/common/OBEConnection.htm
创建新的应用程序和项目
在 JDeveloper 中,经常需要对包含在应用程序中的项目进行操作。应用程序是控制结构中的最高级别。
JDeveloper 项目是一个用于对相关文件进行逻辑分组的组织结构。您可以将多个项目添加到应用程序,以轻松地组织、访问、修改和重用源代码。在 Applications Navigator 中,项目作为层次结构的第二层显示在应用程序的下面。
建议您最好使用将模型代码和视图代码分离的项目。在本教程中,我们先创建一个 EJB 组件模型项目,随后再创建一个 JSF 视图项目。
在创建任何组件之前,您必须先创建应用程序和项目。为此,执行以下步骤:
Applications
选项卡,返回 Applications Navigator。
Applications
节点,从上下文菜单中选择
New Application
。
在 Application Templates 树,为 Web Application [JSF, EJB]
View and Controller
。在 View and Controller 窗格中,将
Project Name
设置为
UserInterface.jpr
,将
Default Package
设置为
view
。
在 Application Templates 树中,为 Web Application [JSF, EJB]
Data Model
,然后在 Data Model 窗格中,将
Project Name
设置为
EJBModel.jpr
,并将
Default Package
设置为
datamodel
。
命名查询使您可以在设计时定义查询,然后在运行时使用。默认创建了一个 NamedQuery 元数据语句。它检索 departments 表中的所有行。
@NamedQuery(name = "Departments.findAll", query = "select o from Departments o")
注
:任何以
开头的 Java 代码符号都称作批注。使用批注,您可以向对象添加元数据。批注示例如下所示:
返回主题列表
创建数据模型
会话外观为客户端对象提供底层 EJB(企业 JavaBeans)的统一接口。客户端只与外观交互作用,外观驻留在服务器上,并调用相应的 EJB 方法。因此,客户端和 EJB 之间的依赖性和通信减少了。
如果您在没有会话外观的情况下执行远程访问,客户端需要进行大量的远程调用才能直接通过网络访问 EJB 3.0 实体。这会带来大量网络流量,对性能产生负面影响。此外,如果没有外观,客户端就会直接依赖业务对象的实现,因此如果 EJB 的界面发生更改,客户端对象也要进行相应的更改。
在本部分中,您将创建一个会话 bean,用于实现一个查找员工和部门记录的方法。
在 Applications Navigator 中右键单击
EJBModel
节点,然后从上下文菜单中选择
New
选项。
Business Tier | EJB
类别,选择
Session Bean
项。
该会话 bean 由两个文件组成:HRFacadeBean — 包含会话 bean 代码。HRAppFacade — 描述远程客户端的 Bean 的功能。
打开 Structure 窗格 (
View | Structure
) 并在 Applications Navigator 中选择
buslogic.HRAppFacadeBean
。在 Structure 窗格中展开 Sources 节点。Structure 窗格应如下所示:
注意,JDeveloper 提供了一种通过示例客户端测试 EJB 的方法(为此,右键单击 HRFacadeBean,然后从上下文菜单中选择
New Sample Java Client
),然后您可以运行该 EJB。
现在,我们要将 EJB 作为 Oracle ADF 框架的数据控件公开。这将简化我们将用户界面绑定到 EJB 的方式。要了解有关 ADF 框架的更多信息,请访问:
http://oracle.com/technology/products/adf
在 Applications Navigator 中,右键单击
HRFacadeBean
节点,然后从上下文菜单中选择
Create Data Controls
。
创建本教程的应用程序时,您使用了两个项目:EJBModel 和 UserInterface。EJBModel 项目包含用作应用程序的业务模型的数据控件。UserInterface 项目将包括应用程序的 View 部分,它定义了用户界面组件。
EJBModel
项目节点,展开
UserInterface
项目:
在 Component Palette 中选择
JSF Navigation Case
。单击源 JSF 页面 (
deptEmployees
) 的图标,然后单击该导航示例的目标 JSF 页面 (
editEmployee
) 的图标。
JDeveloper 为您提供了 jsf-config.xml 文件的三种视图。我们使用了图表视图,但是相同的信息也可通过声明式对话框以及源直接访问。
单击屏幕底部的
Overview
选项卡。单击左侧表中的
Navigation Rules
。注意,该表中列出了您刚刚在此图表中创建的规则。
现在,单击屏幕底部的
Source
选项卡。
<from-view-id>
标记标识源页面,
<to-view-id>
标记标识目标页面。页面名称下面的下划线提醒您尚未创建页面。
切换回图表视图,在 Component Palette 中选择
JSF Navigation Case
。单击源 JSF 页面 (
editEmployee
) 的图标,然后单击该导航示例的目标 JSF 页面 (
deptEmployees
) 的图标。
如果有必要,从 Available Libraries 窗口中选择一些库,使用右箭头按钮将它们移至 Selected Libraries 部分中,确保包括以下库:
JSF Core 1.0
JSF HTML 1.0
ADF Faces Components
ADF Faces HTML
打开 Data Control Palette (
View | Data Control Palette
),展开
HRFacadeLocal | queryDepartmentsFindAll() | Departments
,然后选择
employeesList
节点。
employeesList 节点代表各部门主从关系中记录的集合。数据绑定自动同步在特定部门中工作的员工。
将 departmentCollection 拖放到页面上,然后从动态菜单中选择
Create Master-Details | ADF Master Form, Detail Table
。
在 Client Project Libraries Added 对话框中,单击
OK
。页面现在看起来应与下图类似:
主表单由默认的导航按钮填充,详细信息表有默认的 Submit 按钮。
打开 Data Control Palette (
View | Data Control Palette
),展开
HRFacadeLocal | queryDepartmentsFindAll() | Departments
,然后选择
employeesList
节点。
mergeEntity(Object)
节点。
注意,mergeEntity(Object) 方法对应于在更新的一行上执行的提交操作。它接受要执行该操作的行作为参数。我们将该方法绑定到当前页面上的 Submit 按钮。
将 mergeEntity 拖放到
Submit
按钮上,在对话框中选择
Bind Existing CommandButton
选项。
在 Variables 对话框中,展开
ADF Bindings | bindings | employeesListIterator | currentRow
,然后选择
dataProvider
。然后使用箭头将其移至 Expression 窗格中。
返回 Action Binding Editor,单击
返回主题列表
运行 JSF 页面
既然您已经构建了应用程序,您就需要对其进行测试。JDeveloper 使您可以轻松地通过内置应用服务器来测试 JSF。在 JDeveloper 中测试页面时,将自动启动该服务器。
以下几个步骤引导您完成该测试过程。
要测试页面,在 Applications Navigator 中右键单击
detEmployees.jspx
,从上下文菜单中选择
Run
。(也可以在可视化编辑器中单击右键,从上下文菜单中选择 Run。)
在 Structure 窗格中,展开
h:form | af:panelPage | af:panelGroup | af:panelHeader Department Employees List
,右键单击
af:table - table1
节点,然后从上下文菜单中选择
Properties
。
在 Structure 窗格中,展开
af:panelHeader | af:panelForm
,然后选择第一个
af:inputText
。在 Property Inspector 中,将
Label
设置为
Department
。对其他两个
inputText
重复该操作,将 Label 分别设置为
Name
和
Location
。