Web 服务
基 于 XML 的数据通常被作为 Web 服务之间互相调用的标准的数据传输文件格式。Java SE 6 SDK 中基于 XML
的解析技术,也提供了 Web 服务的 API 支持。和较早的 JDK 5 相比,新版本的 JDK Web 服务功能更改了名称 —— 从
JAX-RPC 变成 JAX-WS。JDK 5 只支持基于 remote-procedure-call 的 Web 服务,JDK 6
在此基础上,还支持基于 SOAP message 的 Web 服务实现。下面将给出一个例子,基于 SOAP message,实现一个简单的
Web 服务。
-
清单 9
给出了开发一个 Web services EndPoint 的代码。
清单 9. 一个 Web service‘Hello’服务
package hello;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.ws.Endpoint;
@WebService
public class Hello {
@WebMethod
public String hello(String name) {
return "Hello, " + name + "\n";
}
public static void main(String[] args) {
// create and publish an endpoint
Hello hello = new Hello();
Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", hello);
}
}
|
-
使用 apt 编译 Hello.java,产生辅助文件:
apt -d sample example/Calculator.java
|
运行完这条命令之后,example 目录下面多出了一个 jaxws 子目录如 图 6
所示。Apt 工具在该目录里生成了发布 Hello Web service 所必需的两个辅助文件。
图 6. example 目录
-
发布 Hello Web service:
java -cp sample hello.Hello
|
将浏览器指向 http://localhost:8080/hello?wsdl
会产生如 图 7
所示页面。
图 7. 发布的 Hello Web service
Java SE 6 SDK 内嵌了一个轻量级的 HTTP Server,方便开发者验证简单的 Web service 功能。通过以上三步,一个 Web service Endpoint 就部署完成,下面将开发一个调用 Hello 服务的客户端。
-
为 Web 服务的客户端产生存根文件:
wsimport -p sample -keep http://localhost:8080/hello?wsdl
|
这将会在 sample 目录下产生如 图 8
所示的文件。这一步实际是根据上面 URL 指向的 WSDL 文件,通过 JAXB 技术,生成了相应的 Java 对象。
图 8. wsimport 产生的文件
-
开发,编译,运行 Web 服务客户程序。清单 10
给出了使用 Hello 服务的客户程序。
清单 10. 使用 Hello 服务的客户程序
package sample;
class HelloApp {
public static void main(String args[]) {
HelloService service = new HelloService();
Hello helloProxy = service.getHelloPort();
String hello = helloProxy.hello("developer works");
System.out.println(hello);
}
}
|
图 9
是编译并运行该客户程序产生的结果:
图 9. 调用 Hello 服务
可 以说在 Java SE 6 SDK 中,Web
服务的开发过程被大大简化了。原来开发中需要手工重复劳动产生的文件,可以使用工具自动生成。比如 WSDL 文件可以自动生成,和 WSDL 绑定的
Java 对象也自动生成,部署(本文仅指 JDK 提供的轻量 HTTP server 部署环境)也大大简化。这些全部归功于 JDK 6
中引入的一些新的 JSR 实现,即一些 API 和工具。表 2
给出了 JDK6 中为 Web 服务 API 提供支持的包。
表 2. JDK 中提供 Web 服务 API 支持的包
JSR
Package
JSR 224
Java API for XML-Based Web Services 2.0
|
javax.xml.ws |
javax.xml.ws.handler |
javax.xml.ws.handler.soap |
javax.xml.ws.http |
javax.xml.ws.soap |
javax.xml.ws.spi |
JSR 222
Java Architecture for XML Binding (JAXB) 2.0
|
javax.xml.bind |
javax.xml.bind.annotation |
javax.xml.bind.annotation.adapters |
javax.xml.bind.attachment |
javax.xml.bind.helpers |
javax.xml.bind.util |
JSR 181
Web Services Metadata for the Java Platform
|
javax.jws |
javax.jws.soap |
除此之外 JDK 6 还提供了一些工具,包括 wsgen, wsimport 以及 Java 调用的轻量级 HTTP server。API 和工具联合提供了一个简单的 Web services IDE 开发环境,可以简化 Web 服务应用的开发。
Java class 和 XML 文件的绑定
从 上一段关于 Web 服务的叙述中,我们能够发现开发和部署 Web 服务的过程中存在多次 Java 对象和 XML
文件转化的过程。比如开发和部署服务的时候,将一个 Web Service EndPoint 发布成为一个 WSDL,或者使用服务的时候,将一个
WSDL 文件转换成一组 Java 对象。所有的转换,都是通过工具自动完成的。这里存在一些问题,Java 对象的类型转换成 XML
元素是需要符合一定的标准,还是随意转换呢?如果按照标准转换,那么这个标准是什么样子的?比如 Java 中的 int 类型是应该变成 <int></int>
呢,还是 <integer></integer>
。如 表 2
列出,JSR222- Java Architecture for XML Binding (JAXB) 2.0 标准为这些问题给出了一个规范的解答。
首先示范一个简单的例子,将根据一个 XML 文件的 schema,转换成 Java 对象。还是以 清单 6
中的数据文件为依据。构造一个 XML schema 文件,如 清单 11
所示。要运行这个例子,首先需要下载一个 JAXB Reference Implementation jar(下载请参见 参考资源
),并将该 jar 文件加入到 classpath 中。
清单 11. 用于绑定的 workcontactinfo.xsd 文件
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="workcontactinfo" type="workcontactinfo" />
<xsd:complexType name="workcontactinfo">
<xsd:sequence>
<xsd:element ref="Location" maxOccurs="1" minOccurs="1" />
<xsd:element ref="Postal" maxOccurs="1" minOccurs="1" />
<xsd:element ref="tel" maxOccurs="1" minOccurs="1" />
<xsd:element ref="Appellation" maxOccurs="1" minOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="tel" type="tel" />
<xsd:complexType name="tel">
<xsd:sequence>
<xsd:element ref="fix" maxOccurs="1" minOccurs="1" />
<xsd:element ref="mobile" maxOccurs="1" minOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="Location" type="xsd:string" />
<xsd:element name="Postal" type="xsd:string" />
<xsd:element name="Appellation" type="xsd:string" />
<xsd:element name="fix" type="xsd:string" />
<xsd:element name="mobile" type="xsd:string" />
</xsd:schema>
|
- 运行命令
xjc workcontactinfo.xsd
。将会在当前目录下生成一个 generated 子目录。
- 运行命令
javac generated\*.java
,编译所有生成的 Java 文件。
- 操作生成的 Java 对象。清单 12
给出了一个操作生成的 java 对象的例子。要注意,一定要先将 JAXB Reference Implementation jar 放到 classpath 中。
清单 12. 调用生成的 Java 对象
import generated.*;
import java.io.FileOutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class JAXBTest {
public static void main(String[] args) {
try {
JAXBContext jContext = JAXBContext.newInstance("generated");
ObjectFactory factory = new ObjectFactory();
Workcontactinfo contactinfo = (Workcontactinfo) (factory
.createWorkcontactinfo());
contactinfo.setAppellation("Mr. Wang");
contactinfo.setLocation("Shanghai-shuion-333");
contactinfo.setPostal("200020");
Tel tel = (Tel) (factory.createTel());
tel.setFix("123456");
tel.setMobile("1376666666");
contactinfo.setTel(tel);
Marshaller marshaller = jContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
marshaller.marshal(contactinfo, new FileOutputStream(
"workcontactinfo1.xml"));
System.out.println("java tree converted into xml & filed");
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
运行这个程序,就能生成一个 XML 数据文件,如 清单 13
。
清单 13. XML 数据文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workcontactinfo>
<Location>Shanghai-shuion-333</Location>
<Postal>200020</Postal>
<tel>
<fix>123456</fix>
<mobile>1376666666</mobile>
</tel>
<Appellation>Mr. Wang</Appellation>
</workcontactinfo>
|
回顾一下 Web 服务的 WSDL 文件,如 图 5
所示,是一个符合 W3C XMLSchema 规范的 schema 文件,以及整个过程中生成的 Java 类,我们应该能更好的理解 Web
服务开发,部署,使用的全过程。首先 JDK 6 提供的工具 apt 根据 Web Service EndPoint 中相关的注释生成一些与
WSDL schema 绑定的 Java 类。察看这些类可以发现,它们与 JAXB 例子中 generated 目录下生成的 Java
文件十分相似。接着通过 HTTP 服务将这个 WSDL schema 文件发布出来。然后通过 wsimport 工具,生成一个 Web
服务的客户运行时代理,相当于 清单 12
的功能。最终 Web 服务的用户程序同运行时代理交互,该代理生成并传递形式如 清单 13
的 XML 数据文件。图 10
结合 表 2
给出了 Web 服务开发到使用整个周期的工作流和涉及到的 JDK 包。
图 10. Web 服务开发部署流程中 XML 技术的应用
总结
比 较前一个版本的 JDK,新版本对 XML 处理技术进行了扩展。包括新加入的 StAX 和 JAXB。基于这些新的 XML
数据处理技术,JDK 6 对 Web 服务的支持也得到了大大的增强。这些增强体现在引入了一些注释和
API,增加了更多的工具,可以自动化大部分开发和部署的工作。对于 XML 应用开发者来说,有更多更有力地技术可以选用。对于 Web
服务提供者来说,开发工具更为强大,开发流程更为简化,工作效率得到提高。而对于 Web 服务的使用者,更多的底层细节被屏蔽。可以说,新版 JDK
在对 XML 相关应用开发上的支持,较前一个版本有了很大提升。
相关推荐
Java SE 6(标准版6)是Java平台的一个重要版本,它引入了许多新特性,特别是在XML API和Web服务方面。这些增强为开发人员提供了更强大、更高效的工具,以处理XML文档并构建基于Web的服务。 1. **XML API增强**: ...
Java SE 6,也被称为Java Development Kit (JDK) 6,是Java平台的一个重要版本,带来了许多新特性和改进,极大地提升了开发人员的工作效率和应用程序的性能。在这个版本中,Oracle公司(当时还是Sun Microsystems)...
总的来说,Java SE 6 在 HTTP 相关的特性上有了显著的提升,不仅增强了网络认证的便利性,还提供了轻量级 HTTP 服务器和更完善的 HTTP Cookie 管理,以及对网络接口和 DNS 国际化的支持,大大提升了 Java 在 Web ...
本书聚焦于Java语言中更高级的特性,包括下列内容:流与文件、网络、数据库编程、XML、JNDI与LDAP、国际化、高级 GUI组件、Java 2D、JavaBeans、安全、RMI与Web服务、高级AWT、注解、本地方法。
Java SE 6的特性包括但不限于以下几点: 1. **语言增强**:Java 6引入了改进的语法,如自动资源管理(try-with-resources),这使得资源清理更加方便,降低了内存泄露的风险。另外,枚举类型的for-each循环也在此...
### Java SE 6: Top 10 Features #### 1. Scripting支持 在Java SE 6中,Scripting的支持成为了一个重要的新功能。这一功能的引入为开发者提供了结合不同语言优势的机会,允许他们在同一应用中混合使用多种编程...
Java SE(标准版)与Java Web是Java编程领域中的两个重要分支,它们分别代表了Java在桌面应用和网络服务开发中的应用。理解这两者之间的差异和联系对于学习Java技术至关重要。 **Java SE(标准版)** Java SE是Java...
- **Java SE 6 的新特性与改进** - **面向对象编程基础** - **核心类库详解** - **Swing GUI 编程** - **AWT GUI 编程** - **事件处理模型** - **多线程编程** - **异常处理** - **输入/输出流** - **网络编程** - *...
本书聚焦于Java语言中更高级的特性,包括下列内容:流与文件、网络、数据库编程、XML、JNDI与LDAP、国际化、高级GUI组件、Java 2D、JavaBeans、安全、RMI与Web服务、高级AWT、注解、本地方法。 关于Java基础知识的...
Java EE 6为企业级应用开发提供了强大的工具和框架,而Java SE 8则通过引入新特性提升了开发者的生产力和代码质量。对于Java开发者来说,理解和掌握这两个版本的核心特性是必不可少的。通过深入学习和实践,可以提升...
Java SE 6(也被称为Java 6)在2006年发布,带来了许多增强和新特性,这些对开发者和用户都至关重要。以下是一些关键知识点: 1. **改进的性能**:Java SE 6通过优化垃圾回收机制、JIT编译器和内存管理提高了整体...
在JAVA6中,引入了许多新特性,其中一项重要的更新就是JAXB(Java Architecture for XML Binding)的集成。JAXB是一个用于将Java对象和XML数据进行绑定的框架,它允许开发者在Java应用程序中直接操作对象,而无需...
《Java语言规范,Java SE 6版》是Java开发者的重要参考文档,它详细定义了Java编程语言的语法、语义以及编程模型。这份规范对于理解Java 6的关键特性至关重要,帮助程序员编写出高效、可维护的代码。以下将对其中的...
本书聚焦于Java语言中更高级的特性,包括下列内容:流与文件、网络、数据库编程、XML、JNDI与LDAP、国际化、高级 GUI组件、Java 2D、JavaBeans、安全、RMI与Web服务、高级AWT、注解、本地方法。
4. **NIO.2文件系统API**:Java 7引入了NIO.2,但JDK 6u26通过一些扩展支持了部分新特性,如异步文件操作和更好的路径处理,使得文件I/O更加灵活和强大。 5. **Java Web Start和Applet支持**:JDK 6对Java Web ...
7. **Web服务和XML处理**:Java SE 6提供了更强大的Web服务支持,如JAX-WS 2.0,简化了SOAP服务的开发。另外,对XML处理的库如StAX和Woodstox也有所增强,使XML数据处理更加高效。 8. **Java EE集成**:虽然Java SE...
Java SE 6,全称Java ...无论是在桌面应用、Web服务还是企业级系统中,Java SE 6都展现出了其强大的适应性和稳定性。通过深入学习和理解这个版本,开发者能够更好地掌握Java技术,编写出高质量、高性能的应用程序。
Java Platform Standard Edition 8(Java SE 8)是Java开发工具包的一个重要版本,它为开发者提供了构建桌面应用、Web应用以及分布式系统的基础框架。Java SE 8的发布标志着Java语言的重大变革,引入了许多新特性,...
### Java EE 6 新特性详解 #### Java EE 发展历程概览 自1998年12月8日发布以来,Java EE(最初称为 J2EE)已历经十余年的发展,成为了搭建具备高可伸缩性、灵活性及易维护性的商务系统的首选平台。随着技术的不断...