专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » oracle:了解 Oracle ADF:入门举例 »正文

oracle:了解 Oracle ADF:入门举例

来源: 发布时间:星期三, 2009年2月25日 浏览:0次 评论:0
="t18"> 2006 年 11 月发布 最近我所工作机构(威斯康星大学伊奥克莱尔分校)将个用 Cobol 编写且运行在 Unisys 大型机上老旧系统部分移植到了 Java/J2EE 环境中 我们 IT 小组主要使用开放源代码工具(包括 Eclipse、Tomcat 和 Spring)来编写应用但是许可方式上更改使我们可以考虑 Oracle 工具因此我们使用 Oracle JDeveloper 10g 和 Oracle 应用开发框架 (ADF) 编写了个应用来测试开发模型本文将对该应用进行描述从而快速而具体地介绍如何使用 Oracle ADF 进行 UI 开发(有关更进技术信息请参阅 Oracle 技术网上 Oracle ADF 教程和 Oracle ADF 开发人员指南、Oracle ACE Steve Muench 在 Oracle 杂志上内容出色 ADF 专栏以及 Oracle JDeveloper 论坛中评论) 在本文中我不会描述构建应用所需个步骤但希望这里信息足以使您作出自己决策本文假设您十分了解 Java熟悉 Eclipse 或 JDeveloper并具有普通编程知识(我没有在每个步骤后提醒您 Save All但该步骤不应省略) 改变给定体系结构和开发模型总是很困难因此我将首先提供些背景知识以介绍说明 JDeveloper 和 ADF 价值所在从而证实这种转变有利性我还会在个单独部分中提供些“提示和窍门技巧”

背景

当前应用直接使用了 Java (JDK 1.5)、Spring(MVC、Web Flow、JDBC 模板)和 jsp 页面数据也复制到了个 Oracle 数据库 10g 第 2 版数据库中尽管我们了解如何使用 JBoss Hibernate 作为对象关系映射 (ORM) 工具但我们数据访问既不复杂也不是动态而且 Spring JDBC 模板已经充分满足了我们需要 由于我们在生产中使用是 Oracle 数据库 10g 第 2 版因此在基于 Windows 试用版中使用 Oracle 数据库 10g 快捷版 (XE)(Oracle 数据库免费入门级版本)顺理成章我们希望能够在其中轻松地访问数据在决定使用 Oracle TopLink ORM 工具后使用 Oracle 数据库也很有意义这样我们就可以轻松地将映射移植到其他数据源(假如决定使用测试用例作为生产应用基础)我们对 XE 所作更改就是在系统主页中更改系统全局区 (SGA)以减少它使用内存 我们选择 TopLink 比预期效果还要好它抽象了许多使用 JDBC 甚至接口(如 Spring JDBC 模板)繁复具体信息(Dustin Marx 在 OTN 上“在 JDBC 编程中添加些 Spring 代码”文中提供了个优秀举例该举例使用 JDBC 模板无需配置复杂 Spring 环境)JBoss Hibernate 是个出色 ORM 工具但在端到端 ADF 解决方案中集成 TopLink 映射能力也令人大开眼界并且非常高效 根据 Oracle 建议我们创建了个 EJB 会话 Bean 来封装对数据库访问这只有在应用和数据库的间有个层(以便在其中根据需要使用业务逻辑)情况下才有意义迄今为止我们应用中没有任何需要状态事物而使用 Session Facade 设计模式时通常会需要状态 使用 ADF 个标准步骤是创建组能够访问数据信息库数据Control控件我们将遵循该原则在不需要业务逻辑情况下(通常是查询有时是更新和删除)通过 UI Control控件直接访问信息十分高效在较复杂情况下可以通过在会话 Bean 思路方法中包含业务规则实现来应用业务规则(ADF 开发人员指南第 1.1 章很好地介绍说明了 ADF 和 JSF 如何协同工作以提供高效开发环境) 我们还使用标准 JSF 导航创建了组 jspx 文件尽管我们熟悉 Struts但这里并不使用它我们将使用 jspx 文件这是 Oracle 建议做法 JDeveloper 10.1.3 在整个项目中充当 IDE这可能很明显但忘了提醒您它无法识别 JDeveloper 在构建 ADF 应用过程中所扮演基本角色JDeveloper 是个 Java 开发工具但它还可以为您提供对 TopLink、ADF UI 及数据访问Control控件功能、JSF 功能以及 XML 和 JSP 文件端到端访问还可以提供测试部署和数据库访问环境
同时当您在 JDeveloper 中编辑文件时系统会自动在窗口中调整更改您在使用 Eclipse 和其他 IDE 时通常看不到这些更改这些更改提供了各种视图和编辑思路方法因此学习使用 JDeveloper 丰富功能是有定难度您需要了解在哪里双击、何时使用 StrUCture 和 Data Control 窗口、何时在属性编辑器中设置值以及(偶然)何时使用 Source 窗口并编写 Java 或 JSP 代码

