利用JAX-WS开发Web服务

标签: 利用 jax ws | 发表时间:2013-03-24 22:35 | 作者:zhai56565
出处:http://blog.csdn.net

利用JAX-WS开发Web服务

       Web服务是一种经由HTTP与其他软件进行通信的软件。Java最激动人心的一个特性是用于XML Web服务的Java API(JAX-WS)。JAX-WS是一组Java类和包,他可以创建对Web服务发出请求的客户端,以及接受这些请求的服务。

       JAX-WS支持使用简单对象访问协议(SimpleObject Access Protocol,SOAP)和表述性状态转移(Representational State Transfer,REST)实现的Web服务。JAX-WS大大简化了支持这些协议的任务。程序员只需要创建Java对象,并调用方法来使用Web服务即可,其他事宜在幕后进行处理。

1、定义服务端点接口

       创建JAX-WS服务的第一步是创建服务端点接口(Service EndpointInterface),这是一个Java接口,它定义了客户端在使用Web服务时能够调用的方法。

       在接口定义方法时,跟在方法后面的是分号而不是将语句块括起来的“{}”字符。接口中没有定义方法的行为,而是由实施了该接口的类来处理。

       通常情况下,在被称为JAX-WS服务的方法前面添加一个额外的修饰词:@WebMethod用来注解。

       注解(annotation)是用来简化java代码的,是一种巧妙的注释(comment)形式,可以被Java解释器、编译器和编程工具所理解。注解可以定义不属于程序部分的程序信息,使得当程序在编译或运行时,这些程序信息能够触发行为。

       最常见的注释是@Override,它便是一个方法覆盖了超类的方法,例如:

@Override

public voidpaintComponent(Graphics comp){}

@WebMethod注解表示一个方法可以作为Web服务调用。下面是一个Web服务的代码:

import javax.jws.WebMethod;
import javax.jws.*;
import javax.jws.soap.*;
importjavax.jws.soap.SOAPBinding.*;
 
@WebService
 
@SOAPBinding(style =Style.RPC)
 
public interfaceSquareRootServer
{
    @WebMethod
    double getSqureRoot(double input);
    @WebMethod
    String getTime();
}

2、创建服务实现Bean

       实现了服务器端点接口的Java类被称为服务实现Bean(Service ImplementationBean)。在JAX-WS的学习过程中,遇到一些新奇的术语是不可避免的。

       下面是SquareRootServerImpl.java的源码:

import java.util.Date;
import javax.jws.WebService;
 
@WebService(endpointInterface= "com.java24hours.ws.SqureRootServer")
 
public classSqureRootServerImpl implements SquareRootServer{
 
    @Override
    public double getSqureRoot(double input) {
        return Math.sqrt(input);
    }
 
    @Override
    public String getTime() {
        Date now = new Date();
        return now.toString();
    }
}

可以看到SquareRootServerImpl类实现了SquareRootServer接口,这表示你要创建的类必须包含接口中的所有方法,而且每个方法都有适当的参数。

类中唯一比较新鲜的地方是后面的注解,它出现在类语句之前:

@WebService(endpointInterface= "com.java24hours.ws.SqureRootServer")

该注解表示,类是名为com.java24hours.ws.SquareRootServer的服务端点接口的服务实现Bean。必须使用完整的类名,其中包括其包的名字。

注意注解后面跟的不是分号,这与语句不同。

创建了以上两个类之后,即可准备启用该服务,以便其他软件来调用。

 

3、发布Web服务

       JAX-WS Web服务可以使用诸如BEA WebLogic、GlassFish、Jboss和Jetty这样的Java应用服务器来部署。如果在支持这些服务器的开发环境中创建了SquareRootServerWeb服务,此时就可以准备启用Web服务。

       SquareRootServerPublisher应用程序只需要两个步骤就可以处理该任务:

>载入实现了Web服务的类;

>将该对象发布到Internet。

Javax.xml.ws包中的EndPoint类有一个类方法publish(String , Object),它可以部署Web服务。该方法的一个参数是可以访问Web服务的网络地址,对该项目而言,该网络地址是 http://127.0.0.1:5335/service。该网络地址以主机名SingerFive打头,这被称为本地主机,因为该注记是你创建并运行Java程序的本地计算机。

