如何在使用 ADF 插入或删除行后刷新数据表
转自: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 数据控件删除行
将删除功能添加到浏览页
执行以下步骤将删除功能添加到浏览页:
- 在可视编辑器中导航到浏览页,确保数据表启用了选择以便可以选择单个行,并且在表中启用了 Submit 按钮。
- 将 removeEntity(Object) 方法从会话 bean 数据控件拖到浏览表的 Submit 按钮。从动态菜单中,选择 Bind Existing commandButton。
- 在 Action Binding Editor 中,指定要删除的实体。在 Value 字段中双击以启用椭圆形按钮,然后单击椭圆形按钮打开表达式编辑器。
- 展开 ADF Bindings、 bindings、 findAllDepartmentsIter 和
currentRow 节点。将 dataProvider 节点添加到右侧,以便将 Expression 指定为
${bindings.findAllDepartmentsIter.currentRow.dataProvider} 。假设集合的迭代器名为 findAllDepartmentsIter。 根据需要修改迭代器名称。
注意,该按钮的 ActionListener 属性设置为 #{bindings.removeEntity.execute}。
刷新数据表
在删除行后执行以下步骤刷新数据表:
- 为了在单击 removeEntity 按钮后执行 removeEntity() 方法以及调用表的查询方法,请创建一个 JSF 托管 bean。双击 removeEntity() 按钮调用托管 bean 属性。
单击 New... 创建一个新的托管 bean。 - 指定 bean 的名称和类,并单击 OK。
- 指定一个方法名,如果要确保将 removeEntity() 绑定代码添加到方法中,请选择 Generate ADF Binding Code 并单击 OK。
- 注意,托管 bean 方法将使用以下代码调用 removeEntity 方法绑定(在浏览页定义文件中使用适当的实体参数值进行了定义):
OperationBinding operationBinding = bindings.getOperationBinding("removeEntity");
Object result = operationBinding.execute(); -
此外,要调用查询操作方法绑定,需要将类似代码添加到方法中。
将以下代码复制并粘贴到托管 bean 的
Object result = operationBinding.execute();
语句下方,并使用表的查询方法名替换 findAllDepartments://Refresh the page
OperationBinding requery = bindings.getOperationBinding("findAllDepartments");
requery.execute();
使用会话 bean 数据控件插入行
将创建功能添加到插入页
执行以下步骤使用构造函数创建新行:
- 在可视编辑器中导航到插入页,并确保表单包含一个 Submit 按钮。
- 要提交插入的行,请使用 persistEntity 方法。将 persistEntity(object) 节点从数据控件面板拖到 Submit 按钮,并选择 Bind Existing CommandButton。
- persistEntity 方法接受一个参数(即,要提交的实体)。在 Action Binding Editor 中,双击 value 字段以启用椭圆形按钮。单击椭圆形按钮绑定实体参数的值。在绑定编辑器中,通过展开
ADF Bindings、 bindings、 DepartmentsIter 和
currentRow 节点来选择要提交的实体。选择 dataProvider,并将其添加到右侧以创建表达式。
确保表达式设置为 ${bindings.DepartmentsIter.currentRow.dataProvider} ,并单击 OK。假设集合的迭代器名为 DepartmentsIter。根据需要修改迭代器名称。 - 在插入页可视编辑器中,选择 persistEntity 按钮。使用 Property Inspector 将 Action 属性设置为返回到浏览页的导航示例名。
刷新数据表
在插入行后执行以下步骤刷新数据表:
- 打开浏览页,右键单击可视编辑器。选择 Go To Page Definition。
- 在 Structure 窗口中,展开最顶层节点。右键单击 executables 节点并选择 Insert inside executables -> invokeAction。
- 在 Common Properties 选项卡中,指定 tableRefresh 作为操作的 Id,并在 Binds 下拉列表中选择您的表查询名称(如 findAllDepartments)。
- 单击 Advanced Properties 选项卡。
- 选择 ifNeeded 作为 Refresh 属性,如果要确保在每次呈现页面时调用该操作,请输入 ${!adfFacesContext.postback} 作为 RefreshCondition 并单击 OK。
结论
本文说明了如何在使用 ADF 和会话 bean 数据控件时刷新浏览页上的数据表。我们使用的示例涉及以下内容:
- 从数据表中选择一行,单击按钮删除该行,该行会保留在同一页面上。应该刷新数据表,以便删除的行不再显示。
- 在包含数据表的页面上单击一个按钮,以导航到插入表单。指定行细节,单击按钮插入该行,然后返回到浏览页。应该刷新数据表,以便插入的行显示出来。
这些案例的刷新操作是通过使用 JSF 托管 bean 执行刷新,并使用在页定义文件中调用的操作的 !adfFacesContext.postback 刷新条件来完成的。
有关更多信息,请参阅 Oracle 技术网的 JDeveloper 页上的教程、示例应用程序和 ADF 开发人员指南。