使用 JDeveloper 开发合约驱动的 Web 服务

在本教程中,您将通过一种从上至下的方法使用 JDeveloper 开发一个 Java web 服务。

大约 30 分钟

主题

本教程包括下列主题:

创建 WSDL 合约文档
从 WSDL 合约文档生成 Web 服务
测试 Web 服务

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

Web 服务是可以合并到应用程序中的分散的可重用软件组件。它们构建于现有的 XML 和 HTTP 协议之上,并遵循以下标准:

WSDL(Web 服务描述语言):一种用于定义 Web 服务的基于 XML 的语言
SOAP(简单对象访问协议):一种基于 XML 的协议,用于使用 XML 语法通过 HTTP 发送命令来访问 Web 上的服务
UDDI(通用描述、发现与集成):Web 服务的通用目录,使软件可以发现 Web 上的服务并与其集成

JDeveloper 提供了许多特性来帮助您创建和部署 web 服务,并找到现有的 web 服务,以在您的应用程序中使用。

从上至下的 web 服务开发范式意味着您将从 WSDL 着手,使用 WSDL 中的类型和操作定义生成所有的类和服务。这种方法要比从下至上的方法复杂,后者允许将现有的系统包装为 web 服务。但是,从下至上进行开发就是最好的方法吗?许多专家认为 SOA 是一种业务驱动的体系结构样式,若要构建成功,必须使用从上至下的方法。

本教程将使用 JDeveloper 的工具来进行端到端的合约驱动的开发,包括 XML 模式创建、WSDL 编辑、从上至下的 web 服务生成以及客户端的创建和测试。

返回主题列表

前提条件

开始本教程之前,您应该:

1.

已经安装 Oracle JDeveloper (10.1.3.1)。

2.

已双击 \jdeveloper.exe 启动了 JDeveloper。

如果您收到一条消息,询问您是否想从一个早期版本进行移植,单击 No


3.

双击 \jdev\bin\start_oc4j.bat 启动 Oracle Application Server Containers for J2EE (OC4J)

如果提示您输入口令,则输入 welcome1。当您输入口令时,它并不会显示出来。您必须在下一行重新输入该口令进行确认。如果没有要求您输入口令,那么在稍后的步骤中,您需要知道在 OC4J 最初启动时设置的口令。

观察命令窗口中的结果,直到看到消息“Oracle Containers for J2EE 10g <10.1.3.1.0> initialized”。然后您可以最小化窗口,但不要关闭它。


4.

在 JDeveloper 中创建到 OC4J 的连接:

1. 单击 Connections 选项卡(如果没有看到 Connections 选项卡,请从菜单中选择 View > Connection Navigator)。
2. 右键单击 Application Server 节点,并从上下文菜单中选择 New Application Server Connection
3. 如果显示 Create Application Server Connection 向导的 Welcome 页面,则单击 Next
4. 在此向导的 Type 页面上,输入连接名称 oc4jconn,然后单击 Next
5. 在向导的 Authentication 页面上,输入口令 welcome1(或最初启动 OC4J 时使用的任何口令),并选择 Deploy Password,然后单击 Next
6. 在向导的 Connection 页面上,单击 Next
7. 在向导的 Test 页面上,单击 Test Connection。在测试之后,Status 消息应显示 Success!。(如果显示了错误消息,则单击 Back,并更正您输入的连接信息。)
8. 单击 Next,然后单击 Finish


返回主题列表

创建 WSDL 合约文档

要创建 WSDL 合约文档,执行以下步骤:

创建模式

首先创建一个模式,并向其中添加一些元素。然后将该模式导入一个 WSDL 文档。

1.

在 Application Navigator 中,右键单击 Applications 节点,然后从上下文菜单中选择 New Application

2.

在 Create Application 对话框中,输入 TopDownContractDevelopment 作为应用程序名,并选择 No Template 选项。单击 OK


3.

在 Create Project 对话框中,在 Project Name 中输入 WSDLDocument 并单击 OK

4.

右键单击 WSDLDocument 项目,并从上下文菜单中选择 New

5.

在 New Gallery 中,展开 Categories 列表中的 General 并选择 XML,然后在 Items 列表中选择 XML Schema。单击 OK

6.

在 Create XML Schema 对话框中,输入名称 CreditRating.xsd,然后单击 OK

模式创建完毕并在编辑器中打开。

7.

在编辑器中选择模式,并单击 targetNamespace 右侧的方框。在示例名称上键入 http://myCompany.com/CreditRating/types

8.

现在可以向该模式添加元素了。元素类似于变量,对于 web 服务而言是全局性的。
您可以使用设计编辑器来添加元素。

在设计编辑器中,单击 exampleElement 并键入 ssn 作为名称。

9.

