从 Web 客户端访问 J2EE 1.4 JAX-RPC Java Web 服务

Oracle Corporation 的 Pas Apicella 撰写的 Oracle JDeveloper 方法文档 2004 年 12 月

索引

引言

随着 Oracle JDeveloper 10g J2EE 开发人员预览版的发布,您现在就可以创建 JAX-RPC J2EE 1.4 web 服务了。提供业务逻辑可以简单地通过使用 JAX-RPC Create Java Web Service 向导来完成。与 Create Web Service Proxy 向导相结合,您的业务逻辑可以由任意客户端访问。在本文中,我们向您介绍如何使用两种流行的 J2EE 框架 Struts 和 JavaServer Faces 来实现这一点。

创建服务类

首先创建一个新的应用程序和空项目,您将使用它们来创建 web 服务。

项目符号 右键单击 Application 节点,并选择 New Application Workspace
项目符号 添加以下详细信息,并单击 OK

java1

项目符号 在相应的项目对话框中,添加以下详细信息并按 OK

java2

现在您有一个应用程序和一个空项目,您可以在这个空项目中创建服务类,并由其构建您的 Web 服务。在本例中,您创建一个 Java Bean,将其用于该服务类。

项目符号 右键单击该项目并选择 New
项目符号 选择 General -> Java Class,添加以下详细信息并单击 OK

java3

项目符号 选择 General -> Java Class,添加以下详细信息并单击 OK

java4

项目符号 用以下代码替换 Person bean Java 类,它代表了 Person bean:

 1    package mypackage;

 2    public class Person
 3    {
 4      private int     id;

 5      private String  firstName;
 6      private String  lastName;

 7      private String  title;
 8      public Person()

 9      {
10      }
11      public Person(int _id, String sFirstName, String sLastName, String sTitle)

12      {
13        id        = _id;
14        firstName = sFirstName;

15        lastName  = sLastName ;
16        title     = sTitle;

17      }
18      public void setId(int id)

19      {
20        this.id = id;
21      }

22      public int getId()
23      {
24        return id;

25      }
26      public void setFirstName(String firstName)

27      {
28        this.firstName = firstName;
29      }

30      public String getFirstName()
31      {
32        return firstName;

33      }
34      public void setLastName(String lastName)

35      {
36        this.lastName = lastName;
37      }

38      public String getLastName()
39      {
40        return lastName;

41      }
42      public void setTitle(String title)

43      {
44        this.title = title;
45      }

46      public String getTitle()
47      {
48        return title;

49      }
50    }

项目符号 用以下代码替换 PersonService Java 类代码:


 1  package mypackage;
 2  
 3  public class PersonService

 4  {
 5      private static Person[] personArray = null;

 6      static
 7      {
 8        personArray = new Person[] {new Person(1, "Pas", "Apicella", "Mr"),

 9        new Person(2, "Adrian", "Campanaro", "Mr"),

10        new Person(3, "Lucia", "Apicella", "Mrs"),

11        new Person(4, "Debbie", "Campanaro", "Mrs")};

12       }
13   
14       public Person[] retrievePeople ()

15       {
16         return personArray;
17       }
18   }

创建 J2EE 1.4 JAX-RPC Web 服务

现在该创建 J2EE 1.4 JAX-RPC web 服务了。导航器中的任何没有编译错误的 Java 类都有一个上下文菜单项 Create J2EE Web Service,您可以使用它轻松创建 web 服务。这是从 Java 类创建 web 服务可能最快的方式,默认情况下它将从 Java 类中提供所有可能的方法。

项目符号 右键单击 PersonService.java,选择 Create J2EE Web Service
项目符号 在 Select J2EE Version 对话框中,选择 J2EE 1.4 并单击 OK

java5

项目符号 保存并编译项目

即创建一个新的 JAX-RPC web 服务和以下文件:

  • 说明服务及其操作的 WSDL 文档
  • Java 接口和从服务类中提供的方法
  • WAR 部署配置文件
  • JAX-RPC 映射文件

java6

创建 Web 客户端

现在您已经创建了 web 服务,您可以开始创建客户端应用程序,后者将从服务中调用 web 服务方法并将返回的结果显示到 JSP 页面中。您会看到如何在两个项目中实现这一点:第一个项目使用 Struts,另一个项目使用 JSF (JavaServer Faces)。

使用 Struts