网络地址的第二部分是本地主机的端口号,Web服务在该端口号等待连接。这里使用的端口号是5335,因为该端口号不太可能被计算机上其他Internet感知程序使用。

地址的最后一部分”/service”是路径。每一个Web服务必须有一个唯一的路径。如果在你的计算机上运行其他Web服务,则他们的路径不能与SquareRootServer相同。

为了部署Web服务,在com.java24hours.ws包中创建一个名为SquareRootServerPublisher的Java空文件,然后输入如下代码:

    public static void main(String[] args)

    {

         SquareRootServerImpl serverImpl = newSquareRootServerImpl();

        Endpoint.publish("http://127.0.0.1:5335/service", serverImpl);

     }

运行该程序时,它将在计算机上的5335端口等待连接。只要程序支持SOAP或基于REST的Web服务,则无论它是使用Java语言还是其他语言编写的,都可以调用其中的Web服务的方法。只要你的Web服务位于Internet中,任何连接到Internet的软件都可以调用其方法。

4、使用Web服务描述语言文件

       在启用该Web服务之前,你可以使用任务的Web浏览器来测试SquareRootServerPublisher应用程序的可用性。

       打开浏览器输入网址 http://127.0.0.1:5335/service?wsdl,你将看到浏览器显示程序清单文件如下,该文件由刚才创建的应用程序提供。

      

   
  <?xml version="1.0" encoding="UTF-8" ?> 
- <!--  Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. 
  --> 
- <!--  Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. 
  --> 
- <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.java24hours.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.java24hours.com/" name="SquareRootServerImplService">
  <types /> 
- <message name="getSqureRoot">
  <part name="arg0" type="xsd:double" /> 
  </message>
- <message name="getSqureRootResponse">
  <part name="return" type="xsd:double" /> 
  </message>
  <message name="getTime" /> 
- <message name="getTimeResponse">
  <part name="return" type="xsd:string" /> 
  </message>
- <portType name="SquareRootServer">
- <operation name="getSqureRoot">
  <input wsam:Action="http://ws.java24hours.com/SquareRootServer/getSqureRootRequest" message="tns:getSqureRoot" /> 
  <output wsam:Action="http://ws.java24hours.com/SquareRootServer/getSqureRootResponse" message="tns:getSqureRootResponse" /> 
  </operation>
- <operation name="getTime">
  <input wsam:Action="http://ws.java24hours.com/SquareRootServer/getTimeRequest" message="tns:getTime" /> 
  <output wsam:Action="http://ws.java24hours.com/SquareRootServer/getTimeResponse" message="tns:getTimeResponse" /> 
  </operation>
  </portType>
- <binding name="SquareRootServerImplPortBinding" type="tns:SquareRootServer">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" /> 
- <operation name="getSqureRoot">
  <soap:operation soapAction="" /> 
- <input>
  <soap:body use="literal" namespace="http://ws.java24hours.com/" /> 
  </input>
- <output>
  <soap:body use="literal" namespace="http://ws.java24hours.com/" /> 
  </output>
  </operation>
- <operation name="getTime">
  <soap:operation soapAction="" /> 
- <input>
  <soap:body use="literal" namespace="http://ws.java24hours.com/" /> 
  </input>
- <output>
  <soap:body use="literal" namespace="http://ws.java24hours.com/" /> 
  </output>
  </operation>
  </binding>
- <service name="SquareRootServerImplService">
- <port name="SquareRootServerImplPort" binding="tns:SquareRootServerImplPortBinding">
  <soap:address location="http://127.0.0.1:5335/service" /> 
  </port>
  </service>
  </definitions>
关闭提示 关闭
确 认 取 消



 

该文件是一个使用Web服务描述语言(Web Serveice Description Language , WSDL)编写的服务合约,WSDL是一个XML方言,它可以清楚地说民Web服务的运行方式,一遍服务器和客户端能够充分使用它。

在创建JAX-WS服务和客户端来访问Web服务时,没有必要必须理解WSDL。当然,最好还是看一下该文件的内容,以对基于SOAP和REST的Web服务的运行方式有一个理解。

WSDL之所以被称为服务合约,是因为他规定了访问Web服务的方式、可以与服务交换的信息,以及所传输信息的数据类型。

