ADF Insider Oracle ADF Insider — 在线了解 Oracle ADF



本页面提供的专题讲座录像将帮助您快速掌握 Oracle ADF。Oracle ADF Insider 基础系列将向您介绍 Oracle ADF 的核心功能及该框架的各个层。ADF Insider 必读系列将演示构建 ADF 应用所需的基本技能、技巧和方法。Oracle ADF Insider 进阶系列涵盖 Oracle Application Development Framework 的高级主题和技巧。定期查阅专家的更新。
 
 

Oracle ADF Insider 基础

   
Oracle ADF 简介
了解 ADF 的方方面面,了解 ADF 在 Oracle 融合架构中的定位、它提供了哪些解决方案以及如何简化应用开发。
Oracle ADF 业务组件简介
Oracle ADF 业务组件可帮助开发人员轻而易举地创建与关系数据库交互的可重用业务服务。了解 Oracle ADF 业务组件提供的架构和特性。
Oracle ADF Faces 组件简介
Oracle ADF Faces 提供了一组支持富 Ajax 的组件,这些组件可简化 Web 用户界面的创建。概要了解 Oracle ADF Faces 框架的各组件和内置功能。
Oracle ADF Mobile 简介
Oracle ADF Mobile 让您可以开发可在 iOS 和 Android 设备上运行的设备上移动应用。了解组成 Oracle ADF Mobile 的架构和组件以及它如何简化移动应用开发。
JDeveloper IDE 指南
这是快速的“别慌”指南,介绍了 JDeveloper IDE 的基本特性,包括窗口操作和开发人员要使用的 6 个核心窗口。
JDeveloper IDE 编辑器指南
JDeveloper IDE 编辑器中丰富特性的实战指南,讨论可帮助程序员更快地定位和编辑代码的特性、免于键入和纠正拼写错误以提高生产效率的工具、保持代码整洁以便于整个团队阅读代码的特性,以及在大型代码库中移动而不迷失的导航功能。
 
 

