`

webservice 小结之jax-ws(2)

阅读更多
好了,开始动手做个简单例子吧:

创建jax-ws service:

输入项目名称,framework选择JAX-WS,项目建好了之后你就会发现其实webservice项目就是一个普通的web项目。

新建业务处理类:


业务处理类要满足以下条件:
   1、这个类必须是public类
   2、这些类不能是final的或者abstract
 3、这个类必须有一个公共的默认构造函数
 4、这个类绝对不能有finalize()方法
   5、实现方法必须非static

新建webservice service
选中项目点击右键new->new webservice,如果找不到这个选项点击other查找下。

选择对应的project,framework还是选择jax-ws,strategy选择下面的create web service from java bean。这个strategy指的是webservice的生成策略,有2中方式,基于java bean 和基于wsdl文件的。对应着webservice的2种设计原则,一种是code first,另外一种是wsdl first。
点击next进入下一步。


选择对应的业务处理类,soap style/use 选择默认的,MTOM Support 是实现webservice 之间的文件传输。如果要生成wsdl文件就勾选 generate wsdl in project。下面的三个选项可以设置webservice 的命名空间,服务名以及服务端口
点击finish
系统会自动生成webservice 代理类和相应的wsdl文件。为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。这些数据类型用来定义web service方法的参数和返回指。也就是对应的xsd文件。然后需要添加对应library然后整个系统的结构为:


然后将程序放到tomcat服务器,即可运行,例如:http://127.0.0.1:8088/jaxwsService/HelloWordPort?wsdl 如果能访问到对应wsdl文件就表示这个webservice发布成功。

可以看下wsdl文档内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.3-hudson-390-. -->
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.test.com/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWordService" targetNamespace="http://ws.test.com/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://ws.test.com/" schemaLocation="HelloWordService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="add">
    <part element="tns:add" name="parameters"/>
  </message>
  <message name="addResponse">
    <part element="tns:addResponse" name="parameters"/>
  </message>
  <message name="hello">
    <part element="tns:hello" name="parameters"/>
  </message>
  <message name="helloResponse">
    <part element="tns:helloResponse" name="parameters"/>
  </message>
  <portType name="HelloWordDelegate">
    <operation name="add">
      <input message="tns:add"/>
      <output message="tns:addResponse"/>
    </operation>
    <operation name="hello">
      <input message="tns:hello"/>
      <output message="tns:helloResponse"/>
    </operation>
  </portType>
  <binding name="HelloWordPortBinding" type="tns:HelloWordDelegate">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="add">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="hello">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="HelloWordService">
    <port binding="tns:HelloWordPortBinding" name="HelloWordPort">
      <soap:address location="http://localhost:8080/jaxwsService/HelloWordService"/>
    </port>
  </service>
</definitions>


对照着简介一章所介绍wsdl文档结构看下。
第一部分是 <types>元素,主要定义webservice的数据类型,它实际是引用了另外一个xsd文件,xsd文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.test.com/" targetNamespace="http://ws.test.com/" version="1.0">

  <xs:element name="add" type="tns:add"/>

  <xs:element name="addResponse" type="tns:addResponse"/>

  <xs:element name="hello" type="tns:hello"/>

  <xs:element name="helloResponse" type="tns:helloResponse"/>

  <xs:complexType name="hello">
    <xs:sequence>
      <xs:element minOccurs="0" name="arg0" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="helloResponse">
    <xs:sequence>
      <xs:element minOccurs="0" name="return" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="add">
    <xs:sequence>
      <xs:element name="arg0" type="xs:int"/>
      <xs:element name="arg1" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="addResponse">
    <xs:sequence>
      <xs:element name="return" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

如果细心的朋友大家就会发现在new webservice那一步时,有个soap style/use 选项你可以看到myeclipse 6.5中默认的就是上面所说的 document/wrapped样式,而xsd里面也主要是使用xs:complexType节点来描述数据类型。
然后在接着看wsdl中的<message> 元素你可以看到message元素定义之后主要是使用在<portType> 元素中。
而<portType> 元素则可以告诉大家这个webservice有几个方法。方法名叫什么有没有返回值等等。<binding> 元素则是为每个端口定义消息格式和协议细节。你可以找到style="document"以及对应use="literal"等字样。这就规定了该webservice使用哪种编码样式来进行SOAP的编码。

下面来建一个webservice 客户端来模拟调用下。也是用myeclipse 6.5来进行开发。

新建jax-ws  client
新建个普通的java project,并建好对应包。点击右键选择 new web service client,选择对应项目,选择jax-ws然后点击next.

选择wsdl URL,然后将wsdl地址复制上去,选择生成client类放入哪个包.点击next

下个界面是进行wsdl的验证。如果没有报错直接点击next。添加对应所需要的library,点击finish。client 项目至此新建完成,项目结构为:

新建client 调用类:


至此大功告成,整个示例就完成了。但是咱们也别歇着,回头看看jax-ws的实现原理。
1)webservice 服务器端发布一个webservice项目,这时候会为这个webservice项目分配一个servlet,大家可以看下webservice服务器端项目下web.xml,然后根据不同的webservice分配不同的<url-pattern>,大家可以看下<url-pattern>里面的值其实就是webservice 对应的port.
2)然后webservice clinet会生成代理类,然后利用代理类发送SOAP消息去请求webservice 服务器端的servlet,而servlet会根据不同的port去请求不同的webservice。

流程图如下:


可能有些同学还会问下这个问题。就是说你服务器端和客户端都用的是jax-ws,所以根据wsdl在myeclipse中就能自动生成客户端代码,但是如果服务器端用的是其他框架就不能自动生成客户端代码怎么办?别着急。既然有自动生成就有手动生成的。而手动生成是不管服务器端是使用框架的。

wsgen
wsgen是在JDK的bin目录下的一个exe文件(Windows版),该命令的主要功能是用来生成合适的JAX-WS。它读取Web Service的终端类文件,同时生成所有用于发布Web Service所依赖的源代码文件和经过编译过的二进制类文件。这里要特别说明的是,通常在Web Service Bean中用到的异常类会另外生成一个描述Bean,如果Web Service Bean中的方法有申明抛出异常,这一步是必需的,否则服务器无法绑定该对像。此外,wsgen还能辅助生成WSDL和相关的xsd文件。wsgen从资源文件生成一个完整的操作列表并验证web service是否合法,可以完整发布。
命令参数说明:
 -cp 定义classpath
 -r 生成 bean的wsdl文件的存放目录
 -s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)
 -d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)

命令范例:wsgen -cp ./bin -r ./wsdl -s ./src -d ./bin -wsdl org.jsoso.jws.server.Example

wsimport
wsimport也是在JDK的bin目录下的一个exe文件(Windows版),主要功能是根据服务端发布的wsdl文件生成客户端存根及框架,负责与Web Service 服务器通信,并在将其封装成实例,客户端可以直接使用,就像使用本地实例一样。对Java而言,wsimport帮助程序员生存调用web service所需要的客户端类文件.java和.class。要提醒指出的是,wsimport可以用于非Java的服务器端,如:服务器端也许是C#编写的web service,通过wsimport则生成Java的客户端实现。
命令参数说明:
 -d 生成客户端执行类的class文件的存放目录
 -s 生成客户端执行类的源文件的存放目录
 -p 定义生成类的包名

命令范例:wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl
  • 大小: 88.6 KB
  • 大小: 127.9 KB
  • 大小: 9.7 KB
  • 大小: 18.5 KB
分享到:
评论

相关推荐

    webservice Demo注解+jax-ws

    在这个“webservice Demo注解+jax-ws”示例中,我们将深入探讨Web服务的注解使用以及基于Java API for XML Web Services (JAX-WS)的实现。 首先,让我们了解一下JAX-WS。它是Java平台的标准组件,用于创建和处理Web...

    jax-ws webservice demo

    基于jax-ws 实现的web service client和server端的demo程序。 注:如果使用的是 myeclipse 时 server 部署到tomcat 启动的时候会报错 解决办法:找到myeclipse安装目录下的 plugins 目录里 查找 webservices-rt.jar,...

    webservice之jax-ws

    【标题】:Web服务之Java API for XML Web Services (JAX-WS) 【内容详解】 JAX-WS,全称为Java API for XML Web Services,是Java平台上的一个标准,用于构建和部署基于SOAP(Simple Object Access Protocol)的...

    基于JDK自带的Web服务JAX-WS实现WebService的简单示例

    Java 基于第三方插件实现WebService实在麻烦,尤其是要添加几十M的Jar包...还好,自从JDK 1.6开始,Java自身已经支持WebSeervice的开发即JAX-WS,附件是一个简单的示例,供入门参考。注意,JDK环境要求1.6及以上版本。

    Jax-ws所需要的JAR包

    2. **jaxb-api.jar**:Java Architecture for XML Binding (JAXB) API,用于XML和Java对象之间的转换,是JAX-WS的重要依赖。 3. **cxf-rt-frontend-jaxws.jar** 和 **cxf-rt-transports-http.jar**:Apache CXF是一...

    如何基于JAX-WS开发一个WebService实例

    本篇将深入讲解如何基于JAX-WS开发一个WebService实例。 首先,让我们了解JAX-WS的基本概念。JAX-WS提供了一种简单的方式来创建SOAP(Simple Object Access Protocol)Web服务,它集成了Java SE和Java EE平台,使得...

    jax-ws api jar包

    这个jar文件是开发基于JAX-WS的Web服务所必需的依赖之一。以下是关于JAX-WS的一些核心知识点: 1. **服务端开发:** - **@WebService**:这是JAX-WS中的一个关键注解,用于标记一个Java类作为Web服务的接口。它...

    jax-ws实现webservice调用

    使用JAX-WS,你可以通过添加注解(如`@WebService`)或使用XML配置文件来部署服务。对于简单的应用,注解方式更常见。例如,部署到Tomcat服务器时,只需确保服务类位于正确的包结构中,然后启动服务器。 ### 4. ...

    JAX-WS_WebService.rar

    JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用

    MyEclipse8_0中使用 JAX-WS 部署 WebService 实例

    MyEclipse8_0中使用 JAX-WS 部署 WebService 实例 - 外衣 - 博客频道 - CSDN_NET.mht

    jax-ws发布webservice

    2. **生成WSDL**:JAX-WS会自动生成一个WSDL(Web Service Description Language)文件,描述服务的接口、消息格式和地址等信息。 3. **发布服务**:使用`Endpoint.publish()`方法将服务部署到指定的URL。 4. **...

    JAX-WS2.0 API

    `jaxws-2_0-pfd-spec-api.jar`可能包含了JAX-WS 2.0规范的API类库,供开发者在应用中导入并使用。在实际开发中,还需要相应的实现库,如`metro.jar`,来处理具体的Web服务交互。 **使用场景:** 1. **企业级应用...

    JAX-WS 2.2 RI所有相关jar包

    JAX-WS 2.2 RI 所包含的JAR包集合,包含25个JAR包,列表如下: FastInoset.jar gmbal-api-only.jar ha-api.jar javax.annotation.jar javax.mail_1.4.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jaxws-api...

    Jax-ws RI.zip

    Java API for XML Web Services (JAX-WS) 是Java平台上的一个标准,用于构建和部署Web服务。JAX-WS RI(Reference Implementation)是这个规范的官方参考实现,它提供了开发、测试和运行基于SOAP(Simple Object ...

    jax-ws webservice简单demo

    在这个"jax-ws webservice简单demo"中,我们将探讨JAX-WS的基础知识、如何创建一个简单的Web服务以及如何测试这个服务。 首先,JAX-WS的核心组件包括: 1. **Service端点接口(SEI, Service Endpoint Interface)**...

    metro-jax-ws-jaxws221x.zip

    【标题】"metro-jax-ws-jaxws221x.zip" 提供的是一个关于JAX-WS(Java API for XML Web Services)的开发示例,其中包含了JAX-WS 2.2.1版本的相关组件和库文件。这个压缩包是针对Java开发者设计的,用于帮助他们理解...

    jax-ws2.1.zip

    2. **webservices-extra.jar** - 此文件可能包含JAX-WS的一些扩展或额外功能,如WS-I(Web Services Interoperability)支持,或者对特定Web服务协议的实现,例如WS-Security(Web Services Security)或其他厂商...

    java WebService Jax-WS创建

    【Java WebService Jax-WS 创建】是Java中创建Web服务的一种常见方式,主要用于构建基于SOAP(Simple Object Access Protocol)的Web服务。JAX-WS(Java API for XML Web Services)是Java EE 5及更高版本中提供的...

    基于JAX-WS2.2开发WebService所需jar资源包

    使用 Eclipse JavaEE 开发 WebService 时,若选择手动创建原生的JAX-WS服务,需要导入此jar资源(教程详见我的博文https://blog.csdn.net/weixin_50604409/article/details/116399530)。 如果您同时装有 IntelliJ ...

    jax-ws WebService客户端与服务端工程.rar

    2. **JAX-WS服务端开发**: - **@WebService**:这是JAX-WS的一个注解,用于标记一个Java类作为Web服务的实现。这个类中的方法将暴露为Web服务的操作。 - **@SOAPBinding**:用于指定SOAP绑定样式,如RPC/encoded...

Global site tag (gtag.js) - Google Analytics