右键单击 ssn 并从上下文菜单中选择 Set Type

10.

单击方框右侧的箭头,并从下拉列表中选择 xsd:string

11.

添加其他元素。您可以通过从 Component Palette 拖动 element 组件并将其置于 上来完成此操作。

12.

单击元素内部,并将默认名改写为 rating

.

13.

如前所述,使用下拉列表可以将其类型设置为 xsd:int

14.

以相同的方法添加第三个元素,其名称为 error、类型为 xsd:string

单击 Save All Save All 按钮 保存您的模式。

创建 WSDL 合约文档

接下来,您将创建 WSDL 合约文档,并将之前步骤中创建的模式导入其中。

1.

右键单击 WSDLDocument 项目,并从上下文菜单中选择 New。在 New Gallery 中展开 Business Tier 节点,并在 Categories 窗格中选择 Web Services,在 Items 窗格中选择 WSDL Document

2.

键入 CreditRating 作为 WSDL Name,键入 http://myCompany.com/CreditRating 作为 Target Namespace。单击 OK

3.

注意,CreditRating WSDL 已经创建并在编辑器中打开。确保您位于编辑器窗口和 Structure 窗口的 Design 选项卡中。如果不是,请单击每个窗口左下方的 Design 选项卡。该窗口看起来应该与以下屏幕截图类似。

4.

在 Structure 窗口中,右键单击 Types,并从上下文菜单中选择 Insert types...

5.

右键单击类型子节点,并从上下文菜单中选择 Insert inside types-->XML Schema

6.

在 Insert XML Schema Item 对话框中,选择 schema 并单击 OK

7.

右键单击 Structure 窗口中的模式子节点,并选择 Insert inside schema-->import

8.

确保 Properties Inspector 窗口可见。如果不可见,请选择 View-->Property Inspector。
在 PI 中,指定模式的位置(如果需要,单击 ... 浏览到所需位置)。指定 CreditRating.xsd 作为 id,指定 http://myCompany.com/CreditRating/types 作为模式命名空间。

9.

单击编辑器中的 Source 选项卡以查看 CreditRating.wsdl 文件的代码。右键单击并选择 Reformat,以整理代码并使其具有更好的可读性。

10.

现在,您可以更清楚地看到 Definitions 标记中的值,请将以下行添加到标记末尾:

xmlns:types="http://myCompany.com/CreditRating/types"

单击 Save All Save All 按钮保存包含已导入模式的 WSDL 文档。

返回主题

定义服务接口

现在,添加 WSDL 的抽象元素或可重用元素。所有的开发人员都会在此阶段进行的操作,以允许其他人使用 WSDL 生成他们必须通过编码获得的基础 Java 实施类。

通过指定以下项来定义服务接口:

在本例中,将为该服务定义一个操作来获取贷款申请人的信用评价。要定义服务接口,执行以下步骤:

1.

首先,添加三个消息。

在编辑器窗口中,单击 CreditRating.wsdl 的 Design 选项卡,然后单击 Switch View 使 Messages 元素位于最左侧的位置。该步骤并非必要,但这样做有助于您更容易查看最先创建的内容。

2.

在 Structure 窗口中,选择 Design 选项卡。

右键单击 Messages 并从上下文菜单中选择 Insert Message


3.

在 New Message 对话框中,输入 CreditRatingRequestMessage 作为 Message Name,然后单击 OK

4.

在 Structure 窗口中,右键单击 message - CreditRatingRequestMessage 并选择 Insert Inside Message - CreditRatingRequestMessage > http://schemas.xmlsoap.org/wsdl/ > part

5.

在 New Part 对话框中,输入 ssn 作为 Part Name,并输入 types:ssn 作为 Part Type。

6.

按步骤 2 - 5 中所述,以同样的方式添加以下消息及其相应的部分类型:

消息名称 部分名称 部分类型
CreditRatingResponseMessage rating types:rating
CreditRatingFaultMessage error types:error

添加消息完后,可单击 Structure 窗口中的任一元素,或单击编辑器的 Design 选项卡,您就能够在 Property Inspector 中查看并修改其值了。

7.

现在,定义等同于方法签名的 PortType(服务接口),它指定操作及其使用的消息(参数)。

在 Structure 窗口中,右键单击 PortTypes 并选择 Insert portType

8.

在 New Port Type 对话框中,输入 CreditRating 作为 Port Type Name,然后单击 OK

9.

在 Structure 窗口中,右键单击 CreditRating portType 并选择 Insert inside portType -Credit Rating > operation

10.

在 New Operation 对话框中,输入 processCreditRating 作为 Operation Name。

Operation Type 应为 Request Response

从 Input 下拉列表中,选择 tns:CreditRatingRequestMessage,这是先前定义的消息之一。