项目

我们项目是个简单学生会银行帐户所需基本功能是输入和编辑支出和存款该项目基本上是 ADF 教程中描述功能子集因此熟悉 SRDemo 人可以识别出其中许多元素SRDemo 是个完整举例应用您可以通过 JDeveloper Help 下拉菜单中“检查更新”机制下载该应用包含完整源代码ADF 开发人员指南使用它来介绍说明如何使用 ADF 进行开发

第 0 阶段:构建应用设置

第 1 步:使用 JSF、EJB 和 TopLink 模板创建个新 Web 应用(另请参阅 Oracle ADF 教程 1-10)选择模板并不重要所有选项都可用即使它们最初没有被选中通过该模板创建标准 Model 和 ViewController 项目从而保留应用前端和后端您应该设置默认包名称在创建 Java 类时该名称可在 JDeveloper 中用作默认名称 第 2 步:设置数据库尽管我们可以尝试使用 New Gallery Database Tier 中 Offline Database Objects但我们先前已经创建了所需 SQL以使用组表(3 个)创建模式我们登录到 XE Web 界面并使用脚本(您可以在 SQL Command 页面上引用中找到该脚本)创建了用户和表为这些表指定主键很重要这样至少可以使 TopLink 具有足够信息来生成更复杂映射:
  • Account 用于保存有关帐户基本信息
  • Details 用于保存所有帐户交易信息
  • Manager 是和帐户关联个人列表
为了填充表我们编写了个使用 DBUnit Java 应用并使用引用中数据集创建了个 CampusAccounts.xml 文件假如愿意您可以克隆 XML 元素来扩展数据集由于这是应用个 Java 类我们选择在 Model 项目中创建个 New/General/Java 类以便创建然后将类主体复制并粘贴到新创建类中假如类已经创建我们将选择 File/Import 选项将 Java Source 复制到 Model 项目中 public void (String argv) throws Exception { Class driverClass = Class.forName("oracle.jdbc.OracleDriver"); Connection jdbcConnection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "CampusAccounts", "xxxxxx"); IDatabaseConnection connection = DatabaseConnection(jdbcConnection); IDataSet dataSet = FlatXmlDataSet( File("c:\\CampusAccounts.xml")); try { DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet); } finally { connection.close; } }

主要片段主体演示了利用 DBUnit 功能是多么简单它显示了用于连接到 Oracle Database XE 数据库 URL这也是标准 Oracle JDBC 驱动名称 但是您需要在项目中添加个来自 DBUnit jar 文件和个库以编译代码首先您需要从 DBUnit zip 文件中提取 jar 文件从 Model 项目 Properties选择 Libraries/Add Jar然后将 DBUnit jar 文件添加到项目中通过从 Model 属性中选择 Libraries/Add Library您可以添加 Oracle JDBC 库该库包含 Oracle JDBC 驱动旦 jar 文件和库可用就可以使用 JDeveloper Alt-Enter 代码完成选项自动添加所需导入(确保导入了 java.sql.Connection)要运行该 Java 应用请在 Applications 窗口中选择该文件和绿色箭头旦连接创建(下步)就简单多了

第 1 阶段:创建模型

第 3 步:在创建模式的后创建 TopLink 对象关系映射(另请参阅 Oracle ADF 教程 1-8 和 2-2)在使用 TopLink 的前需要创建个连接选择 View/Connection Navigator(假如窗口未打开) 选择 New Connection _disibledevent=>
点击查看大图

假如您选择 Format 选项卡可以使用 TopLink 编辑器创建查询或输入查询要使用查询表达式创建器请选择 EXPression/Edit在创建器中选择 Add并将 Second Argument 更改为刚刚创建参数假如有其他参数则再次选择 Add创建器将自动创建个 AND 子句: 了解 Oracle ADF:入门举例(图 2)
系统会创建个默认 TopLink 会话对应于所创建连接您可以打开 sessions.xml 文件并通过在 Structure 窗口中选择 Default 来查看默认值更改诸如日志记录的类选项非常简单 第 4 步:创建 EJB 会话(另请参阅 Oracle ADF 教程 2-14)对于 Model选择 New/Business Tier/EJB/Session Bean无需更改默认设置除非不需要远程接口假如查看创建 Bean您将看到系统已经创建了可用于表行 merge、persist、refresh 和 remove 思路方法您还将看到系统已经为您创建每个命名查询创建了个思路方法EJB 向导自动生成 Java 代码会在该思路方法内创建个会话事务当然您不必编辑该代码并且现有思路方法文本也不会被覆盖(假如在重新生成 Bean 时它仍然是您首选项) 第 5 步:创建 ADF 数据Control控件(另请参阅 Oracle ADF 教程 2-16)ADF 数据Control控件为前面步骤中创建会话 Bean 和 DAO 提供了个接口在创建用于访问数据库用户界面Control控件时数据Control控件会提供“粘合剂”假如您从 View 菜单中打开 Data Control 选项板应该看到它是空白右键单击会话 Bean 并选择最后项:Create Data ControlData Control 选项板将填充有以下内容: 了解 Oracle ADF:入门举例(图 3)
为项目创建可用后端初步工作就完成了尽管诸如 ADF Control控件的类产物实际值在构建某些页面时才会显现出来但所花费精力的少仍然令人惊异