Oracle ADF Insider 进阶

   
深入了解 ADF 绑定 — 第一部分
了解 ADF 模型层工作原理、数据控件及绑定的概念。在这个 ADF Insider 的第一部分中,您将了解数据控件、绑定层以及用于将业务服务绑定至 UI 控件的各种文件(如 DataBindings.cpx、PageDef.xml)。
深入了解 ADF 绑定 — 第二部分
在这个 ADF Insider 演示文稿的第二部分中,您将了解如何在运行时访问 ADF 模型绑定。了解何为 BindingContext、BindingContainer 以及将要使用的其他常用方法。了解如何使用 EL 和 Java 访问 AttributeBinding、OperationBinding 和 JUCtrlListBinding。
ADF 任务流 — 概述(第一部分)
这段 90 分钟的录像介绍了 ADF 无界和有界任务流的概念,以及其他 ADF 控制器特性。本专题讲座首先概述了无界任务流、有界任务流和开发人员构建复杂应用流时所需的不同活动。本文是由两部分组成的系列的第一部分,还介绍了异常处理和向导导航模型。本录像还以开发一个示例应用为例,全程指导观众构建无界和有界任务流。本专题讲座将在第二部分中继续。
ADF 任务流 — 概述(第二部分)
本专题讲座时长 75 分钟,接着第一部分完成了示例应用,指导观众完成无界和有界任务流开发的不同方面。在本录像中,介绍并演示了内存范围、保存以供稍后使用、在对话框中打开任务流以及远程任务流调用。如果您是首次接触 ADF 任务流,建议您先观看本系列的第一部分,以便跟上示例应用指导的说明。
ADF 应用安全性
ADF 安全性是 Oracle ADF 中的身份验证和授权框架。这个专题讲座从根本上阐释了 ADF 安全性。首先讨论容器管理的安全性、JAAS 以及它们在 ADF 安全性中的定位。然后讨论如何通过 ADF 安全性架构、Oracle Platform Security Services (OPSS) 和 WebLogic 安全平台进行身份验证。讨论的主题包括授权、页面保护、任务流保护以及 ADF 为 EL 提供的安全表达式。
将支持 ADF 安全性的应用部署到独立 WebLogic 域 — 第一部分
在本系列的第一部分,您将了解如何使用 Oracle FMW Control 将应用打包成 ear 文件、启动 Oracle WebLogic Server 域以及 Oracle Internet Directory (OID)、设置 OID 身份验证程序、设置 jdbc 数据源和部署 ADF 应用。
将支持 ADF 安全性的应用部署到独立域 — 第二部分
本专题讲座是第二部分,接着本系列的第一部分介绍如何将应用角色映射到 OID 组并测试应用、在运行时更新角色权限,并使用不同的安全相关设置重新部署应用。
使用 Oracle Access Manager 11g 对 ADF 应用启用 SSO
在本专题讲座中,您将了解如何使用 Oracle Access Manager 11g 在 ADF 应用中启用 SSO。具体来说,您将了解 Oracle HTTP Server 11g (OHS)(作为 Oracle WebLogic Server 的反向代理)的安装过程、Oracle Access Manager 11g (OAM) Web Gate 在 OHS 中的安装过程,然后通过 OAM 启用 SSO。
Oracle ADF BC 应用模块池
Oracle ADF 业务组件应用模块池参数是 ADF 应用中很难理解的一部分,但它们对生成可扩展的应用至关重要。这组视频将就如何配置参数、参数设置的影响等方面深入指导开发人员,旨在构建一个成功的 ADF 应用。这个视频系列采用了渐进式的学习方法,介绍 AM 池及其设置。建议新观众从头到尾观看整个视频系列,以确保了解全套概念。
在 ADF 应用中使用 Groovy
Groovy 是一种类似于 Java 的脚本语言,可帮助您极为灵活地构建 ADF 应用。在此 ADF Insider 中,您将了解如何在 ADF 业务组件中使用 Groovy 定义默认值、验证和动态错误消息。
ADF Faces 换肤
借助 ADF Faces 中的换肤功能,应用开发人员无需修改应用本身就能更改应用的配色方案。要设计皮肤,开发人员使用 trinidad-skins.xml 文件中引用的级联样式表 (CSS) 并在 trinidad-config.xml 文件中进行配置。这个专题讲座讨论换肤的工作原理,包括皮肤选择器和它们的使用。
在 Oracle ADF Faces 中使用 JavaScript
ADF Faces 为开发人员提供了一种面向组件的客户端 JavaScript 架构,该架构为各种浏览器提供一致的开发环境。这个专题讲座讨论 ADF Faces 的服务器和客户端架构,以及开发人员如何在自己的 ADF Faces 应用中使用 JavaScript。还讨论了客户端监听器、服务器监听器(对服务器的 Ajax 调用)以及 Java 对客户端的调用。
ADF 页面模板和声明式组件
了解如何使用页面模板和声明式组件为 ADF 应用页面构建一致的外观。在这个专题讲座中,您将了解如何使用模板 facet 定义模板中的内容区域,以及如何使用属性控制模板的各种特性,如初始布局。您还将了解如何构建可重用的组合组件。
深入了解 SOA 与 ADF 集成
Oracle ADF 已经与 Oracle SOA Suite 实现了内置集成。在这个专题讲座中,我们将介绍如何向 SOA 用户公开业务服务,以及如何在 ADF 应用中集成 SOA 流程。
ADF 区域交互 — 概述
这个专题讲座讨论用于区域间通信的大多数选项。首先简要讨论如何通过有界任务流来构建区域,然后通过幻灯片和示例进行详细介绍。介绍了以下交互:上下文事件、区域中的队列操作、输入参数和 PPR、拖放操作、共享数据控件、父操作和区域导航监听器。
ADF 区域交互 — 上下文事件
上下文事件是实现区域间通信的一种功能强大的解决方案,可用作父视图与其所含区域以及各区域之间的通信渠道。这个专题讲座讨论如何设置上下文事件、如何定义生成器和事件监听器以及如何定义负载消息。还通过一个实际示例向开发人员展示了构建流程。
使用 Oracle ADF 内部 API 时的一些典型错误 — 第一部分
这个专题讲座重点讨论开发人员在使用 Oracle ADF 绑定层和 ADF 控制器(任务流)时所犯的典型错误。还通过一些示例说明了如何避免这些错误以及在 Oracle JDeveloper 11g 中使用 ADF 的正确方法。
使用 Oracle ADF 内部 API 时的一些典型错误 — 第二部分
本系列的第二部分重点讨论表达式语言方面存在的问题,同时重点介绍 ADF Faces 和 JavaScript 的使用。开发人员将了解优秀实践以及要避免的隐患。
团队开发项目的考虑事项
这个专题讲座讨论团队开发的诸多方面,包括如何为开发项目建立团队的资源以及如何在团队环境中使用源代码控制信息库。此外,还将概要介绍 Team Productivity Center 的特性。最后,还将讨论重用代码的一些注意事项,包括设置业务组件和使用 ADF 库分发共享代码的优秀实践。
使用 Oracle JDeveloper 和 Oracle ADF 重新开发 Oracle Forms 应用
许多开发 ADF 应用的客户可能希望重新实现原来使用 Oracle Forms 构建的应用。在本演示文稿中,您将了解重新开发的选项,并观看如何根据一个重新开发的案例研究重新实现 ADF 中的常用 Forms 特性的演示。
构建极具视觉冲击力的 Web 2.0 数据仪表盘
本专题讲座将介绍如何通过以可视化方式向用户呈现数据将数据转换为信息。您将了解如何将简单查询转换为强大的图表、地图、数据透视表及其他动态图形表示。
Oracle ADF 提供了一种机制来实现日志记录信息,通过查看日志记录信息可以帮助调试
本演示文稿介绍如何使用 ADFLogger 和仪表盘查看日志记录信息。
构建用户界面
本专题讲座介绍了使用 ADF Faces 开发布局的过程。讨论了原型设计策略,包括 ADF 自己的占位符数据控件。讲座的其余部分详细介绍了 Faces 布局组件,重点介绍了其使用方法,并举例说明了各组件在各种场景下可能的工作方式。最后,演示了如何使用布局组件定义嵌套 ADF Faces 内容的显示方式。
概述:ADF UI Shell
除了 Oracle JDeveloper 11g ADF 基本培训之外,开发人员还需面对大量向用户呈现丰富应用的选项。按钮、滑块、图形等等。但这些都不能单独构成一个应用或产生用户体验;应用如何将它们组成一致的外观、应用如何安排流程、如何在应用中导航?本专题讲座将介绍 Oracle 的 ADF UI Shell(即动态选项卡 Shell),这个页面模板、导航控件以及应用解构的的工作组合将 11g ADF 应用的众多部分合成一个生动的应用体验。
使用 Apache JMeter 加载测试 ADF 应用
Apache JMeter 可用于对 ADF 应用执行性能、负载和压力测试。但 JMeter 不是智能的,无法理解 ADF 应用,因此需要仔细配置来处理 ADF cookie 和 HTTP 状态变量。本演示文稿介绍了如何配置 JMeter 执行 ADF 测试,演示了一个现场压力测试,并重点介绍了一些可能导致您创建的测试中断的故障。
没有通用的方法:Oracle ADF 架构基础
使用 Oracle Application Development Framework (Oracle ADF) 的从业人员将很快意识到,没有一种通用的创建 Oracle ADF 应用架构的方法。系统所面临的独特挑战和要求会给最终构建的解决方案产生重大影响。本演示文稿抛开 Oracle ADF 的具体细节,介绍您需要进行的一些早期决策,以及为满足您的要求,您可以选择哪些架构。
在 Oracle ADF 中集成 SOAP 和 REST 服务
Oracle ADF(作为服务提供程序)与 SOAP 和 REST 服务(作为服务客户端)集成。本 ADF Insider 专题讲座介绍了从 ADF 访问远程 SOAP 和 REST 服务的可用选项,以及与其相关的优秀实践。本专题讲座的第二部分介绍了让 SOAP 和 REST 客户端可以访问 ADF 业务组件模型的可用选项。将 ADF BC 作为服务提供程序公开,您可以支持从 Web、SOA 和 ADF 移动客户端等多种通道访问业务逻辑和数据。
从现有 ADF 应用构建 Web 服务
您编写的每一行新代码都可能有错误。而且,向现有应用中添加的每行代码还会降低 ROI。另一方面,如今服务集成的重要性更胜往昔。移动应用需要与业务线应用深度集成,以发挥其真正的潜力。您是否知道可以利用已有的 Oracle ADF 应用构建 Web 服务?在本演示文稿中,Frédéric Desbiens 介绍了如何通过重构 Summit ADF 示例应用从现有 ADF 应用构建 Web 服务,并讨论了各种必不可少的技术选择。
使用独立的 WebLogic Server 实例
您可以使用 JDeveloper 和 Oracle Enterprise Pack for Eclipse (OEPE) 这两种优秀的 IDE 开发自己的 ADF 应用。您是否知道这两种 IDE 均可使用独立的 WebLogic Server 实例,而非集成实例?在本专题讲座中,您将了解如何安装这种实例以及它为您提供的好处。您还将了解如何配置自己喜爱的 IDE 使用独立的 WebLogic 实例。
构建高性能 ADF 业务组件应用
本视频可让您了解 ADF 业务组件的工作原理,以及如何使用该框架的各种参数和特性确保构建高性能、可扩展的 ADF 业务组件应用。
ADF Mobile Insider — 从 ADF Mobile 应用调用 REST 服务
REST 服务是一种从移动应用与服务器端业务逻辑通信的主要机制。在此 ADF Insider 中,您将了解如何从 ADF Mobile 应用调用 REST 服务。
向 ADF Mobile 应用添加图表
本 ADF Insider 视频介绍如何使用 DVT(数据可视化工具)图形和图表让 ADF Mobile 应用变得生动起来。
避免 JSF 和 ADF 请求中断
Web 应用中的请求生命周期定义了传入请求在响应返回请求客户端之前需要经过的各个步骤。JavaServer Faces 知道读取、插入、更新和删除表单数据以及处理导航所需处理的 6 个生命周期步骤。由于 Oracle ADF 与 JavaServer Faces 生命周期无缝集成,因此了解生命周期就成了每个 ADF 应用开发人员的一项重要技能。本专题讲座介绍 JavaServer Faces 的整个生命周期,以及 ADF 如何融入其中。本专题讲座然后继续讨论了三个流行的用例,介绍了专家对生命周期行为的看法,以及为避免开发人员遇到挫折而必需的生命周期操作。请注意,本专题讲座中所含信息并不易于消化,您可能需要安排观看两次。
了解 JDeveloper 12c 中改进的 Apache Maven 支持
Oracle 已通过 JDeveloper 12c 显著改进了对 Apache Maven 的支持。不仅有新的 POM 文件编辑器,还有适用于 ojmake 和 ojdeploy 的 Maven 插件。了解这些新特性,并了解如何创建新的支持 Maven 的 ADF 应用,以及向现有 ADF 应用添加 Maven 支持。如果您不知道何为 Maven,本 ADF Insider 将介绍 Maven 的基础知识以及一些更高级的特性。
Oracle Diagnostic Log Analyzer — ADF Request Analyzer 和 JSF 生命周期
在本 ADF Insider 中,我们研究了 ADF Request Analyzer,JDeveloper 的 Oracle Diagnostic Log Analyzer 中的这个工具旨在帮助您了解程序的运行时行为,包括深入了解 JSF 和 ADF 生命周期。ADF Request Analyzer 因此成为一种优秀的调试辅助工具,可帮助开发人员构建 ADF 应用。
 
 