从 Output 下拉列表中,选择 tns:CreditRatingResponseMessage,这是先前定义的另一个消息。

选择 Add Fault

输入 NegativeCredit 作为 Fault Name。

从 Fault 下拉列表中,选择 tns:CreditRatingFaultMessage,这是先前定义的第三个消息。

单击 OK

11.

在 WSDL 编辑器中展开 CreditRating Port Type,查看这些消息是如何与操作关联的。单击该操作的不同组件,查看与之关联的消息。

请注意,请求消息与流程的输入相关联,响应消息与流程的输出相关联,而错误消息与名为 NegativeCredit 的错误相关联。

12.

创建服务接口的最后部分是定义绑定。将 Port Type 绑定至特定的协议 (HTTP) 和数据格式 (SOAP)。

在 Structure 窗口中,右键单击 Bindings 并从上下文菜单中选择 Insert binding

13.

在 New Binding 对话框中,输入 CreditRatingSoapHttp 作为 Binding Name。

保留其他所有域的默认值。Port Type 的默认值就是您创建的 Port Type。

单击 OK

14.

在设计编辑器中,展开刚创建的绑定查看详情。

请注意,在单击任何元素时,编辑器的 Design 选项卡将显示它与其他元素的关系。

15.

在编辑器中,单击 Source 选项卡。

滚动至文件末尾的 NegativeCredit 错误定义。将以下行:

更改为:

fault use="literal" name="NegativeCredit"/>

返回主题

定义服务实施

创建 WSDL 文档的最后一步是创建服务实施定义。该定义包括指定特定实施人员打算实施的绑定的端口和服务将要在其中运行的服务器。

要定义服务实施,执行以下步骤:

1.

在 Structure 窗口的 Design 选项卡中,右键单击 Services 并从上下文菜单中选择 Insert service

2.

在 Insert Service 对话框中,输入名称 CreditRatingService,然后单击 OK


3.

在 Structure 窗口中,右键单击 service - CreditRatingService,然后从上下文菜单中选择 Insert inside service - CreditRatingService > http://schemas.xmlsoap.org/wsdl/ > port

4.

在 New Port 对话框中,输入 CreditRatingServiceSoapHttpPort 作为 Port Name。Binding Name 默认值为刚创建的绑定。单击 OK

5.

在 Structure 窗口中,右键单击 port - CreditRatingServiceSoapHttpPort,然后从上下文菜单中选择 Insert inside port > soap:address

6.

在 Insert Address 对话框中,在位置处输入任意字符串,如 tbd,因为这对于本阶段指定运行已完成服务的地方而言并非必要。单击 OK

7.

在 Application Navigator 中,右键单击 CreditRating.wsdl 并从上下文菜单中选择 Validate WSDL

通过日志窗口中的 Message 选项卡可获知是否存在错诶,而 Structure 窗口中的 Source 选项卡可以给出详细的错误信息。

8. 单击 Save All Save All 按钮 保存您的工作。


返回主题列表

从 WSDL 合约文档生成 Web 服务

要生成 Web 服务,执行以下步骤:

1.

在 Application Navigator 中,右键单击 TopDownContractDevelopment 应用程序,然后从上下文菜单中选择 New Project

在 New Gallery 中,从 Items 列表中选择 Empty Project 并单击 OK

2.

在 Create Project 对话框中,输入 GetDatesWSProxy 作为 Project Name,然后单击 OK


3.

右键单击 Service 项目,并从上下文菜单中选择 New

在 New Gallery 中,展开 Categories 列表中的 Business Tier 并选择 Web Services,然后从 Items 列表中选择 Java Web Service from WSDL。单击 OK

4.

单击 Create J2EE 1.4 Java Web Service from WSDL 向导中 Welcome 页面上的 Next

在该向导的 Web Service Description 页面上,从 WSDL Document URL 下拉列表中选择刚创建的 CreditRating.wsdl。单击 Next

5.

在该向导的 Default Mapping Options 页面中,可以单击 Next 逐页浏览所有选项。然而,因为接受所有默认值,所以可以只是单击 Finish

现在,您具有了一个完整的 web 服务以及所有的 JAX-RPC 文件,可以部署和运行服务了。

6.

在 Application Navigator 中,展开 Service 下的 Application Sourcesservice 程序包。

请注意,JDeveloper 已经创建了一个新的服务 CreditRatingService。在 Application Navigator 中选择 CreditRatingService 查看显示在 Structure 窗口中的其他关联文件。

7.

CreditRatingService.wsdl 文件在编辑器中打开。单击 Design 选项卡。在 Services 下,展开 CreditRatingServiceCreditRatingServiceSoapHttpPort

