开发 Web 服务
在本节中,使用 Eclipse Web Tools 来为 OpenLaszlo 客户机将会调用的 FluidMotion
应用程序构建一个基本的 Web 服务。该 Web 服务将使用 Hibernate 来将数据持久存储到 Apache Derby
数据库。首先创建一个动态 Web 项目。然后将服务创建为一个 Plain Old Java Object (POJO),再运行 Web
服务向导将它公开为一个 SOAP 服务。最后将它打包为一个 Web 应用程序。
注意:在开始开发 Web 服务之前,请确保任何 LPS 服务器都没在运行。否则,Tomcat 服务器会出现 WTP 错误,因为它试图绑定到端口 8080,而这是 LPS 服务器所使用的端口。要关闭 LPS 服务器,请激活命令窗口,并按 Ctrl+C
。
创建动态 Web 项目
Web 服务最终将被打包为 Web 应用程序,并部署到 Web 容器。所以首先创建一个动态 Web 项目,该项目具有可部署的 Web
应用程序所必需的结构。换句话说,它将包含一个 WEB-INF 目录、WEB-INF/lib 目录和一个 web.xml 文件。针对
FluidMotion 服务器将这个项目命名为 fms
。
要创建动态 Web 项目,请执行以下步骤:
- 从 Eclipse 主菜单选择 File > New > Project
。
- 在 Select a wizard 页面上,选择 Web > Dynamic Web Project
,然后单击 Next
。
- 在 Dynamic Web Project 页面上,输入项目名称,然后单击 Show Advanced
。
- 单击 New
以添加新的 Tomcat 服务器。
- 在 New Server Runtime 页面上,选择 Apache > Apache Tomcat v5.0
,如图 4 所示,并单击 Next
。
图 4. 选择 Apache Tomcat v5.0 运行时
- 使用 Browse
找到 Tomcat 安装目录。
- 接下来,从 JRE 列表选择一个 JDK,如图 5 所示,并单击 Finish
。注意,Eclipse 默认情况下一般使用
Java Runtime Environment (JRE),但是 Tomcat 必须配置为使用 JDK,因为它需要编译工具,以将
JavaServer Pages™ (JSPs) 转换为 servlet。所以这里确保配置并选择了 JDK 运行时。
图 5. Tomcat 服务器配置
- 回到 Dynamic Web Project 页面,单击 Finish
。
- 如果提示一个许可协定,就阅读它,并通过单击 I Agree
接受它。
- 如果提示打开 J2EE 透视图,则单击 Yes
。
一旦完成 Dynamic Web Project 向导,您就在 Dynamic Web Projects 节点下具有了一个新的动态 Web 项目,类似于图 6 所示的项目。
图 6. 新的动态 Web 项目的内容
创建服务和数据转移对象
创建 POJO 服务和数据转移对象 (DTO) 与创建任何其他 Java 类是一样的,只是有两个细微差别。首先,Web
服务包含被很好地公开为数组的集合。这使得描述服务的 Web Services Description Language (WSDL)
可以适当地处理复杂类型。另外,并不是所有支持 Web 服务的语言都具有动态未类型化集合的概念。其次,DTO 必须具有无参构造函数,以便 XML
封送可以创建新的实例用于联合。
清单 1 是下一节中公开为 Web 服务的 WorkOrderService
类。
清单 1. WorkOrderService 类
package com.ibm.laszlo.services;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ibm.laszlo.dto.Building;
import com.ibm.laszlo.dto.Floor;
import com.ibm.laszlo.dto.WorkOrder;
import com.ibm.laszlo.util.HibernateUtil;
/**
* Service for work order management.
*/
public class WorkOrderService {
/**
* Finds a specific work order by id.
* @param id unique id of work order.
* @return work order.
*/
public WorkOrder findWorkOrderById(int id) {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
WorkOrder workOrder = (WorkOrder) session.get(
WorkOrder.class, new Integer(id));
tx.commit();
HibernateUtil.closeSession();
return workOrder;
}
/**
* Returns all work orders.
* @return all work orders.
*/
public WorkOrder[] findAllWorkOrders() {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
List workOrders = session.createQuery("from WorkOrder").list();
tx.commit();
HibernateUtil.closeSession();
return (WorkOrder[])workOrders.toArray(
new WorkOrder[workOrders.size()]);
}
/**
* Create a new work order.
* @param contact contact person's name.
* @param phone contact person's phone number.
* @param email contact person's email.
* @param description description of problem.
* @param building building problem is in.
* @param floor floor in building with problem.
* @param severity severity of the problem.
* @return new work order's id.
*/
public int createWorkOrder(String contact, String phone,
String email, String description,
String building, String floor, int severity) {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
WorkOrder workOrder = new WorkOrder(contact, phone,
email, building, floor, description, severity);
Date currentDate = new Date();
workOrder.setDateRequested(currentDate);
workOrder.setLastModified(currentDate);
workOrder.setStatus(WorkOrder.STATUS_REQUESTED);
session.saveOrUpdate(workOrder);
tx.commit();
HibernateUtil.closeSession();
return workOrder.getId();
}
/**
* Collection of buildings and their floors.
* NOTE: Hard coded for simplicity but could be read from a
* database.
* @return
*/
public Building[] getBuildings() {
List buildings = new ArrayList();
Building building = new Building(1, "HQ");
building.addFloor(new Floor(1, "Floor 1"));
building.addFloor(new Floor(2, "Floor 2"));
building.addFloor(new Floor(3, "Mezzanine"));
buildings.add(building);
building = new Building(2, "Trump Tower");
building.addFloor(new Floor(1, "Trump 1"));
building.addFloor(new Floor(2, "Trump 2"));
building.addFloor(new Floor(3, "Trump 3"));
buildings.add(building);
return (Building[])buildings.toArray(
new Building[buildings.size()]);
}
}
|
注意该类是如何具有五个方法的:findWorkOrderById()
、findAllWorkOrders()
、createWorkOrder()
、updateWorkOrder()
和 getBuildings()
。这五个方法将被公开为 SOAP 操作。还要注意,getBuildings()
和 findAllWorkOrders()
方法返回类型化数组而不是 java.util.List
。该服务中引用的 WorkOrder
、Floor
和 Building
类是带有无参构造函数的简单 JavaBeans。
注意,如果您的服务或 DTO 类使用任何类型的第三方库,比如 WorkOrderService
类使用 Hibernate,那么这些库的 JAR 需要包含在 WebContent/WEB-INF/lib 目录中。
将 POJO 服务公开为 Web 服务
既然有了一个 POJO 服务,就将它公开为 Web 服务。这叫做自底向上的方法,意味着从一个 Java 类开始,并使用它来生成描述该方法的 WSDL。替代方案是自顶向下的方法,即从 WSDL 开始,并从它生成 Java 代码。
要将 WorkOrderService
公开为 SOAP Web 服务,请执行以下步骤:
- 从 Eclipse 主菜单选择 File > New > Other
。
- 在 Select a wizard 页面上,选择 Web Services > Web Service
,然后单击 Next
。
- 在如图 7 所示的 Web Services 页面上,选中 Generate a proxy
、Test the Web service
和 Monitor the Web service
,然后单击 Next
。
图 7. 生成 Web 服务的选项
- 在 Object Selection 页面上,选择您想要公开为 Web 服务的 bean,比如
WorkOrderService
,然后单击 Next
。
- 在 Service Deployment Configuration 页面上,直接单击 Next
。这些配置就是针对将 Apache Axis JARs 添加到哪个项目的。此外,它还会创建一个新项目,以允许您测试自己的 Web 服务,而不必具有 Laszlo 客户机。
- 如图 8 所示,Web Service JavaBean Identity 页面上的所有默认选项都应该保持,所以单击 Finish
。该页面允许您显式地选择哪些方法将由 WSDL 公开,以及使用的 SOAP 风格。
图 8. 针对公开方法和定义风格的配置
完成 Web 服务向导之后,就发生了几件事情。首先,用相同名称创建了一个新的动态 Web
项目,并且客户机被附加到它的末尾。该项目包含您的 Web 服务的一个消费者以及一个基于 JSP 的测试工具,如图 9
所示。这个测试客户机是很方便的,因为测试您的 Web 服务正确工作不需要完成 OpenLaszlo 客户机。
图 9. Web 服务测试客户机
其次,如果 Tomcat 服务器还没有启动,那么服务器启动并被添加到服务器视图(参见图 10),用于管理应用程序的启动、停止和重新部署。
图 10. Tomcat 服务器在运行
第三,两个动态 Web 项目都被部署到 Tomcat 服务器,并且您可以开始通过基于 Web 的客户机来测试服务。一个内部 Eclipse 浏览器自动打开到测试页面。
最后,配置了一个 TCP/IP 监视器,如图 11 所示,以便您可以监视测试客户机与您的 Web 服务之间的 SOAP 流量。
图 11. TCP/IP 监视器监视客户机与 Web 服务之间的流量
打包 Web 服务
在使用测试客户机测试了 Web 服务之后,就可以将服务打包为标准的 Web 应用程序或 .war 文件了,以将它部署到 Web
容器上。对于开发 OpenLaszlo 客户机来说,尤其如此。前一节中由 Eclipse 自动启动的 Tomcat
服务器和您需要用于开发客户机的 OpenLaszlo 服务器都运行在端口 8080 上。您需要打包 Web 服务,以便它可以被部署到
OpenLaszlo 服务器。
要打包 Web 服务,请执行以下步骤:
- 从 Eclipse 主菜单选择 File > Export
。
- 选择 WAR file
,并单击 Next
。
- 在 WAR Export 页面上,选择包含 Web 服务和生成的目的 .war 文件的 Web 模块,并单击 Next
。
警告:在启动 OpenLaszlo 服务器之前停止由 Eclipse 启动的 Tomcat 服务器。
要将 Web 服务部署到 OpenLaszlo 服务器,请执行以下步骤:
- 将 .war 文件 fms.war 复制到 <OpenLaszlo Server>/Server/tomcat-5.0.24/webapps 目录。
- 启动 OpenLaszlo 服务器。
注意:将 Web 服务部署到 OpenLaszlo 服务器之后,到 WSDL 的 URL 是 http://localhost:8080/fms/wsdl/WorkOrderService.wsdl。
分享到:
相关推荐
OpenLaszlo —— 一个快速构建和部署富 Internet 应用程序的平台 -- Linux,C,C++,Java,Ajax,XML,perl,php,python,ruby,MySQL,Gnome,KDE,Qt,Gtk,bash,shell,嵌入式,网络,信息安全,操作系统,数据结构,编译原理
它允许开发者使用Web技术(HTML、JavaScript和Flash/Flex)构建富互联网应用(Rich Internet Applications,简称RIAs),然后将这些应用部署到桌面操作系统、移动设备和电视设备上。在构建Adobe AIR应用程序时,会...
它的IIS(Internet Information Services)Web服务器组件,是构建Web应用程序的关键工具。IIS支持多种Web技术,如ASP.NET、PHP和FTP服务,为开发者提供了丰富的功能和灵活性。 在构建可靠Web应用程序时,首先需要...
富应用程序编程,也称为 Rich Internet Application (RIA),是一种在互联网上提供类似桌面应用程序用户体验的技术。随着互联网技术的发展,用户对于在线应用的期望不断提高,而RIA技术正是为了满足这种需求而诞生的...
在此背景下,富因特网应用程序(Rich Internet Applications, RIA)的概念应运而生,它旨在结合桌面应用程序的高性能和互动性与网络应用程序的广泛传播范围和便捷性。 #### 二、富因特网应用程序的优势 ##### 传播...
FLEX作为一款由Adobe公司推出的开源框架,以其强大的图形渲染能力和高度互动性的特点,在构建富互联网应用(Rich Internet Applications, RIA)方面展现出巨大潜力。 #### 二、FLEX技术概述 FLEX技术的核心在于...
关于Winlet是一个Java Web应用程序框架,用于构建由Winlet窗口组成的Rich Internet Applications。 Winlet窗口类似于Web窗口小部件,可以将其添加到任何网页(甚至是其他域中的静态网页),仅占网页的一部分,并使用...
VB构建INTERNET应用知识点 一、 Internet 技术概述 * Internet 技术是基于 TCP/IP 协议的全球性非集中管理的计算机网络 * Internet 技术为开发人员提供了广泛的施展空间 二、 VB 构建 INTERNET 应用 * 使用 ...
AppKitGWT是一款强大的开发工具,专为使用Google Web Toolkit (GWT) 构建富互联网应用程序(RIA)而设计。GWT是一个开源框架,允许开发者使用Java语言编写客户端代码,然后编译成高效的JavaScript,使得应用程序可以在...
Flex的核心优势在于其强大的组件库和数据绑定能力,使得开发者能够轻松地构建出功能丰富、视觉效果出众的Web和桌面应用程序。 #### 二、Flex与Adobe Flash Platform Flex是Adobe Flash Platform的重要组成部分之一...
2. **XAML 浏览器应用程序 (Xbap)**:一种特殊的基于Web的应用程序,其主要组成元素为XAML页面,可以在Web浏览器(例如Internet Explorer和Firefox)中运行。 3. **自定义控件库**:非可执行程序集,包含了一系列可...
### 构建安全的Microsoft® ASP.NET应用程序 #### 指南概述 本指南旨在为开发者提供关于构建安全Microsoft ASP.NET应用程序的专业建议和技术指导。它不仅涵盖了基础的安全性概念,还深入探讨了如何在分布式环境中...
在Oracle数据库上构建JAVA应用程序,首先需要了解JDBC驱动程序的相关知识。JDBC(Java Database Connectivity)是一种Java语言中用于执行SQL语句的API,而JDBCDriver是JDBC的一部分,提供了一种标准的方法,使得Java...
### 使用VB构建Internet应用 在信息技术领域,利用Visual Basic(简称VB)开发Internet应用程序是一种非常实用且高效的方法。本文将详细介绍如何使用VB构建Internet应用,包括相关知识点、技术要点及其实现过程。 ...
### 集成Flex, Spring, Hibernate 构建应用程序 #### 概述 随着互联网技术的不断进步,富互联网应用(Rich Internet Application, RIA)因其出色的表现力和用户体验成为了现代Web开发的重要趋势之一。Adobe Flex ...
构建安全的 Microsoft® ASP.NET 应用程序:前言 更新日期: 2004年04月20日 本指南的目标 本指南不是介绍安全性,也不是 Microsoft .NET Framework 的安全性参考材料;如果您要了解这方面的内容,请查看 MSDN 中的...
C# Web应用程序是基于.NET框架开发的Web应用,它利用ASP.NET技术来构建动态网站、Web服务和富交互式Web应用程序。本教程将带你走进C# Web开发的世界,通过深入理解C#语言基础和ASP.NET核心概念,你将能够创建功能...