Oracle ADF Insider 必读

   
 

ADF 业务组件

使用 ADF BC 创建 RESTFul Web 服务
您可能经常需要创建 RESTful Web 服务,并希望从其内部调用 ADF BC 逻辑。遗憾的是,应用模块的服务接口目前仅限于 SOAP。这可以通过结合使用 JAX-RS 实现的自定义代码来实现。
以编程方式迭代访问视图对象的所有行
以编程方式访问视图对象中的所有行的常见用例。本 ADF Insider 必读演示了具体实现方式。
构建依赖值列表
了解如何使用 ADF 业务组件的声明式特性构建依赖值列表,依赖值会根据另一个属性值自动限制自己值的选择。
在 ADF 应用中实现序列
大多数(如果不是所有)基于数据库表的 ADF 应用都必须为唯一主键属性值分配序列号。了解如何在 ADF 业务组件中实现这一操作。
通过资源权限扩展 ADF 框架的安全性
本示例介绍如何使用 ADF 安全性中的 OPSS 资源权限保护实体属性,防止其在新建实体行时被更新。
以编程方式访问视图条件
视图条件让您可以在视图对象上定义参数化筛选器。本 ADF Insider 必读系列介绍如何从代码应用、删除和附加视图条件。
根据值将行设置为不可编辑
在本 ADF Insider 必读系列中,您将了解如何根据另一个字段或属性的值将一行数据设置成不可编辑。
ADF BC 模型驱动的 LOV 切换器
在本 ADF Insider 必读系列中,您将了解模型驱动的值列表特性,其中 LOV 定义可以在运行时切换。这通常是由相关视图对象属性中的数据触发的。
从不同 EO 中的属性引用默认值
在本 ADF Insider 必读系列中,您将了解如何将一个属性的默认值设置为由另一个实体对象填充的值。例如,一个订单项价格的默认值设置为产品的建议批发价。
实现总计
在应用中,您通常希望显示特定属性的总和或总计,例如一个部门的总薪酬。在本 ADF Insider 必读中,您将了解如何使用 Groovy 表达式实现。
构建测试 ADF 业务组件的测试客户端
ADF 业务组件可以在 ADF 模型测试器或简单的 Test Client 类中测试。这些 Test Client 类可以用于常规视图对象,或者设置和使用绑定变量和视图条件。本 ADF Insider 显示如何使用模板编写类并设置所有相应的组件值。
将 ADF 业务组件视图对象基于多个实体对象
表中充斥了对用户几乎毫无意义的外键。通常我们希望将其他表里包含更有意义值的字段显示给用户,如果用户更改外键,查询值将立即更改。本演示文稿将介绍如何创建基于多个实体对象的 ADF 业务组件视图对象:可更新的实体对象和引用查询实体对象。
检索 ADF BC 属性以前的值
有时,我们将需要显示 ADF BC 属性以前的值,甚至创建一条需要比较某个属性的新旧值的业务规则。在本 ADF Insider 必读中,您将了解如何轻松完成这一工作。
   
 