选择 soap:address 并查看其 Property Inspector。您可以看到,指定为 tbd 的位置现已默认为本地计算机。这将根据您实际部署服务的位置而变。该 soap address 或 endpoint 是 web 服务在网络上的位置 (URI)。

默认情况下,JDeveloper 通过使用端口 8888 的终端创建 WSDL,因为这是外部服务器默认情况下使用的端口。由于要使用嵌入式(非外部)OC4J 测试 web 服务,因此应将默认端口号更改为嵌入式 OC4J 服务器使用的端口号。要查看端口,可调用 Tools > Embedded OC4J Server Preferences,然后单击左侧树中的 Startup。嵌入式服务器的端口号显示在 HTTP 域中。一旦接受该端口号,就可以离开 preferences 窗口了。

如果 WSDL 中的 soap:address 与嵌入式 OC4J 端口的不同,则将其更改为正确的端口号。

8.

在 Application Navigator 中选择 CreditRatingService,在 Structure 窗口中双击 CreditRatingImpl.java 将其在编辑器中打开。请注意,它将 String 当作了参数,该参数的名称是 ssn,即先前创建的 Message 参数的名称。

您需要添加实际的方法实施。将

return 0;

替换为:

int id;
try
{
// Parses integer value of first 3 numbers form SSN
id = Integer.parseInt(ssn.substring(0,3));
}
catch(NumberFormatException e)
{
// if SSN is invalid returns -1
return -1;
}
if(id < 300)
{
// If value of the first 3 numbers from customer SSN is less
// than 300, credit rate is 1.
return 1;
}
else if(id < 600)
{
// If value less than 600, credit rate is 2.
return 2;
}
else if(id <900)
{
// If value less than 900, credit rate is 3.
return 3;
}
else
{
// Otherwise, credit rate is 0.
return 0;
}

9.

您还需要确保 CreditRatingImpl.java 正确实施了终端接口 CreditRating.java

在该接口中,processCreditRating() 方法抛出了一个 CreditRatingFaultMessage 异常,因此,processCreditRating() 方法(位于 CreditRatingImpl.java 中)也抛出了一个 CreditRatingFaultMessage 异常。如果情况并非如此,则将以下代码添加到 CreditRatingImpl.javaprocessCreditRating() 方法签名中:

throws CreditRatingFaultMessage

单击 Save All Save All 按钮 保存您的工作。

10.

在 Application Navigator 中,右键单击 CreditRatingService,然后从上下文菜单中选择 Run。这会将该 web 服务部署到 JDeveloper 的嵌入式 OC4J 服务器中。您应该会在日志窗口中看到一个消息,表明该 web 服务已启动。

返回主题列表

测试 Web 服务

现在,创建一个客户端,调用该 web 服务,对其进行测试。要测试该 Web 服务,执行以下步骤:

1.

在 Application Navigator 中,右键单击 TopDownContractDevelopment 应用程序,然后从上下文菜单中选择 New Project

在 New Gallery 中,从 Items 列表中选择 Empty Project 并单击 OK

2.

在 Create Project 对话框中,输入 Client 作为 Project Name,然后单击 OK


3.

右键单击 Client 项目,并从上下文菜单中选择 New

在 New Gallery 中,展开 Categories 列表中的 Business Tier 并选择 Web Services,然后从 Items 列表中选择 Web Service Proxy。这将使用该 web 服务的 WSDL 生成一个客户端代理,与该 web 服务相同,该代理具有所有公共可用数据接口。然后,客户端应用程序可以使用该代理对象访问该 web 服务。

单击 OK

4.

如果显示了 Create Web Service Proxy 向导的 Welcome 页面,则单击 Next

在该向导的 Web Service Description 页面上,从下拉列表中选择 CreditRatingService.wsdl。选择该文件填充 Mapping File 域。单击 Next

5.

在向导的 Port Endpoints 页面上,选择默认的单选按钮 — Run against a service deployed to Embedded OC4J。

可以根据需要单击 Next 逐页浏览。然而,要接受所有默认值,只需单击 Finish 即可。

创建了文件 CreditRatingServiceSoapHttpPortClient.java,并自动将其在编辑器窗口中打开。

6.

您需要添加代码调用该 web 服务。在代码编辑器中的以下行后:

// Add your own code here

添加下列代码:

int rating = myPort.processCreditRating("78964022");
System.out.println("Credit Rating is " + rating);

7.

单击 Run Run 按钮。该 web 服务向日志窗口返回其结果。

返回主题列表

在本教程中,您通过从上至下的方法使用 JDeveloper 的 WSDL 编辑器开发了一个 web 服务,并通过创建和运行 Web 服务客户端代理测试了该 Web 服务。

返回主题列表

要了解有关如何使用 Web 服务的更多信息,请参考:

将鼠标置于该图标上可以隐藏所有的屏幕截图。