创建一个新的空项目作为 Struts 客户端项目。
项目符号 在导航器中,右键单击 PersonService,选择 New Project
项目符号 选择 Empty Project
项目符号 输入以下详细信息,并按 OK

java7

为了访问 web 服务,您必须创建用来访问服务的客户端代理类:

项目符号 在导航器中,右键单击 StrutsProject,选择 New
项目符号 选择 Business Tier -> Web Services -> Web Service Proxy
项目符号 如果显示 Welcome 页面,则单击 Next

代理向导的第 1 步搜索现有任何 WSDL 文档的当前工作区项目,并在 WSDL Document URL 域中将它们列出。在本文的情况下,仅有一个服务,因此您要使用的 WSDL 文档就是当前选中的文档。

java8

项目符号 在向导其余的步骤中接受默认值,并在最后一页单击 Finish。

代理类从 web 服务 WSDL 文档中自动生成。您可以开始创建调用服务方法并将结果显示到 JSP 页面上所必需的 Struts 代码。

项目符号 在导航器中,右键单击 StrutsProject,选择 New
项目符号 选择 Web Tier -> Struts -> Struts Controller Page Flow
项目符号 从 Component Palette 中将一个 Action 对象拖放到图上
项目符号 将一个 Page Forward 对象拖放到图上
项目符号 使用一个 Forward 链接将 Action 对象与 Page Forward 图标连接
项目符号 在图上将 Action 图标重命名为 /invokeWSMethod

您创建的图将形如:

java9

项目符号 在图上,双击 invokeWSMethod 创建一个 Struts 动作类
项目符号 接受以下显示的详细信息,并按下 OK

java10

项目符号 将以下代码添加到 Struts 动作的执行方法中

 1    public ActionForward execute
 2    (ActionMapping mapping, ActionForm form, HttpServletRequest

 3    request, HttpServletResponse response)
 4    throws IOException, ServletException

 5    {
 6       MyWebService1PortClient myPort;
 7       try

 8       {
 9           myPort = new MyWebService1PortClient();

10           Person[] personArray = myPort.retrievePeople();
11           request.setAttribute("persons", personArray);

12       }
13       catch (Exception e)
14       {

15         e.printStackTrace();
16       }
17   
18       return mapping.findForward("success");

19    }

项目符号 要使这些代码正确编译,请在动作页面中使用 ALT+Enter(导入助手)将正确的导入 (import) 添加到代码中
项目符号 在图上,右键单击 Page Forward 图标 /page1 创建一个新的 JSP 页面
项目符号 接受下面显示的详细信息,并按下 OK

 

java11

项目符号 单击 Source 选项卡,切换到 JSP 页面的代码编辑器视图
项目符号 用以下代码替换 JSP 代码:

 1  <%@ page contentType="text/html;charset=windows-1252"%>

 2  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 3  <html>

 4  <head>
 5  <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 6  <title>Access Web Service - Struts Demo</title>

 7  </head>
 8  <body>
 9  <h2> Web Service Client Test - Struts </h2>

10    <c:set var="perArray" value="${persons}"/>
11    <table border="1">

12      <c:forEach var="row" items="${perArray}">
13        <tr>
14          <td>

15            ${row.id}
16          </td>
17          <td>
18            ${row.title}

19          </td>
20          <td>
21            ${row.firstName}
22          </td>

23          <td>
24            ${row.lastName}
25          </td>
26        </tr>

27      </c:forEach>
28    </table>
29  </body>
30  </html>

现在将视图页面设置为显示返回的数据,您需要确保项目中包含的 JSTL 1.1 代码库可用,这是因为除了用到新的 EL 2.0 语法外还用到了它。

项目符号 在导航器中,双击 StrutsProject 调用 Project Properties 对话框
项目符号 选择 JSP Tag Libraries
项目符号 单击 Add
项目符号 选择 JSTL Core 1.1,单击 OK
项目符号 再次单击 OK,关闭对话框

您现在就可以编译项目并运行 Struts 动作来访问 web 服务,将返回的结果添加到请求对象中,并最终将结果显示在 JSP 视图页面中。

项目符号 返回至 Struts 页面流图

注意:从 Action (/invokeWSMethod) 到 Page Forward (/page1) 的 Forward 链接可能已经消失。如果发生了这种情况,那么务必重新添加从 Action 到 Page Forward 的 Forward 链接,因为在运行时需要它。

