|
|
ADF Faces 符合 JSF 标准,使您可以专注于应用程序和布局而非标记语言和标记。由于集成了 ADF Faces 和 ADF 业务组件,因此您可以从 ADF 业务组件中轻松地更改用户界面的默认域标签。 在以下几个步骤中,您将基于刚刚构建的 ADF BC 模型创建一个 ADF Faces 应用程序。您还可以修改某些 ADF BC 默认设置来帮助增强默认的 UI。
至此,您已经构建了新的 ADF Faces 应用程序,下面需要对其进行测试。JDeveloper 使您可以轻松地通过内置 OC4J 服务器来测试 JSF。在 JDeveloper 中测试页面时,将自动启动该服务器。 以下几个步骤引导您完成该测试过程。
现在就有了可以使用的 JSF 应用程序,接下来我们花些时间来自定义页面上的一些标签。刚才是用布局组件的默认值创建的页面。开始时采用这种方法不错,不过您可能想能更好地控制整个页面。 页面上的域标签不是硬编码的,而是在运行时派生的。这些域的值是在运行时从 ADF 业务组件定义中获得的。ADF BC 提供了一种自定义这些运行时属性的方法。可修改的属性之一称为控制提示。通过这些控制提示,您可以创建将在运行时由 ADF Faces 呈现的标签、域大小和格式掩码。 在以下几个步骤中,您将修改 CustomersView 对象的控制提示并重新启动应用程序查看这些应用的更改。
在本教程的这一部分中,您需要将业务组件添加到现有的数据模型,以将视图对象添加到应用程序模块的数据模型以支持搜索页面和相关的编辑页面。搜索页面基于 Customers 和 Orders 之间的信息连接。 在以下几个步骤中,您将在数据模型中添加业务组件。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 1. |
在 Applications Navigator 中,右键单击 DataModel 项目,然后从上下文菜单中选择 New。 |
| 2. |
在 New Gallery 中,展开 Business Tier,在 Categories 列表中选择 ADF Business Components。在 Item 窗格中选择 View Objec。 单击 OK。 |
| 3. |
单击 Next 跳过 Create View Object 向导的 Welcome 页面。在 Step 1 中,将视图命名为 PromotionsLOV。选中 Rows Populated by a SQL Query 选项并选择 Read-Only Access。 单击 Next 继续。 |
| 4. |
在 Step 2 中,输入以下查询语句: SELECT Promotions.PROMO_ID, Promotions.PROMO_NAME 单击 Test 按钮验证 SQL 语句,单击 OK。然后,单击 Next 两次并单击 Finish。 |
| 5. |
Applications Navigator 应如下所示:
|
在该部分中,您将基于 SQL 语句(构成 Orders 表的 Mode 列的授权值)创建一个只读视图组件。这些值将用作编辑页面中的下拉列表。
| 1. |
在 Applications Navigator 中,右键单击 DataModel 项目,然后从上下文菜单中选择 New。 |
| 2. |
在 New Gallery 中,展开 Business Tier 并在 Categories 列表中选择 Business Components。在 Item 窗格中选择 View Object。 单击 OK。 |
| 3. |
单击 Next 跳过 Create View Object 向导的 Welcome 页面。在 Step 1 中,将视图命名为 ModelLOV,选中 Rows Populated by a SQL query 选项并选择 Read-Only Access。 单击 Next 继续。 |
| 4. |
在 Step 2 中,输入以下查询语句: select 'direct' as modevalue from dual 单击 Test 按钮验证 SQL 语句。然后,单击 Next 两次并单击 Finish。
|
| 5. |
Applications Navigator 应如下所示:
|
在以下步骤中,您将创建一个视图对象来显示 Customer 和 Orders 实体对象中的数据。该向导将在基础数据库表之间创建相应的连接查询。
| 1. | 在 Applications Navigator 中,右键单击 DataModel 节点,然后从上下文菜单中选择 New。
|
||||||||||||
| 2. | 在 New Gallery 中,展开 Business Tier 并在 Categories 列表中选择 Business Components。在 Item 窗格中选择 View Object。 然后,单击 OK。 |
||||||||||||
| 3. | 单击 Next 跳过 Create View Object 向导的 Welcome 页面。在 Step 1 中,将视图命名为 SearchOrders,选中 Rows Populated by a SQL Query 选项,然后选择 Updatable Access through Entity Objects access。 单击 Next。 |
||||||||||||
| 4. | 在 Step 2 中,选择 Orders 实体对象并单击 Add 按钮 注:必须按照以上顺序移入选定实体。
单击 Next。 |
||||||||||||
| 5. | 在 Step 3 中单击 Attributes 节点,并选择以下属性: Orders.OrderId
然后,单击 Next |
||||||||||||
| 6. | 在 Step 4 中,选择 OrderId 属性,注意该属性自动标记为 Key Attribute,因为它是基础 Orders 实体对象的主要 从下拉列表中选择 CustomerId 属性并取消选中 Key Attribute 复选框。
单击 Next。 |
||||||||||||
| 7. |
现在,我们想要提供一个搜索页面,使最终用户可以根据客户的名字或姓氏以区分大小写的方式进行搜索,并搜索订单总计位于给定范围内的订单。在该步骤中,您将向特定的视图对象(该视图对象引用我们希望用户能够在运行时提供的参数的命名绑定变量)中添加一个自定义 WHERE 子句。您将在此处引用绑定变量,然后在该向导的下一步中正式定义绑定变量名、数据类型和默认值。 在 Step 5 中单击 ExpertMode 复选框,然后在查询语句对话框中,在语句结尾添加以下代码: AND ORDER_TOTAL BETWEEN :TotalLow AND :TotalHigh AND (UPPER(CUST_FIRST_NAME) LIKE UPPER(:CustName) ||'%' OR UPPER(CUST_LAST_NAME) LIKE UPPER(:CustName)||'%') 单击 Test 按钮确保 SQL 语句有效。单击 Next 两次。
|
||||||||||||
| 8. | 在 Step 7 中,使用 new 按钮创建三个包含以下属性的命名绑定变量:
|
||||||||||||
| 9. | 可以按照前面对视图对象属性执行的操作为命名的绑定变量定义控制提示。 选择 CustName 变量并单击 Control Hints 选项卡。在标签文本域中键入 Customer Name
|
||||||||||||
| 10. | 对于 TotalLow,在标签文本域中键入 Order Total Greater Than
|
||||||||||||
| 11. | 对于 TotalHigh,在标签文本域中键入 Order Total Lower Than
单击 Finish |
||||||||||||
| 12. |
Applications Navigator 现在如下所示:
|
| 1. |
在 Applications Navigator 中右键单击 SearchOrders 节点,并从上下文菜单中选择 Edit 选项。
|
| 2. | 然后,添加一个格式掩码,以便 OrderTotal 显示为货币值。 展开 Attributes 节点,选择 OrderTotal,并在 Control Hints 选项卡中将 Format Type 设置为 Currency。
单击 OK。 注:由于格式是在视图对象级指定的,因此只有使用此特定视图定义的组件才会继承此格式定义。 |
| 3. |
右键单击 Applications Navigator 中的 Orders 实体对象节点,并从上下文菜单中选择 Edit 选项。
|
| 4. | 展开 Attributes 节点,选择 OrderDate,在 Control Hints 选项卡中将 Format Type 设置为 Simple Date,并指定以下格式: dd-MMM-yyyy
单击 OK。 注:由于格式是在实体对象级指定的,因此所有基于此实体定义的视图均继承此格式定义。 |
| 5. |
在 Applications Navigator 中,右键单击 OrderEntryAM 并从上下文菜单中选择 Edit。
|
| 6. | 您需要在应用程序模块的数据模型中包含新视图对象组件的实例。 在 Application Module Editor 中,选择 Data Model 节点,并在可用对象列表中选择 ModelLOV。单击 Add 按钮 对 SearchOrders 和 PromotionsLOV 重复移入操作。
然后单击 OK。 注:Instance Name 域可用于更改数据模型中选定视图对象实例的名称。 |
| 7. |
单击 JDeveloper 菜单栏上的 Save All |
| 8. |
您现在已经自定义了 SearchOrders 视图来满足应用程序的特定需要。下一步是创建使用此数据模型的 JSF 页面。 |
在以下几个步骤中,您将使用刚刚定义的 SearchOrders 视图创建一个基于 ADF BC 模型的 ADF Faces 页面。
| 1. | 在 Applications Navigator 中,折叠 DataModel 项目并展开 UserInterface 项目。双击 faces-config.xml 节点以打开图表。
注:或者,可以右键单击 UserInterface 节点,并从上下文菜单中选择 Open JSF Navigation 选项。 |
| 2. | 从组件选项板中,将 JSF page 图标拖放到图表上。 |
| 3. | 将页面重命名为 Search。 双击 JSF page 图标启动页面创建向导。
|
| 4. | 选择新的 JSF 将打开 Create JSF JSP 向导。单击 Next 跳过 JSF JSP 向导的 Welcome 页面(如果显示该页面)。 |
| 5. |
选择 JSP Page (*.JSP) 作为 Search.jsp 的类型。接受其他默认值。
单击 Next 继续。 |
| 6. |
在新页面 Component Binding 中,选择 Do Not Automatically Expose UI Components 选项。保留其他值的默认值。
单击 Next。 |
| 7. |
确保选择了下列库:
单击 Next 接受这些库。 |
| 8. | 单击 Finish 接受默认的 HTML 选项并创建新的 JSP。您现在就创建了一个空的 Search.jsp 页面。 在以下几个步骤中,您将在该页面上添加 ADF Faces 数据绑定组件。这些组件显示与选择条件匹配的行搜索条件。
|
| 9. | 在 Data Control 选项板中,展开以下节点 OrderEntryAMDataControl > SearchOrders1 > Operations,并选择 ExecuteWithParams 操作。
|
| 10. | 将 ExecuteWithParams 拖放到页面上,然后在上下文菜单中,选择 Create > Parameters > ADF Parameter Forms... Edit Form Fields 对话框打开。 单击 OK。 页面将显示在编辑器中。 |
| 11. | 在 Data Control 选项板中,选择 SearchOrders1 并将其拖放到参数表单下。 |
| 12. | 在新对话框中,选择 Create > Tables > ADF Read Only Table
|
| 13. |
在 Edit Table Columns 对话框中,单击 Enable Selection 和 Enable Sorting 框
然后单击 OK。
您现在创建了一个数据绑定到 ADF BC 业务服务的完整 JSF 页面。 |
| 14. | 单击工具栏中的绿色箭头 |
| 15. |
试用搜索页面,为 Customer Name、Total Low 和 Total High 域指定值,然后单击 ExecuteWithParams 按钮。
注:客户名称搜索区分大小写,并根据在基础视图对象中指定 WHERE 子句的方式匹配名字或姓氏。在实际应用程序中,您可以使用属性查看器将 ExecuteWithParams 按钮轻松地重命名为“Find”或“Search”。 |
| 16. | 尝试各种搜索组合。单击任意列的标题来测试排序工具。再次单击该标题将从升序切换为降序,反之亦然。完成 时关闭浏览器窗口。 |
在以下几个步骤中,您将使用刚刚构建的 Orders、PromotionsLOV 和 ModelLOV 视图创建一个基于 ADF BC 模型的 ADF Faces 页面。
| 1. | 在 Applications Navigator 中,双击 faces-config.xml 节点打开一个图表。 |
| 2. | 从组件选项板中,将 JSF page 图标拖放到图表上。 |
| 3. | 将页面重命名为 EditOrder。 双击 EditOrder JSF 页面图标启动该向导。
|
| 4. | 选择新的 JSF 将打开 Create JSF JSP 向导。单击 Next 跳过 JSF JSP 向导的 Welcome 页面。 |
| 5. | JSP 标准支持创建格式良好的 XML 文档页面。这些页面非常方便,因为它们使您可以轻松地使用 XML 工具分析页面源代码,并且对于不将代码混合到页面中这个最佳实践起到促进作用。JDeveloper 支持使用 *.jsp 页面或这些基于 XML 的 *.jspx 页面。在该步骤,您将使用所谓的 JSP Document(基于 XML 的 JSP 页面样式)编辑页面。 选择 JSP Document (*.JSPX) 作为 EditOrder.jspx 的类型。接受其他默认值
单击 Next 继续。 |
| 6. |
在下一个页面 Component Binding 中,选择 Do Not Automatically Expose UI Components 选项。保留其他值的默认值。
单击 Next。 |
| 7. | 确保选择了下列库:
单击 Next 接受这些库。单击 Finish 接受默认 HTML 选项并创建新的 JSPX。 |
| 8. | 您现在拥有了一个空的 EditOrder.jspx 页面。在以下几个步骤中,您将在该页面上添加一个 ADF Faces 数据绑定组件。这些组件使用各种 UI 表示显示 Orders 信息。
|
| 9. | 在 Data Control 选项板中,展开 OrderEntryAMDataControl 节点并将 OrdersView1 拖放到该空页面上。
|
| 10. |
在新对话框中,选择 Create > Forms > ADF Form...
|
| 11. |
在 Edit Form Fields 中,删除 OrderMode 和 PromotionId 属性,然后选中 Include Submit Button。 单击 OK。
|
| 12. | 从 Data Controls 选项板中,展开 OrdersView1 并将 OrderMode 属性拖放到页面上的 Order Total.label 域之后。
在上下文菜单中,选择 Create > Single Selections > ADF Select One Choice...
|
| 13. |
在 List Binding Editor 中,选择 Dynamic List 选项。注意,在这个特定实例中,由于值的数量很少,因此还可以使用 Fixed List 选项,然后指定允许值的列表。
将 Base Data Source 设置为 OrderMode,并将 List Data Source Attribute 设置为 Modevalue。
然后单击 OK。
|
| 14. |
从 Data Controls 选项板中,选择 PromotionId 列,然后将 PromotionId 属性拖放到页面上的 OrderMode.label 域之后。
从上下文菜单中,选择 Create > Single Selections > ADF Select One Choice...
|
| 15. |
在 List Binding Editor 中,选择 Dynamic List 选项。
在 List Data Source 中,单击 Add 按钮,然后在 Add Data Source Editor 中,选择 PromotionsLOV1 数据控件并单击 OK。
单击 OK。 |
| 16. | 重新打开 faces-config 图表,然后在组件选项板中选择 JSF Navigation Case。单击 Search 页面,并绘制一条指向 EditOrder 页面的直线。
|
| 17. | 在 Property 窗格中,将 From Outcome 设置为 edit 以重命名导航。
|
| 18. | 在组件选项板中,选择 JSF Navigation Case。单击 EditOrder 页面并绘制一条指向 Search 页面的直线。
|
| 19. |
在该图表上,为输出选择 success 标签,并将它的值更改为 search 以重命名输出导航。
|
| 20. |
重新打开 EditOrder 页面,然后在 Data Control 选项板中,向下滚动到底部,打开 Operations 节点,然后将 Commit 操作拖放到现有的 Submit 按钮上。
在上下文菜单中,选择 Bind Existing CommandButton 选项。
在属性窗格中,对于 Commit 按钮,从下拉列表中将 action 值设置为 search。然后,选择 Disabled 属性并单击 Reset to Default
|
| 21. |
在 Data Controls 选项板的 Operations 节点中,将 Rollback 操作拖放到 Commit 按钮的旁边。
在上下文菜单中,选择 ADF Command Button 选项
在属性窗格中,对于 Rollback 按钮,从下拉列表中将 action 值设置为 search。然后,选择 Disabled 属性,并单击 Reset to Default
|
| 22. | 重新打开页面流图,双击图表上的 Search 图标打开 Search 页面,然后选择 Submit 按钮。
|
| 23. |
在属性窗格中,键入 Edit 作为 Text 值,对于 Action,从下拉列表中选择 edit。
|
| 24. |
重新打开 faces-config,然后选择并运行 Search 页面。
|
| 25. |
在搜索页面中,选择一行然后单击 Edit 按钮。
|
| 26. |
注意,编辑页面将被调用,但不显示搜索页面中的选定行。假设搜索页面和编辑页面均基于同一视图对象,则搜索页面中的选定行也将成为编辑页面中的当前行。但由于搜索页面和编辑页面基于不同的视图对象,因此某个页面中的当前行独立于另一个页面中的当前行。在下一个部分中,您将配置声明步骤,以使搜索页面中的当前选定行与要在编辑页面中编辑的当前行同步。 测试 OrderMode 和 PromotionId 属性上的下拉列表
注意,Orderdate 根据您前面在实体对象级别指定的格式显示,但 OrderTotal 并不像在搜索页面中那样显示货币格式,这是因为格式是在 SearchOrders 视图上而不是在 OrdersV1 视图上定义的。 |
| 27. | 关闭浏览器,返回到 JDeveloper。 |
现在,您必须使搜索页面中选择的信息与编辑页面上显示的信息同步。
使用搜索页面中的 Edit 按钮完成同步,将当前选中行的键指定给编辑页随后将访问的变量,以在显示该页之前设置它的当前行。
以下几个步骤引导您完成此过程。
| 1. | 在 Desig 编辑器中打开 Search 页面,然后选择 Edit 按钮。
|
||||||||
| 2. | ADF Faces 使您可以简单地采用声明方式通过单击链接或按钮自动设置某个应用程序变量的值。在该步骤中,我们将向搜索页面中的 Edit 按钮添加一个 SetActionListener 组件,以将变量设置为当前选定行的键值(唯一标识该行)。 在 Structure 窗格中,右键单击 edit commandButton,然后从上下文菜单中选择 Insert Inside > ADF Faces Core > SetActionListener
|
||||||||
| 3. |
在 Insert SetActionListener 对话框中,输入下列值:
单击 OK。 注:我们使用标准 JSF 表达式语言 (EL) 语法指定 #{row.rowKeyStr} 表达式引用表的当前行上名为 rowKeyStr 的属性。它的值将是一个表示该行的唯一键。 #{processScope.orderKey} 表达式引用 ADF Faces 进程作用域中名为“orderKey”的属性。该进程作用域保存这样的属性:其值的持续时间超过单个请求(当某个页面使用重定向而非前进导航到另一个页面便可能存在这种情况)的属性,或其值应 |
||||||||
| 4. |
在以下几个步骤中,您将配置编辑页面,以便在使用 ADF 模型层为所有页面提供的内置 setCurrentRowWithKey 操作初次显示页面时,以声明方式设置当前要编辑的行。这是在页面的数据绑定元数据(存储在每个页面的 ADF 页面定义中)中配置的。 在 Applications Navigator 中,右键单击 EditOrder 页面节点。从上下文菜单中,选择 Go to Page Definition 选项
|
||||||||
| 5. |
然后,添加 OrdersView1Iterator 的 setCurrentRowWithKey 操作绑定。该迭代器是我们最初从 Data Control 选项板拖放 ADF Form 时在页面定义中自动创建的。迭代器跟踪基础数据源中的当前行,并提供在构建用户界面(如 Next、Previous、setCurrentRowWithKey 等)时有用的各种内置操作。 右键单击 bindings 节点。从上下文菜单中,选择 Insert Inside bindings > action
|
||||||||
| 6. | 在 Action Binding Editor 的 Select an Iterator 域中,从对话框底部的下拉列表中选择 OrdersView1Iterator。
|
||||||||
| 7. |
在 Select an Action 的下拉列表中选择 setCurrentRowWithKey,并在 Value 域中双击。然后输入以下值:
然后,单击 OK。 注:内置的 setCurrentRowWithKey 操作采用一个名为“rowKey”的参数,该参数表示当前行的键。上一步骤中,我们配置了搜索页面的 Edit 按钮,以将当前行的键存储在 ADF Faces 进程作用域中名为“orderKey”的属性中。因此,我们在此处需要以参数形式将该行键值传递给 setCurrentRowWithKey 操作。为此,我们只需使用同一 EL
|
||||||||
| 8. | 单击 JDeveloper 菜单栏上的 Save All |
||||||||
| 9. |
在 Structure 窗格中,右键单击 executables 节点,然后从上下文菜单中选择 Insert inside executables > invokeAction 选项
|
||||||||
| 10. | 在收到指示之前,页面定义中的操作绑定将不执行它的操作。可以通过三种方法调用操作绑定: 1. 可以通过编写代码以编程方式调用; 在 Insert InvokeAction 对话框中,输入以下值:
注:Id 名称可以由开发人员根据喜好自行定义。 单击 Advanced Properties 选项卡。 注:默认情况下,“invokeAction”将在每次呈现页面时执行。这包括当页面最初呈现时,以及在处理随后的“postback”事件时,例如在用户与页面上的按钮或链接交互时。我们可以使用布尔值 EL 表达式指定一个可选 RefreshCondition,以便以声明方式配置 invokeAction 应何时“引发”。当表达式计算为 true 时,invokeAction 将调用其相关操作绑定。当表达式计算为 false 时,将跳过 invokeAction,不调用相关的操作绑定。 由于我们只希望最初呈现页面(而不是在以后处理 postback 事件)时触发 setCurrentRowWithKey 操作,因此可以使用 EL 表达式 #{adfFacesContext.postback == false} 完成该操作。最初呈现页面时,该 postback 属性将为 false。 输入下列值:
单击 OK。 |
||||||||
| 11. | 选择 Search 页面并 Run(运行)该页面
|
||||||||
| 12. |
在搜索页面中指定搜索参数,然后单击 ExecuteWithParams 按钮执行查询。在详细信息列表中,选择一行,然后单击 Edit 按钮调用 EditOrder 页面。
|
||||||||
| 13. | 在 EditOrder 页面中,更改 OrderTotal 值并提交更改。
|
||||||||
| 14. | 搜索页面现在重新显示原始搜索请求的行。该页面还反映了以前进行的更新。
|
||||||||
| 学得很好!您已经成功完成了此 OBE。 |
在本教程中,您使用 Oracle JDeveloper、ADF 业务组件和 ADF Faces 构建了一个端到端应用程序。您学习了如何:
| 创建 ADF 业务组件模型 | ||
| 使用 ADF Faces 组件创建一个 JavaServer Faces 页面 | ||
| 使用 ADF 业务组件自定义 UI 的元素 | ||
| 运行和测试 ADF Faces 应用程序 | ||
| 使用业务组件控制提示自定义应用程序 | ||
| 为 LOV 和验证控件创建新业务组件 | ||
| 基于连接操作创建一个搜索页面 | ||
| 创建一个编辑页面 | ||
| 当编辑页面和搜索页面 基于不同的视图对象时同步这两个页面 |
||
|
|
|
|
|