WSDL合约的第13~22行定义了Web服务的方法、这些方法的参数,以及作为响应返回的数据。查看这些代码行,看是否能够找到getSquareRoot()方法所在的位置。该方法接受一个double型参数,并返回一个double值。

      

5、创建Web服务客户端

下面我们将创建SquareRootClient应用程序,它可以调用你前面创建的Web服务的方法。当然该服务必须处于运行状态,以便客户端与其连接。

由于像JAX-WS库这样的Web服务技术都支持SOAP、REST、HTTP和XML等标准,因此不一定非要使用Java程序来连接该Web服务。

JAX-WS库在javax.xml.ws包中提供了Service类,这是一个可以创建调用Web服务的对象的工厂(factory)。

类方法Service.create(URL, QName)创建了工厂,其参数URL和Qname分别来自java.net和java.xml.namespace。

URL必须是Web服务的WSDL合约地址:

URL url = new URL(“http://127.0.0.1:5335/service?wsdl”);

Qname是一个限定名称,之二十一个与Web服务提供者关联起来的XML标识符。限定名称包含命名空间URI和本地的标识符。

命名空间URI和URL相似,但是不一定非要作为网络地址来使用。由于我们创建的Web服务的包名称是com.java24hours.ws,在Java中,该名称一般与Internet主机名关联起来,用于该Web服务的命名空间时URI是 http://ws.java24hours.com

该Web服务的本地标识符是服务实现Bean的名字,而后面添加有Service单词。下面是一个创建限定名称的语句:

QName qname = new Qname( http://ws.java24hours.com/ , “SquareRootServiceImplService”);

使用URL和限定名称则可以创建Web服务客户端工厂:

Service service =Service.create(url , qname);

该工厂有getPort(Class)方法,这个方法创建了指定类的独享。为了对作为方法参数使用的Java类进行识别,可以使用名为class的类变量。例如:

SquareRootServer srs =service.getPort(SquareRootServer.class);

使用SquareRootServer.class作为参数来调用getProt()方法时,将导致工厂创建一个SquareRootServer对象。该对象存储在src变量中。

可以在Java的其他对象中调用SquareRootServer对象的方法:

System.out.println(srs.getTime());

System.out.println(srs.getSqaureRoot(625D));

JAX-WS库将这些方法调用作为SOAP消息打包,然后通过Internet发送到Web服务,然后进行方法调用。

当服务响应这些调用时,它将响应打包为SOAP消息,然后通过Internet发送回去,之后再被转换为Java数据类型。

创建一个名为SquareRootClient的Java文件:

public classSquareRootClient {
    public static void main(String[] args)throws MalformedURLException
    {
        URL url = newURL("http://127.0.0.1:5335/service?wsdl");
        QName qName = newQName("http://ws.java24hours.com/","SquareRootServerImplService");
        Service service = Service.create(url,qName);
        SquareRootServer srs =service.getPort(SquareRootServer.class);
       
        System.out.println(srs.getTime());
       System.out.println(srs.getSqureRoot(625D));
    }
}

运行该客户端应用程序时,如果SquareRootPublisher应用程序也已经处于运行状态,会看到下图所示输出结果:


6、总结

在Java中,有一类API用作基于XML的RPC(JAX-RPX),JAX-RPC是一种允许Java对象经由Internet向另外一个对象进行远程过程调用(RPC)的技术。而JAX-WS包和类的集合则继承了该API。

以上讲解了使用JAX-WS来创建和使用Web服务的4个步骤:为服务创建一个借口(服务端点接口)、实现该服务(服务实现Bean)、在Internet上发布服务,以及创建客户端访问该服务。

 

 

 

作者:zhai56565 发表于2013-3-24 22:35:29 原文链接
阅读:0 评论:0 查看评论

相关 [利用 jax ws] 推荐:

利用JAX-WS开发Web服务

- - CSDN博客推荐文章
利用JAX-WS开发Web服务.        Web服务是一种经由HTTP与其他软件进行通信的软件. Java最激动人心的一个特性是用于XML Web服务的Java API(JAX-WS). JAX-WS是一组Java类和包,他可以创建对Web服务发出请求的客户端,以及接受这些请求的服务.        JAX-WS支持使用简单对象访问协议(SimpleObject Access Protocol,SOAP)和表述性状态转移(Representational State Transfer,REST)实现的Web服务.

WebService之JAX-WS、CXF、Spring3.0+

- - 博客园_首页
          面对工作的需要,web服务这一块一直都在身边转悠着. 既然工作中需要这些,作为程序员就应该去了解和学习. 下面主要简述采用CXF+Spring+JAX-WS来发布WebService服务,以及创建客户端调用服务.          1、先了解关于WebService的相关概念以及一些专有名词的解释:.

cxf + spring 的WS Security示例

- - RSS - IT博客云
WSPasswordCallback的 passwordType属性和 password属性都为null,你只能获得用户名(identifier),一般这里的逻辑是使用这个用户名到数据库中查询其密码,然后再设置到 password属性,WSS4J会自动比较客户端传来的值和你设置的这个值. 你可能会问为什么这里CXF不把客户端提交的密码传入让我们在 ServerPasswordCallbackHandler中比较呢.

JAX-RS 从傻逼到牛叉 5:资源的动态定位

- - BlogJava-首页技术区
目前我们的电影服务只提供了对电影信息的访问服务,现在我们要再增加两项级服务,分别用来访问导演和演员信息. 加上原先的电信信息服务,我们把 URI 统一放到. /ms/rest/service/ 的子路径下. 最先想到的方法就是为这三个 URI 分别写 JAX-RS 服务:. // 此处省略若干行 } @Singleton @Path("service/director") public class DirectorService {.

SOAP WebService以CXF实现WS-Security之xml签名及加密

- - 编程语言 - ITeye博客
接上篇,记录一下使用apache cxf和spring使用自签名数字证书实现WebService服务端及客户端的xml签名、加密以及解密和签名验证;. 这里仅针对客户端加密和签名并在服务端实现解密及签名验证的单向认证的情形,双向认证可以参照官方sample改进;. 客户端使用客户端私钥进行消息签名、客户端使用服务端公钥消息加密;.

JAX-RS 从傻逼到牛逼 2:开发一个简单的服务

- 时金魁 - BlogJava-首页技术区
JAX-RS 使用注解进行配置,所以用它开发 REST 风格的服务非常简单. 楼主在本文用一个小例子来说明 JAX-RS 的基本用法. 假设楼主要开发一个小电影服务,客户端可以通过请求 URI 对电影进行 CRUD 操作. 为简明起见,这儿不使用数据库,只在内存中模拟. 先用一个非常简单的 Movie 类,在后续的文章中根据情况逐步扩充:.

利用sockstunnel翻越

- - 0.618網絡空間
首先在你的linux vps上搭建python環境(一般來說,linux vps都已搭好了python 環境). 然後運行如下命令(假設你在/root下):. 這樣在/root/下,就生成了privkey.pem和cacert.pem. 修改sslserver.py裏的. keyfile="privkey.pem",為.

转角的空间利用

- Ivy - IDSOO
拐角的空间如果不充分利用似乎有一些浪费. 日本的设计工作室Torafu Architects设计的这个隔板巧妙地利用了拐角,搭建了一个可以放置物品的平台,设计实用、美观、大方.

旧灯泡的再利用

- Jimmy - 微奇生活
生活水平提高了,家家户户也用上了节能灯,那些废旧的白炽灯泡如何利用呢. 看看下面这些妙点子吧,可以种盆栽,做工艺品,还能用来养金鱼~~灯泡还会跳舞呢. 简洁的线圈灯:Coil Lamp. 微博:@新浪 | @腾讯     订阅:Google | 九点 | QQ | 鲜果 | 有道 | 邮箱.

[译]jboss漏洞利用

- - 互联网 - ITeye博客
原文地址:http://resources.infosecinstitute.com/jboss-exploitation/. JBoss Application Server是一个基于Jave EE的web应用服务器. 如果Jboss没有正确配置,它会允许攻击者进行各种恶意攻击. 由于JMX console可以通过端口8080远程访问,攻击者和恶意用户可以通过使用Jboss console中的DeploymentScanner功能部署他们自己的WAR(web archive)文件或shell脚本.