如何在使用 ADF 插入或删除行后刷新数据表

来源:互联网 发布:子域名爆破 编辑:程序博客网 时间:2024/05/16 06:29

转自: http://www.oracle.com/technetwork/cn/testcontent/index-083281-zhs.html

概述

本文说明了如何在插入新行或删除行(在使用会话 bean 数据控件时)之后刷新“浏览”页上的数据表。下图描述了包含部门表的浏览页,其中插入行或删除行的按钮可用:

用户可以选择一行并单击 Delete 按钮。该按钮绑定到 removeEntity() 数据控件方法,默认情况下将从数据库的表中立即删除行。但是,该表仍会显示该行,因为该表在默认情况下未刷新。标题为“使用 会话 bean 数据控件删除行”的部分说明了如何在调用诸如 removeEntity() 的方法且用户仍在同一页面的情况下刷新表。

该案例的另一个情况是插入新行。这通常在一个单独页面上执行。例如,下图描述了一个插入表单,用户在其中输入新数据并单击提交按钮来插入行:

 

该页上的 Create 按钮从会话 bean 调用 persistEntity() 数据控件方法。默认情况下,在调用该方法后,会立即将该行插入表中。但是,如果 Create 按钮也将用户导航回浏览页,则该表不会显示新行,因为默认情况下它不会刷新。标题为“使用会话 bean 数据控件插入行”的部分说明了如何在调用诸如 persistEntity() 的方法且用户返回包含数据表的页面之后刷新表。

基本步骤

本文假设您已经创建了访问 EJB Entity 或 TopLink POJO 持久性对象的会话 bean,并创建了该会话 bean 的数据控件。此外,下面的步骤假设您已经使用 JSF、ADF Faces 或 ADF Swing 创建了一个包含数据表的页。

以上面的浏览页图像为例,该表是通过将 Departments 集合从数据控件面板拖到页面并从动态列表中选择 Create > Tables > ADF Read Only Table... 来创建的。

在插入页图像中,插入表单是通过将数据控件面板中 Constructors 节点下的 Departments 集合拖放到页面来创建的。这只是创建新行的一种方式,SRDemo 示例和附带文档说明了如何使用其他方法执行插入操作。

下图描述了本例的页面流:

 

使用会话 bean 数据控件删除行

将删除功能添加到浏览页

执行以下步骤将删除功能添加到浏览页:

  1. 在可视编辑器中导航到浏览页,确保数据表启用了选择以便可以选择单个行,并且在表中启用了 Submit 按钮。
  2. removeEntity(Object) 方法从会话 bean 数据控件拖到浏览表的 Submit 按钮。从动态菜单中,选择Bind Existing commandButton
  3. 在 Action Binding Editor 中,指定要删除的实体。在 Value 字段中双击以启用椭圆形按钮,然后单击椭圆形按钮打开表达式编辑器。
  4. 展开 ADF BindingsbindingsfindAllDepartmentsItercurrentRow 节点。将 dataProvider 节点添加到右侧,以便将 Expression 指定为 ${bindings.findAllDepartmentsIter.currentRow.dataProvider} 。假设集合的迭代器名为 findAllDepartmentsIter。 根据需要修改迭代器名称。

    注意,该按钮的 ActionListener 属性设置为 #{bindings.removeEntity.execute}。

刷新数据表

在删除行后执行以下步骤刷新数据表:

  1. 为了在单击 removeEntity 按钮后执行 removeEntity() 方法以及调用表的查询方法,请创建一个 JSF 托管 bean。双击 removeEntity() 按钮调用托管 bean 属性。
    单击 New... 创建一个新的托管 bean。
  2. 指定 bean 的名称和类,并单击 OK。
  3. 指定一个方法名,如果要确保将 removeEntity() 绑定代码添加到方法中,请选择 Generate ADF Binding Code 并单击OK
  4. 注意,托管 bean 方法将使用以下代码调用 removeEntity 方法绑定(在浏览页定义文件中使用适当的实体参数值进行了定义):

    OperationBinding operationBinding = bindings.getOperationBinding("removeEntity");
    Object result = operationBinding.execute();

  5. 此外,要调用查询操作方法绑定,需要将类似代码添加到方法中。

    将以下代码复制并粘贴到托管 bean 的
    Object result = operationBinding.execute();

    语句下方,并使用表的查询方法名替换 findAllDepartments:

    //Refresh the page
    OperationBinding requery = bindings.getOperationBinding("findAllDepartments");
    requery.execute();

使用会话 bean 数据控件插入行

将创建功能添加到插入页

执行以下步骤使用构造函数创建新行:

  1. 在可视编辑器中导航到插入页,并确保表单包含一个 Submit 按钮。
  2. 要提交插入的行,请使用 persistEntity 方法。将 persistEntity(object) 节点从数据控件面板拖到 Submit 按钮,并选择Bind Existing CommandButton
  3. persistEntity 方法接受一个参数(即,要提交的实体)。在 Action Binding Editor 中,双击 value 字段以启用椭圆形按钮。单击椭圆形按钮绑定实体参数的值。在绑定编辑器中,通过展开ADF BindingsbindingsDepartmentsItercurrentRow 节点来选择要提交的实体。选择 dataProvider,并将其添加到右侧以创建表达式。
    确保表达式设置为 ${bindings.DepartmentsIter.currentRow.dataProvider} ,并单击OK。假设集合的迭代器名为 DepartmentsIter。根据需要修改迭代器名称。
  4. 在插入页可视编辑器中,选择 persistEntity 按钮。使用 Property Inspector 将 Action 属性设置为返回到浏览页的导航示例名。

刷新数据表

在插入行后执行以下步骤刷新数据表:

  1. 打开浏览页,右键单击可视编辑器。选择 Go To Page Definition
  2. 在 Structure 窗口中,展开最顶层节点。右键单击 executables 节点并选择 Insert inside executables ->invokeAction
  3. 在 Common Properties 选项卡中,指定 tableRefresh 作为操作的 Id,并在 Binds 下拉列表中选择您的表查询名称(如 findAllDepartments)。
  4. 单击 Advanced Properties 选项卡。
  5. 选择 ifNeeded 作为 Refresh 属性,如果要确保在每次呈现页面时调用该操作,请输入 ${!adfFacesContext.postback}作为 RefreshCondition 并单击 OK

结论

本文说明了如何在使用 ADF 和会话 bean 数据控件时刷新浏览页上的数据表。我们使用的示例涉及以下内容:

  1. 从数据表中选择一行,单击按钮删除该行,该行会保留在同一页面上。应该刷新数据表,以便删除的行不再显示。
  2. 在包含数据表的页面上单击一个按钮,以导航到插入表单。指定行细节,单击按钮插入该行,然后返回到浏览页。应该刷新数据表,以便插入的行显示出来。

这些案例的刷新操作是通过使用 JSF 托管 bean 执行刷新,并使用在页定义文件中调用的操作的 !adfFacesContext.postback 刷新条件来完成的。

有关更多信息,请参阅 Oracle 技术网的 JDeveloper 页上的教程、示例应用程序和 ADF 开发人员指南。