ADF 模型

使用 Java 访问 ADF 绑定层
在托管 bean 中编写代码时,您可能希望访问属性值或执行方法调用。本 ADF Insider 必读向您介绍如何从托管 bean 中访问 ADF 绑定。
保持树控件与详细数据同步
本 ADF Insider 必读介绍如何在 UI 树组件中选择一个节点使其数据自动与表单同步。关键是使用 EL 指示应刷新哪个迭代器。
如何通过与更新模型所用数据控件不同的数据控件填充 af:selectOneChoice 组件
本 ADF Insider 必读介绍如何创建动态列表来填充 af:selectOneChoice 组件。还介绍如何通过与构建托管单选组件的可编辑表或表单所用的数据控件不同的数据控件来填充列表。
   
 

ADF 控制器

在任务流中传递数据
在任务流中,您可能希望引用任务流的另一个活动中设置的数据或值。本 ADF Insider 必读介绍如何在任务流中传递数据。
   
 

ADF Faces

使用 ADF Faces 切换组件构建 UI 布局
有时,您可能希望动态切换页面的某个区域以显示不同的 UI 组件。本演示介绍如何使用 af:switcher 动态更改 UI 布局。
使用 selectOneRadio 为存储与显示内容不同的值
对于 OrderFilled(Y 或 N)这样的二进制值,您可能需要在数据库中存储 Y 和 N,但向用户显示不同的值(例如 Yes 和 No,或者 Filled 和 Not Filled)。本演示介绍如何通过 selectOneRadio 组件实现此目的。
在表列筛选器中控制使用输入
本示例展示如何通过在 af:table 组件中定制列筛选器来控制用户查询数据输入。示例使用 JavaScript 来强制 ID 属性字段的数值输入。
使用 af:iterator 动态呈现图像
如何才能按照设定的次数动态呈现 UI 组件?例如,对于客户评级(它是一个数值),您希望显示一定数量的星星来表示客户的等级,而不是只显示一个数字(如 Amazon 的客户评级)。本演示将展示如何使用 af:iterator 组件。
如何处理 af:dialog 的 OK 和 CANCEL 按钮
ADF Faces 对话框组件是 af:popup 组件的子组件,它显示一个包含 OK/Cancel 和 Yes/No 按钮的框定内容区域。本专题讲座介绍如何确定用户按下了哪个按钮以及如何处理 CANCEL 事件,与其他按钮选项不同,该事件是一个纯客户端事件。还将介绍如何向服务器广播 CANCEL 事件,以便开发人员查询数据或清除未提交的更改。
如何删除 Oracle ADF 绑定 ADF Faces 分层树中的节点
本示例将展示如何确定选定的树节点以及通过树上下文菜单中公开的操作来删除这些节点。还将展示如何创建树、如何定义上下文菜单以及如何创建用于处理树节点删除操作的托管 bean 操作。其中还解释了有关 View Accessor 的一处混淆,以及树结构如何使用内部 API 访问子集合。
使用全局按钮功能创建页面模板的策略
页面模板可确保某个应用使用一致的布局,如果在一个 ADF 库中部署并重用了模板,还可确保所有应用用一致的布局。一种常见的需求是使用默认功能(例如全局按钮)构建布局。全局按钮执行应用级功能,例如导航到登录页面或帮助页面,但也可以执行特定于页面上下文的功能,例如创建新记录或删除当前行。本专题讲座介绍如何使用 ADF Faces 页面模板构建包含全局按钮的布局蓝图,以便调用应用级功能和特定于上下文的功能。
编程式部分页面刷新
ADF Faces 包含多种声明式特性,可用于控制 ADF Faces 页面的提交和刷新。这称为“局部页面刷新”(PPR)。在本示例中,您将看到如何以编程方式控制 ADF Faces 的局部页面刷新特性。
定制 ADF 搜索表单初始呈现和查询行为
本 ADF Insider 必读录像演示如何以高级模式初始呈现 ADF 搜索表单,以及如何将查询行为更改为区分大小写。而且,您还有机会了解如何将自定义视图条件用于 ADF 表筛选器。
遇到验证错误时撤销 ADF 表选择
本 ADF 必读录像介绍了在用户更改表的行当前位置时如果有未提交数据该怎么办。如果存在未提交的数据,会显示一个警告,提醒用户提交更改,之后再选择表中的其他行。如果数据更改验证成功,系统会在底层绑定层中将新表行设置为当前行。尽管示例使用数据提交作为验证的退出条件,但此条件可以是确定是否需要撤销行选择的任何 Java 可访问的条件。
   
 