项目符号 在图中,右键单击 /invokeWSMethod,并选择 Run
项目符号 结果显示在浏览器中:

java12

使用 JSF (JavaServer Faces)

现在创建一个新的空项目用作 JSF 客户端项目。和先前一样,您将在它们自己的项目中创建代理类。

项目符号 在导航器中,右键单击 PersonService,选择 New Project
项目符号 选择 Empty Project
项目符号 输入以下详细信息,并按下 OK

java13

为了访问 web 服务,您必须创建客户端代理类。请按照 使用 Struts 部分中创建先前代理类的同样步骤来进行操作。一旦您完成了这一步,就可以继续下面的步骤了。

项目符号 在导航器中,右键单击 JSFProject,选择 New
项目符号 选择 Web Tier -> JSF -> JSF JSP
项目符号 单击 Next,然后单击 Finish
项目符号 从 Component Palette 中,选择 JSF HTML
项目符号 将一个 Data Table 对象拖放到 JSF JSP 页面上
项目符号 在向导中,如果显示了 Welcome 页面,则单击 Next
项目符号 选中 Number of columns 复选框,然后输入值 0
项目符号 单击 Finish
项目符号 将一个 Command Button 对象拖放到表的下面
项目符号 双击该按钮,输入定制的代码,这些代码将在按下按钮时被触发
项目符号 添加以下代码:

 1  public String commandButton_action()
 2  {
 3    MyWebService1PortClient myPort;

 4   
 5    try
 6    {
 7      myPort = new MyWebService1PortClient();

 8      Person[] personArray = myPort.retrievePeople();
 9      dataTable1.setValue(personArray);

10      setDataTable1(dataTable1);
11    }
12    catch (Exception e)

13    {
14      e.printStackTrace();
15    }
16   

17    return "success";
18  }

项目符号 要使这些代码正确编译,请使用 ALT+-Enter(导入助手)将正确的导入添加到代码中
项目符号 返回 JSF JSP 页面,用以下内容替换其中的代码

 1  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 2  "http://www.w3.org/TR/html4/loose.dtd">
 3  <%@ page contentType="text/html;charset=windows-1252"%>

 4  <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
 5  <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

 6  <f:view>
 7    <html>
 8      <head>
 9        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></meta>

10        <title>
11          Access Web Service - JavaServer Faces Demo
12        </title>
13      </head>

14      <body>
15         <h2> Web Service Client Test - JavaServer Faces </h2>
16        <h:form binding="#{backing_untitled1.form1}">

17          <h:dataTable
18            binding="#{backing_untitled1.dataTable1}"
19            var="rs"
20            border="1">

21            <h:column>
22              <f:facet name="header">
23                <h:outputText  value="Title"/>

24              </f:facet>
25               <h:outputText value="#{rs.title}"/>
26            </h:column>

27            <h:column>
28              <f:facet name="header">
29                <h:outputText value="Id"/>

30              </f:facet>
31               <h:outputText value="#{rs.id}"/>
32            </h:column>

33            <h:column>
34              <f:facet name="header">
35                <h:outputText  value="First Name"/>

36              </f:facet>
37               <h:outputText value="#{rs.firstName}"/>
38            </h:column>

39            <h:column>
40              <f:facet name="header">
41                <h:outputText  value="Last Name"/>

42              </f:facet>
43               <h:outputText value="#{rs.lastName}"/>
44            </h:column>

45           </h:dataTable>
46          <p />
47          <h:commandButton value="Execute Web Service Method"

48                           binding="#{backing_untitled1.commandButton1}"
49                           action="#{backing_untitled1.commandButton_action}"/>
50         </h:form>

51      </body>
52    </html>
53  </f:view>
54  


项目符号 在图中,右键单击 JSF JSP 页面,选择 Run
项目符号 在浏览器内部,单击 Execute Web Service Method 按钮
项目符号 结果显示在浏览器中:

java14

总结

通过利用 JDeveloper 10g J2EE 开发人员预览版中的 JAX-RPC web 服务向导,可以快速轻松地将业务逻辑部署为 web 服务,并提供给客户端应用程序使用。

关于 JDeveloper 10g J2EE 开发人员预览版的更多信息,请前往 Oracle JDeveloper 10g Release 2 (10.1.3) — 开发人员预览版