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
在相应的项目对话框中,添加以下详细信息并按 OK
现在您有一个应用程序和一个空项目,您可以在这个空项目中创建服务类,并由其构建您的 Web 服务。在本例中,您创建一个 Java Bean,将其用于该服务类。
右键单击该项目并选择 New
选择 General -> Java Class,添加以下详细信息并单击 OK
选择 General -> Java Class,添加以下详细信息并单击 OK
用以下代码替换 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 服务了。导航器中的任何没有编译错误的 Java 类都有一个上下文菜单项 Create J2EE Web Service,您可以使用它轻松创建 web 服务。这是从 Java 类创建 web 服务可能最快的方式,默认情况下它将从 Java 类中提供所有可能的方法。
右键单击 PersonService.java,选择 Create J2EE Web Service
在 Select J2EE Version 对话框中,选择 J2EE 1.4 并单击 OK
保存并编译项目
即创建一个新的 JAX-RPC web 服务和以下文件:
现在您已经创建了 web 服务,您可以开始创建客户端应用程序,后者将从服务中调用 web 服务方法并将返回的结果显示到 JSP 页面中。您会看到如何在两个项目中实现这一点:第一个项目使用 Struts,另一个项目使用 JSF (JavaServer Faces)。
创建一个新的空项目作为 Struts 客户端项目。
在导航器中,右键单击 PersonService,选择 New Project
选择 Empty Project
输入以下详细信息,并按 OK
为了访问 web 服务,您必须创建用来访问服务的客户端代理类:
在导航器中,右键单击 StrutsProject,选择 New
选择 Business Tier -> Web Services -> Web Service Proxy
如果显示 Welcome 页面,则单击 Next
代理向导的第 1 步搜索现有任何 WSDL 文档的当前工作区项目,并在 WSDL Document URL 域中将它们列出。在本文的情况下,仅有一个服务,因此您要使用的 WSDL 文档就是当前选中的文档。
在向导其余的步骤中接受默认值,并在最后一页单击 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
您创建的图将形如:
在图上,双击 invokeWSMethod 创建一个 Struts 动作类
接受以下显示的详细信息,并按下 OK
将以下代码添加到 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
单击 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
结果显示在浏览器中:
现在创建一个新的空项目用作 JSF 客户端项目。和先前一样,您将在它们自己的项目中创建代理类。
在导航器中,右键单击 PersonService,选择 New Project
选择 Empty Project
输入以下详细信息,并按下 OK
为了访问 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 按钮
结果显示在浏览器中:
通过利用 JDeveloper 10g J2EE 开发人员预览版中的 JAX-RPC web 服务向导,可以快速轻松地将业务逻辑部署为 web 服务,并提供给客户端应用程序使用。
关于 JDeveloper 10g J2EE 开发人员预览版的更多信息,请前往 Oracle JDeveloper 10g Release 2 (10.1.3) — 开发人员预览版