第 2 阶段:创建视图

第 6 步:使用 faces-config.xml 文件在首次打开应用打开 Web Content/WEB-INF 文件夹和所创建 faces-config.xml 文件假如由于某种原因尚未创建配置文件则右键单击 ViewController 项目并选择 New/Web Tier/JSF/JSF Page Flow & Configurationfaces-config.xml 默认名称是正确假如您选择 Overview 选项卡将看到配置文件空白视图: 了解 Oracle ADF:入门举例(图 4)
点击查看大图


在 JSF 应用该视图是进入中心配置文件重要窗口除了组描述用户如何在 Faces 应用中从个页面转换到另个页面 XML 元素以外还有用于 Bean 元素这些 Bean 包括在用户和界面Control控件(辅助 Bean)交互时其思路方法 Bean以及用于存储长久信息(如用户状态) Bean 第 7 步:创建导航图和对应页面(另请参阅 Oracle ADF 教程 3-2)现在需要页面(主要基于 SRDemo 中使用页面模板)以及描述用户如何从个页面转移到另个页面导航规则选择针对 faces-confix.xml 文件 Diagram 选项卡确保 Configuration 选项板处于开启状态然后将 JSF 页面拖到配置图上此时您已经在配置文件(而不是页面)中创建了个导航元素 双击无标题页面图标以启动个将实际创建文件向导将名称更改为 index;将文件后缀更改为 jspx(Oracle 普遍建议);确保系统没有自动公开该页面 UI 组件;然后移动 ADF Faces 组件、JSF 内核、ADF Faces 和 JSF Html 库选择您喜欢 HTML 版本 — 我们在 4.0.1 Transitional 版上运行良好 index.jspx 将重定向到应用实际第这是创建 Web 应用标准做法这可能会创造个糟糕先例但可以在 Source 窗口中查找 index.jspx并用以下 scriptlet 替换 f:view 标记注重您要创建个目录结构来治理页面 — 治理涵盖所有应用所有页面而名为 campusaccounts 子目录将用于保存该项目所有页面将 scriptlet 插入 index.jspx 文件的后您就可以安全地保存并关闭该文件了<jsp:scriptlet> response.sendRedirect("faces/administration/welcome.jspx"); </jsp:scriptlet>

从 Component 选项板中将另个 JSF 页拖到 faces-config.xml 图上双击图标打开向导以设置其 jsp 页面将名称更改为 welcome将文件类型更改为 jspx — 并确保设置目录以创建您希望创建任何子目录结构例如在本案例中我们将目录设置为 ../public_html/administration以便对应于 sendRedirect移动选项应该和创建 index.jspx 时所使用移动选项相同HTML 版本也应该相同 将内容添加到 JSP 页面实际上就是在 Diagram、Property Editor 和 Structure 窗口的间切换有时您甚至可以通过 Source 窗口编辑页面在 Structure 窗口中打开 faces 视图元素并删除默认 f:view 标记以便能够使用包含面板页以下文本替换它面板页是个复杂 UI Control控件它包含页眉、页脚、用于选择帮助全局Control控件以及版权部分等内容在使用该页时您将发现使用标准界面组件创建复杂页面是多么轻松粘贴文本最简单思路方法就是切换到 Source 窗口并确保游标跟随文件开头 3个 jsp 标记<f:view> <f:loadBundle basename="edu.uwec.financial.resources.UIResources" var="res"/> <af:document title="#{res['uacct.campusAccounts.title']}" initialFocusId="start"> <af:form> <af:panelPage> <!-- Page Content End --> <f:facet name="branding"> <af:panelHorizontal> <af:objectImage source="/images/banner.jpg"/> </af:panelHorizontal> </f:facet> <f:facet name="menu1"> <af:menuTabs var="menuTab" value="http://www.QQread.com/oracle/2006/12/#{menuModel.model}"> <f:facet name="nodeStamp"> <af:commandMenuItem text="#{menuTab.label}" action="#{menuTab.getOutcome}" rendered="#{menuTab.shown and menuTab.type'default'}" disabled="#{menuTab.readOnly}"/> </f:facet> </af:menuTabs> </f:facet> <f:facet name="menu2"> <af:menuBar/> </f:facet> <f:facet name="menuGlobal"> <af:menuButtons> <af:commandMenuItem text="#{res['uacct.menu.logout']}" action="GlobalLogout" immediate="true" icon="images/blafIcons/logout.g"/> <af:commandMenuItem text="#{res['uacct.menu.help']}" action="GlobalHelp" immediate="true" icon="../images/blafIcons/help.g"/> </af:menuButtons> </f:facet> <f:facet name="messages"> <af:messages/> </f:facet> <f:facet name="appCopyright"> <!--Copyright msg--> <h:panelGroup> <af:objectSpacer width="10" height="10" id="objectSpacer4"/> <af:panelHorizontal halign="center"> <af:outputText value="#{res['uacct.copyright']}"/> </af:panelHorizontal> </h:panelGroup> </f:facet> <f:facet name="appAbout"> <!-- The About this Application Link--> <af:panelHorizontal halign="center"> <af:commandLink text="#{res['uacct.about']}" action="GlobalAbout" immediate="true"/> </af:panelHorizontal> </f:facet> <f:facet name="infoUser"> <!-- Show the Logged in user --> <h:outputFormat value="#{res['uacct.connectedUser']}" rendered="#{userInfo.authenticated}" escape="false"> <f:param value="#{userInfo.userName}"/> </h:outputFormat> </f:facet> </af:panelPage> </af:form> </af:document> </f:view>