ADF 调试

如何在 ADF 应用中实现日志记录
是的,ADF 源代码现已提供!本 ADF Insider 必读介绍如何向 JDeveloper 添加 ADF 源代码并使用它调试应用,以及如何实现 ADF 应用的日志记录功能。
调试任务流和内存范围
在本 ADF Insider 必读中,您将了解如何调试 ADF 应用中的典型错误。通过一个示例说明如何使用 JDeveloper 调试器和 ADF 任务流调试器来诊断和调试问题。
   
 

ADF 基本技巧

使用 Oracle Enterprise Pack for Eclipse 和 GlassFish 的 ADF Essentials 入门
您需要使用 Oracle Enterprise Pack for Eclipse (OEPE) 构建 ADF Essentials 应用,并将它们部署在 GlassFish 应用服务器上。在本 ADF Insider 中,您将了解如何配置 GlassFish 以运行 ADF Essentials 应用,以及如何使用 OEPE 的 JPA 持久性构建 ADF Essentials 应用。
ADF Mobile:使用本地数据库
构建 ADF Mobile 应用时,可能需要将数据存储在移动设备上。为此,您可以使用 ADF Mobile 的本地数据库通过熟悉的 JDBC 调用读写数据,这就需要依赖于 SQLite 数据库引擎。
部署可重用的组件
为了保持一致性,不同应用之间应共享页面模板和其他常用 UI 元素。此外,还可以使用 ADF 业务组件创建可重用的数据模型,并基于通用数据模型构建用户界面。在本 ADF Insider 必读中,您将了解如何使用 ADF 库分发这些可重用的组件。
ojdeploy ADF 构建实用程序
JDeveloper 的 ojdeploy 命令行实用程序提供了一种机制,无需人工干预即可从脚本或 Apache Ant 构建 ADF 应用。在本录像中,您将了解使用 ojdeploy 的必要性,并观摩 ojdeploy 操作演示,以便您在自己的构建环境中使用该实用程序。
针对 Android 配置 ADF Mobile 开发环境
ADF Mobile 的一个重要优势是允许您在 iOS 和 Android 上部署应用。不过,这种灵活性也意味着您不能只安装 JDeveloper 和 ADF Mobile 扩展。在本专题讲座中,您将了解如何配置开发环境以便将应用部署在 Google 的移动操作系统上。
   
 

Oracle 大学培训

开发工具学习路径和认证
false ,,,,,,,,,,,,,,,,