您将注重到 Structure 窗口中报告了这些将在下步中解决 第 8 步:不择手段地占为己有(另请参阅 Oracle ADF 教程 4-2)我们建议从 SRDemo 中借用几个文件以使您快速了解如何创建应用由于使用资源文件很简单我们决定始终使用它来标记所有 UI 组件甚至是按钮上很明显标记(如 Submit) 我们预计大部分内联网应用都没有国际化需求但这是个设计决策它创造了个较好先例我们还建议借用几个类(如 ADFUtils 和 JSFUtils)它们非常有用假如您必须通过 Java 代码访问 JSF 和 ADF 框架中存储变量则有点麻烦旦您了解 Oracle 使用绑定和命名标准就会觉得这些实用类十分简单举例如下导入图像文件夹也很有意义它包含了浏览器外观 (BLAF) 文件夹和界面中使用几个图标 我们导入文件思路方法是选择 ViewController 项目选择 File/Import/Java Source然后浏览到 SRDemo 项目中SRDemo 中完整路径和 mywork 位于同级别 — 参见 samples/SRDemo/UserInterface/src/oracle/srdemo/view将 ADFUtils 和 JSFUtils 添加到 util然后将它们复制到包结构中(我们在 src 文件夹中使用是 edu/uwec/financial/util);将 ResourceAdapter 和 UIResources 添加到 resources(我们使用是 edu/uwec/financial/resources);然后通过菜单(我们使用是 edu/uwec/financial/menu)添加 MenuItem、MenuModelAdapter 和 MenuTreeModelAdapter注重当您导入 Java 文件后可能需要修改包名称以匹配目录结构 您可以导入些标准图像思路方法是选择 File/Import/Web Source浏览到 UserInterface/public_html然后选择图像 — 确保将 images 文件夹复制到 public_html 文件夹中这个步骤有点麻烦在浏览时很轻易过于深入: 了解 Oracle ADF:入门举例(图 5)
此时jspx 文件中应该已经消失但可能需要修正面板页上元素例如要包含在 branding Control控件 (facet) 中所有图像假如您要将某个图像包含在页面顶部应将其作为 WebContent 导入 ViewController 项目 images 文件夹在 Structure 窗口面板页中选择 branding/panelHorizontal然后在 Properties 窗口中重设其对象图像您还应该确保页面上图标(如 logout 和 help)具有正确 Source 属性在 Property 窗口 Source 属性中选择每个图标和 ... 按钮并在 Source 窗口中查找图像您需要在 welcome.jspx 中编辑诸如 loadBundle 标记的类以便和包结构相匹配 举例属性文件项和 welcome.jspx 中引用属性不对应以下是我们添加名/值对集uacct.about=About MyBlugold uacct.copyright=\u00a9 2006 University of Wisconsin - Eau Claire uacct.menu.help=Help uacct.menu.logout=Logout uacct.menu.campusAccounts=Campus Accounts uacct.campusAccounts.title=Campus Accounts uacct.connectedUser=Logged in as <b>{0}</b>

ADFUtils 类没有编译它需要个库在 ViewController 项目上打开 Properties然后添加 ADF Model Runtime 假如您选择 index.jspx 并运行应用(选择绿色箭头)应该看到和以下类似内容 — 当然还包含标帜 了解 Oracle ADF:入门举例(图 6)
点击查看大图

实际上欢迎页面将为我们提供更加“全局”按钮(如 Help 和 Logout)您可以从任何页面选择它们 第 9 步:创建菜单部分将介绍从 SRDemo 中借用以创建菜单代码假如您希望该介绍简短些可以跳过该部分 治理顶层菜单所需标记和 Java 代码已添加至项目但需要在 faces-config.xml 文件中添加相关项以将其连接般而言JDeveloper 会提供所需项您也可以打开 faces-config.xml 文件并从 Overview 选项卡添加 Bean 定义种思路方法是通过 Source 窗口将以下举例复制到文件从而使用托管 Bean 元素作为项模型以获得类似 Bean(如 Bean 注释标记中所述)<!-- Global menu tab for logout (we also added a tab for help --> <managed-bean> <managed-bean-name>menuItem_GlobalLogout</managed-bean-name> <managed-bean->edu.uwec.financial.menu.MenuItem</managed-bean-> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>label</property-name> <value>#{resources['uacct.menu.logout']}</value> </managed-property> <managed-property> <property-name>icon</property-name> <value>/images/logout.g</value> </managed-property> <managed-property> <property-name>type</property-name> <value>global</value> </managed-property> <managed-property> <property-name>viewId</property-name> <value>/administration/Logout.jsp</value> </managed-property> <managed-property> <property-name>outcome</property-name> <value>GlobalLogout</value> </managed-property> </managed-bean> <!-- Campus Accounts menu tab (we also added tabs for Purchasing and Accounting) --> <managed-bean> <managed-bean-name>menuItem_CampusAccounts</managed-bean-name> <managed-bean->edu.uwec.financial.menu.MenuItem</managed-bean-> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>label</property-name> <value>#{resources['uacct.menu.campusAccounts']}</value> </managed-property> <managed-property> <property-name>viewId</property-name> <value>/administration/campusaccounts/CampusAccounts.jspx</value> </managed-property> <managed-property> <property-name>outcome</property-name> <value>GlobalCampusAccounts</value> </managed-property> </managed-bean> <!-- create the menu menuModel bean, _disibledevent=>
点击查看大图

第 10 步:创建第个输入页面个“有用”页面将是个答应用户输入帐号页面这是治理帐户打开 faces-config.xml 图并将个新页面拖至其上然后双击图标对该页面进行编辑 在本例中我们希望为校园帐户 (campusaccounts) 创建另个组织级别因此在 /administration/campusaccounts 中创建了 choose.jspx(在 public html 的后添加 administration\campusaccounts)我们决定让 JDeveloper 在第 2步中创建托管 Beanchoose.jspx 辅助 Bean 将自动命名为 Choose.java并包含每个用户界面组件这意味着您在每次添加组件时(即便是如 spacer 般简单组件)它都会通过自己 getter 和 ter 显示为个域对于编写 Java 代码以更改 spacer 中属性大小(如高度)来说这十分有意义然而还是会因此创建出复杂辅助 Bean在本例中从自动创建辅助 Bean 开始要更为简单些(假如我们希望了解它执行操作) 使用 Structure 窗口替换为 welcome.jspx 中 view 标记实质上您已将欢迎页面用作模板在 choose.jspx Structure 窗口中您可以删除 view 标记然后将 view 标记从 welcome.jspx 复制并粘贴到 choose.jspx 中假如您选择在 Source 窗口中进行更改请注重保留指示 jspx 具有辅助 Bean html 注释 — 该 Oracle 惯例如下所示:<!--oracle-jdev-comment:auto-binding-backing-bean-name:backing_administration_campusaccounts_choose-->

向在 GlobalCampusAccounts 上指定导航规则 faces 配置文件添加导航规则界面将导航至应用个页面这是个全局规则您可以通过在任何应用任意位置选择 CampusAccounts 选项卡来更改为 CampusAccounts在 faces-config.xml 中输入标记是<navigation-rule> <navigation-> <from-outcome>GlobalCampusAccounts <to-view-id>/administration/campusaccounts/choose.jspx </navigation-> </navigation-rule>

您可能需要编辑 commandMenuItems 中 logout 和 home 图标属性并更改它们图标值以使用 blaf 文件夹中 g 文件 您需要将 PanelHorizontal 插入面板页以保存输入文本组件尽管也可以使用组件选项板 (Component palette)但通常我们认为利用 Structure 页来执行该操作更为简单(右键单击 PanelPage 元素并选择 ADF Faces Core 组件即可)注重ADF 表单包含有 PanelPage因此您已经具有了自己 html 表单元素向水平面板添加个 InputText 组件在 Properties 窗口中更改标签以使用存储在资源文件中属性种简单思路方法是先编辑资源文件并添加属性然后在 Structure 窗口中双击 inputText 元素选择 Bind 在 JSF 对象中查找 res并选择您刚才输入属性值旦您习惯了访问资源所需 EL 格式就会发现在 Property Editor 中键入属性值也很简单在水平面板上输入文本组件后面添加个 CommandButton并更改其名称以使用资源文件中定义个属性 — 再次建议您使用 Structure 窗口 双击按钮转至辅助 Bean您需要从 InputText 组件获取文本并将其置于用户状态以便当用户访问 CampusAccounts 应用选项时它始终可用public String commandButton1_action { Object text = getInputText1.getValue; UserState.storeCurrentAcctNum( Integer(acctNum)); "list"; }

注重此处无需任何验证而您在使用 Faces 组件选项时会进行不必要验证假如您在 InputText 元素上设置必需属性则会强迫用户输入值假如您在 InputText 标记内插入个 ValidateRegExp 验证并添加模式 [0-9]+则会要求用户至少为帐号输入位数字
在本例中我们添加了来自 SRDemo UserState以将其用作模型并创建用于保存帐号静态我们还必须添加 userState(u 为小写) 作为 faces-config.xml 文件中托管 Bean 名称您可以通过 managed-bean- 域来推断我们使用包名JDeveloper 治理 faces-config.xml 文件明显特征的假如在编译代码或指定包名时出现问题您就会在其标记中看到警告JDeveloper 会主动分析 xml 配置文件<managed-bean> <managed-bean-name>userState</managed-bean-name> <managed-bean->edu.uwec.financial.view.backing.UserState</managed-bean-> <managed-bean-scope>session</managed-bean-scope> </managed-bean>

以下是 UserState 起始代码用于创建 Command 按钮中使用静态;它将替代所有来自 SRDemo 域和思路方法记住检查包名:private HashMap _tings = HashMap; private final String CURRENT_ACCT_NUM = "CURRENT_ACCT_NUM"; public Integer getCurrentAcctNum { (Integer)_tings.get(CURRENT_ACCT_NUM); } public void CurrentAcctNum(Integer acctNum) { _tings.put(CURRENT_ACCT_NUM, acctNum); .out.prln("CurrentAcctNum:"+acctNum); // some old fashioned testing } public void storeCurrentAcctNum(Integer acctNum) { JSFUtils.ManagedBeanValue("userState.currentAcctNum", acctNum); } public void retrieveCurrentAcctNum { JSFUtils.getManagedBeanValue("userState.currentAcctNum"); }

该代码比较奇异userState.currentAcctNum 似乎是 UserState 中某个域引用但这个名称没有域JSFUtils.getManagedBeanValue 参数被解析为 getter;因此userState.currentAcctNum 将导致对 getCurrentAcctNum 进行 假如运行 index.jspx 并选择 CampusAccounts 选项卡您应该看到应用页面将如下所示: 了解 Oracle ADF:入门举例(图 8)
点击查看大图

第 11 步:创建第个 ADF 数据Control控件(另请参阅 ADF 教程 5-2)这步布满了乐趣并且 ADF 价值将在这步真正体现出来创建了答应用户输入帐号页面后您现在希望获取所有和该帐号关联交易 — 文件上所有存款和支出 在 faces 导航图中创建个名为 /administration/campusaccounts/list.jspx 页面并在编辑 list.jspx 时自动公开 UI 组件复制来自 welcome.jspx view 标记如第 9 步中执行操作 您需要连接列表页以显示 Detail 表(或 Detail DAO具体取决于您如何考虑)中相应行请牢记ADF 数据Control控件是构建 ADF 应用要害因此请打开 Data Control 选项板 了解 Oracle ADF:入门举例(图 9)
您可以将 findAccountTransactionsByAccount 拖放到列表页 — 在这种情况下您能够创建诸如 Command 按钮或参数表单的类组件 而将 Detail 拖放到 panelPage 将创建组可以从 Detail 表显示行 — 这些行具有个通用帐号考虑到在这种情形下个较长组件列表比较有用因此选择 Tables/ADF Read-only Table...Action Binding Editor 将显示因此您需要从选择页面获取为帐号存储并将其作为要用于 findAccountTransactionsByAccount 值进行绑定: 了解 Oracle ADF:入门举例(图十)

现在显示所有域并启用选择和排序功能您还可以通过在 Structure 窗口中双击每来编辑列属性以有选择地启用/禁用排序功能并更改列标题在本例中我们向资源文件添加了列标题然后将 HeaderText 绑定到引用如 #{res['uacct.campusAccounts.account']}(您还可以通过在 Structure 窗口中双击组件来重置表选择Control控件中文本)我们发现 Bind 按钮比较有用 假如运行该应用并输入个有效帐号您希望看到内容将如下所示: 了解 Oracle ADF:入门举例(图十)
点击查看大图

假如输入 1000 作为帐号您会发现自己仍位于选择页面您需要指定个从选择页面到列表页面转换在 faces-config.xml 文件中打开 Design 窗口并确保 Component 选项板可见选择 JSF Navigation Case然后单击选择页面和列表页面(请按此顺序操作)编辑转换标签并将 success 更改为 list从而和 Choose.java 中 Command 按钮操作返回值相对应现在数据将显示在列表页面中 注重显示这个表(包含 Detail 数据库表中项)是多么轻松界面组件是个 ADF JSF 组件因此可以说您免费获得了包括各种功能在内复杂显示对象如分页(总共 33 行结果次打印 10 行假如结果全部匹配可以次打印全部 33 行)、分层(每行具有种区别颜色)、排序以及通过单选按钮选择单个行能力(例如能够编辑其中内容)这个页面外观使用默认 Oracle 外观但是更改用于指定组件标签 Css 文件可以获得区别颜色、字体和图标 此外您还会注重到利用 ADF 提供复杂数据Control控件可以十分轻松地实现数据访问在将 ADF Read-Only 表拖放到页面的后系统会推断返回辅助对象类型 (Detail.java)并自动将其用于创建相应列系统提供了行集行为(次 10 行)正如基于派生自原始数据库表元数据类型解析 第 12 步:创建编辑页面(另请参阅 Oracle ADF 教程 10-2)在列表页面上用于选择 Table Control控件 (facet) 包含个 af:tableSelectOne 标记该标记内部有Command 按钮假如双击 Command 按钮将打开辅助 Bean您可以在其中辅助来获取数据以唯标识选定行以便将其存储以用于下页面检索public String commandButton1_action { CurrentTransactionIdFromRow; "edit"; }

List.java 中辅助如下所示: private void CurrentTransactionIdFromRow { FacesContext ctx = FacesContext.getCurrentInstance; JUCtrlValueBindingRef tableRowRef =
(JUCtrlValueBindingRef) this.getTable1.getRowData; Integer transId = (Integer)tableRowRef.getRow.getAttribute("cdPostSequence"); UserState.storeCurrentTransId(transId); }

需要将 storeCurrentTransId 添加至 UserState以便将第 9 步中 storeCurrentAcctNum 用作模型 到目前为止已经介绍了选择要编辑行所需进行更改现在需要创建个要在其中进行编辑新 jspx 页面在 faces-config.xml 文件中添加个 jsp 页面然后对其进行编辑以命名为 edit.jspx在 Component 选项板中选择 JSF Navigation Case并在 Design 窗口中将转换标签更改为编辑以匹配 Command 按钮中指定返回值 转到 edit.jspx 页面从 Data Control 选项板中选择 findOneTransaction/Detail并使用 Forms/ADF Form 将其拖放至面板页在其中包含Submit 按钮并更改域顺序(假如需要)将参数设置为 JSF 对象中以使用 UserState 中 acctNum 和 transId完成操作绑定的后您可以将不希望用户编辑 readOnly 属性设置为 true在 Structure 窗口中双击每个 inputText 域然后从资源文件设置它们标签首先在资源文件中编辑值要更为简单答应用户从编辑页面退出可能是最好做法因此您可以用 PanelGroup 围绕 Submit 按钮然后在 Submit 的前或的后添加另个 CommandButton您需要选择这些按钮并添加返回值对于 Cancel 按钮无需和该按钮对应辅助就可以编辑 action 属性并指定导航转换值Cancel 按钮些原始内容(如“cancel”)将生效在 faces-config.xml Design 窗口中添加个用于提交返回值 jsf 导航举例以便从编辑页面返回列表页面种比较好思路方法是首先在 faces-config.xml 文件中设置导航值在这种情况下选择这些按钮 action 属性值时该值将显示为选项 — JDeveloper 使用配置文件比较有利
您仍然需要编写代码来保持在编辑页面上所作更改但在本举例中您将再次使用 ADF 开发范例换言的和其在辅助 Bean 中编写代码不如依靠 JDeveloper/ADF 向导来编写保持更改所需代码您还将使用在最初创建 ORM 并生成会话 Bean 时自动创建 mergeEntity 如 ADF 教程第 10 章所建议在 edit.jspx 页面上打开 Design 窗口然后打开 Data Control 选项板将 mergeEntity 思路方法拖放到 Submit 按钮上并选择 Bind Existing CommandButton个显示页面是 Action Binding Editor 双击向导下步中值框(或假如 ... 按钮显示选择该按钮)打开 ADF Bindings 中绑定请牢记该绑定引用 ADF 中提供所有绑定打开 findOneTransactionIter 节点并选择 currentRow 中 dataprovider构建表达式(指定当前记录)是 ${bindings.findOneTransactionIter.currentRow.dataProvider}注重Submit 按钮 ActionListener 属性已重置为 #{bindings.mergeEntity.execute}可将 action 属性设置为“list”以便完成对数据库更改后我们界面将返回到列表页面将其值可进行更改所有文本域 immediate 属性设置为 true编辑页面应如下所示: 了解 Oracle ADF:入门举例(图十 2)
点击查看大图

此外ADF 可以非常轻松地添加编辑事务功能虽然此处未提及但您还可以向会话 Bean 添加另以便在 mergeEntity 的前将业务规则应用到编辑域 (Apply Business Rules to Edited Field)

适可而止

还有许多演示无法全部囊括在本次练习中但您仍可以通过教程或开发人员指南来完成:
  • 您没有为应用添加任何安全措施以确保只有签名信息库中用户可以添加记录(或编辑记录)简单安全性将答应您打印用户名而不是空值
  • 您没有处理或非凡条件
  • 您没有使用 ADF 验证功能例如确保输入文本框在用户输入新交易时不为空就比较有意义
  • 添加个选择以答应用户从交易列表删除存款或支出这样比较有趣
但是您必须适可而止!

感谢并整理总结

我们衷心感谢 JDeveloper 团队(Team)就本文中有关 JDeveloper 功能语句精确性进行了检查Oracle 文档具体列出了许多此处未提及 JDeveloper 特性 正如我们在介绍中所述在您已经熟悉了某种特定开发思路方法后很难再转而使用另种技术本文中我们使用了 Spring JDBC 模板进行数据建模、利用 Spring MVC 和 Spring Web Flow 进行导航以及将 Eclipse 用作开发环境回想起来开始我们是希望了解如何在新环境中做我们已经知晓事情而选件(如辅助 Bean)则助了我们臂的力最初我们没有打算尝试 TopLink甚至寻求另种思路方法来使用 ADF Control控件值得兴奋我们阅读了 Oracle 参考这些参考使我们对于尝试 ADF 提供其他功能布满了信心 对于应用开发框架而言ADF 无疑是个卓越工具、个不错助手我们力图通过 ADF 和 JDeveloper 探索出若干其他思路方法包括
  • 使我们现有基于 Spring 后端服务能够用作可从 ADF Faces 接口 Web 服务Oracle ACE Lucas Jellema 撰写网志给予了我们尝试这种想法灵感
  • 使用 Oracle XML Publisher 作为构建报表页面种思路方法
  • 将 BPEL 插件用于 JDeveloper以根据业务流程中人为干预需要进行建模据说BPEL 的于流程治理正如 SQL 的于数据治理
Oracle 提供开发工具系列可以很好地满足我们需求

提示和窍门技巧

  1. 不做 2不休文中数次提及其当的无愧个事实是:JDeveloper 和 ADF 是功能强大端到端解决方案它们具有挑战开发环境(如 .net)实力例如我们最初计划不使用 TopLink 将举例应用放在并认为在应用中编写基于 Spring 数据访问很轻松阅读 ADF 教程激发了我们对 TopLink 好奇因此我们决定尝试使用它并在开始时只是认为这是无害在为交易添加第个列表表单花费了大约 90 秒后我们态度发生了根本性转变最初mergeEntity 似乎只是由 TopLink 创建个产物在添加了编辑页面的后我们了解了其价值以及可对 Faces 组件进行无缝访问 ADF Control控件价值JDeveloper 提供了集成开发环境ADF 不仅是组 UI 组件还是个完善前端、后端框架可提供能够显著提高工作效率工具

  2. JDeveloper 和 Eclipse 或 Websphere Application Developer 在创建包、复制和移动文件方面存在着区别对于图像和其他非 Java 文件我们发现复制和移动文件最简单思路方法是在 Windows Explorer 中进行操作然后在 Applications 窗口中进行刷新使用 File 中 Import 选项时请确保编辑 CopyTo 行以将完整文件夹(包)名包括在内重命名文件和移动文件还会对配置文件和属性值造成重大破坏我们般使用 Property Editor 中 ... 选项来设置图像和其他文件属性值编辑配置文件需要敏锐眼光和耐心我们可能犯最严重就是在 faces 配置文件中将 campusAccounts 更改为 campusaccounts页面的间不会出现转换从而浪费了大量时间诚然使用 JDeveloper 时保持确令人烦躁


  3. 下载 SRDemo 非常简单假如您刚好安装了 JDeveloperHelp 菜单中选择 Check for Updates然后选择 Official Oracle Extensions选取 ADF SRDemo并按向导完成相应操作要运行它请转至 SRDemo 应用并选择 index.jspx 和绿色箭头旦下载了演示您就可以访问其全部文件包括几乎所有应用都需要帮助类(如 JSFUtils 和 UserState)您需要为 SRDemo 提供数据库模式

  4. 您不必离开 JDeveloper 就可查看数据库表从 Connections 选项卡中选择您 Connection 和模式然后打开个表表值将显示在 Data 选项卡(可能位于窗口底部)中

Tom Moore 是威斯康星大学伊奥克莱尔分校高级顾问专攻知识和技术服务Tom 持有威斯康星大学密尔沃基分校计算机科学硕士学位热衷于 Java 和开放源代码产品(如 Struts 和 Spring)在他将注重力转向 Oracle 开发工具和框架的前已是威斯康星大学伊奥克莱尔分校计算机科学系老成员

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: