`

JAX-WS实现Web Service

    博客分类:
  • Java
 
阅读更多

一、为什么使用Web Service?

       Java系统相互间可以通过RMI实现远程过程调用,但是由于其局限于只能用于java系统间进行调用,且开发过程相对来说较复杂,已经逐步被Web Service取代。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

二、Web Service涉及的主要技术

1、SOAP:Simple Object Access Protocol

SOAP 指简单对象访问协议,它是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档。通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系统间的计算服务处理。

2、WSDL:

    采用XML编写的,用于描述服务的位置和方法的文档。

3、XML

三、JAX-WS

JAX-WS(Java API for XML-Based Webservices)是目前最标准,需要额外第三方插件最少,配置最少最灵活的webservice。JAXWS适合几乎所有Webservice客户端的调用,因此不少巨头型的厂商如:IBM,Weblogic等,在他们的产品上都使用了以JAXWS为标准的Webservice接口。JAX-WS 2.0 是面向 Java 5 的开发 Web services 的最新编程标准,它提供了新的编程模型和对以往的 JAX-RPC 方式的 Web services 进行了增强。 JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。

1、两种开发过程

     JAX-WS有两种开发过程:    

          自顶向下,通过WSDL文件来创建Web Service;

          自底向上,通过Java类来创建Web Service;

2、开发步骤

     JAX-WS的开发基本上采用如下步骤:

            编写接口和实现-----》发布-------》生成客户端调用程序

     采用JDK1.6时,可以编写接口;也可以不编写接口,直接使用JAVA类(其他JDK版本未测试)

3、关于 wsgen    wsimport

     JDK1.6(具体详细版本待查)已经提供该工具,可以直接使用。

     wsgen用于server端通过java类产生webservice和wsdl文件;

     wsimport用于client端通过wsdl文件生成java类;

     wsgen使用:

            a、javac编译java类;

            b、wsgen -cp . java类      执行后会看到生成的wsdl文件

     wsimport使用:

            wsimport -keep -p package-name    http://xxx/helloservice?wsdl

            -keep   保留生成的文件;

            -p 指定生成时的包名;

            指定服务地址

4、生成客户端的方式

      a、可以通过myeclipse工具生成;

      b、通过wsimport生成

5、注意事项

      a、jdk1.5不能直接使用JAXWS,需要导入相应的jar包;

      b、jdk1.5没有自带wsgen、wsimport,需要JAXWS-xxx.jar(通过java -jar 进入图形界面、解压获取)

     

四、示例

1、接口方式实现

           

@WebService
@SOAPBinding(style = Style.RPC)
public interface IHello {
	@WebMethod
	public void sayHello();

	@WebMethod
	public void sayHello2(@WebParam(name = "name") String name);

	@WebMethod
	@WebResult(name = "checkresult")
	public int checkExist(@WebParam(name = "name") String name);
}

 

@WebService(endpointInterface = "com.test.IHello")
@SOAPBinding(style = Style.RPC)
public class Hello implements IHello {
	public void sayHello() {
		// TODO Auto-generated method stub
		System.out.println("hello");
	}

	public void sayHello2(String name) {
		// TODO Auto-generated method stub
		System.out.println("hello " + name);
	}

	public int checkExist(String name) {
		// TODO Auto-generated method stub
		System.out.println("hello " + name);
		return 0;
	}

}

 

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Endpoint endPoint=Endpoint.publish("http://localhost:8080/hello", new Hello());
	}

 

2、非接口方式(直接使用JAVA类)

@WebService( name = "hello", targetNamespace = "http://www.xx.com",serviceName="helloservice")
@SOAPBinding(style = Style.RPC)
public class Hello  {
	@WebMethod(operationName = "sayHello", action = "sayHelloaction")
	public void sayHello() {
		// TODO Auto-generated method stub
		System.out.println("hello");
	}

	@WebMethod
	public void sayHello2(String name) {
		// TODO Auto-generated method stub
		System.out.println("hello " + name);
	}

	@WebMethod
	@WebResult(name = "checkresult")
	public int checkExist(@WebParam(name = "name") String name) {
		// TODO Auto-generated method stub
		System.out.println("hello " + name);
		return 0;
	}

}

 

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Endpoint endPoint=Endpoint.publish("http://localhost:8080/hello", new Hello());
	}

 

3、Web项目中实现JAX-WS

      具体服务的编写与前面的叙述是一致的,只是不再采用main方法实现发布,而是通过web项目配置文件进行发布。另外需要注意在web项目中导入所需的jar包(myeclipse自带该部分jar包,可以直接用)。

/WEB-INF/sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
	version="2.0">
	<endpoint name="Hello" implementation="com.test.Hello"
		url-pattern="/HelloService" />
</endpoints>

 

/WEB-INF/web.xml
	<listener>
		<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
	</listener>
	<servlet>
		<servlet-name>Hello</servlet-name>
		<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Hello</servlet-name>
		<url-pattern>/HelloService</url-pattern>
	</servlet-mapping>

 

 4、CXF方式实现Web Service

Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。目前它仍只是 Apache 的一个孵化项目。

Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成

	非WEB应用,只需引入cxf的jar包,然后采用如下方式发布服务:

     public static void main(String[] args) {
		// TODO Auto-generated method stub
		JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
		factory.setServiceClass(Hello.class);

		factory.setAddress("http://localhost:9000/ws/HelloWorld");
		factory.create();
	}

 

对于使用Spring的web应用程序,需要在配置文件中做如下处理:

applicationContext.xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath*:**META-INF/cxf/cxf.xml" />
	<import resource="classpath*:**META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath*:**META-INF/cxf/cxf-servlet.xml" />
	<jaxws:endpoint id="helloworld" implementor="com.common.Hello"	address="/Hello" />

</beans>

web.xm中做如下配置:
	<servlet>
		<servlet-name>cxf</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>cxf</servlet-name>
		<url-pattern>/ws/*</url-pattern>
	</servlet-mapping>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:**/applicationContext.xml</param-value>
	</context-param>

 

 

五、参考

1. wsdl binding理解

wsdl提供了一个统一的接口, 因为wsdl是基于xml,与语言平台无关, 所有可以通过wsdl提供的接口可以访问不同类型的资源。
wsdl提供了binding和service元素,用以绑定接口到具体的服务,实现了接口与实现的分离。
wsdl绑定的协议可以是soap、http、smtp、ftp等任何一种传输协议, wsdl保持协议中立,但它确实内建了绑定SOAP的支持,从而同SOAP建立了不可分割的关系, 所以通常都会把SOAP作为绑定协议。  
2. wsdlsoap:operation/soap:operation元素和wsdlsoap:binding/soap:binding元素
上面说通常都会把SOAP作为绑定协议, 所有我们目前基本上都使用SOAP binding,
就是说wsdlsoap:binding/soap:binding这个元素以及子元素wsdlsoap:operation/soap:operation必须存在;
3. rpc和document区别
style属性是用来描述soap:operation的,这个值只有两个选择,RPC-oriented(简称rpc)或者document-oriented(简称document).
rpc表示soap消息包含请求的参数和返回的值, document表示soap消息包含xml document(s).
4. style属性规则
如果wsdlsoap:operation/soap:operation元素中有style属性, 那么这个operation就应用这个style类型,
如果没有,就需要找上一级wsdlsoap:binding/soap:binding元素中有没有style属性, 如果有的话,那么该binding下的所有operation都应用这个style类型,
如果没有,就应用默认值style="document"

 

 

关于SOAP、WSDL的介绍参考:SOAP WSDL介绍
分享到:
评论

相关推荐

    Jax-ws所需要的JAR包

    在实际应用中,使用JAX-WS进行Web服务开发时,开发者需要定义服务接口和实现,然后通过注解或部署描述符来配置服务。服务可以通过HTTP协议暴露,客户端则可以通过生成的Stub类或者使用JAX-WS的`Service`类来调用这些...

    Web Service学习小结——基于JDK自带JAX-WS实现的web service

    - 此压缩文件可能包含了一个简单的JAX-WS Web服务示例,包括SEI接口、实现类、WSDL文件,以及可能的客户端测试代码。 总的来说,JAX-WS为Java开发者提供了一种方便的方式来创建、部署和使用Web服务。通过理解这些...

    jax-rs jax-ws所需包,亲测可用

    `javax.xml.ws.Service`是JAX-WS规范的一部分,用于创建和实例化Web服务客户端。当这个类报错,通常是因为缺失了如wsimport工具或者相关的API依赖。而这个压缩包提供了解决这个问题的解决方案,用户只需将提供的四个...

    解决weblogic部署JAX-WS需要的配置文件

    JAX-WS允许开发者通过简单的接口定义服务,然后自动生成对应的WSDL(Web Service Description Language)文件,这个文件描述了服务的接口和调用方式。客户端通过WSDL找到服务的地址并进行通信。 在WebLogic中部署...

    JAX-WS所需Jar包

    JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于构建和部署Web服务。这个标准允许开发人员使用简单的编程模型来创建和消费Web服务,从而简化了分布式系统间的交互。在Java环境中,JAX-WS提供...

    jax-ws api jar包

    JAX-WS允许开发者以面向对象的方式构建Web服务,简化了Web服务开发过程,使得Java程序员可以更加便捷地实现服务接口和服务实现。 在给定的压缩包文件"jax-ws api jar包"中,包含的是JAX-WS 2.2.1版本的API库,即`...

    学习JAX-WSWebService开发

    总结来说,学习JAX-WSWebService开发意味着掌握Web服务的基本概念、JAX-WS的API用法,以及在MyEclipse这样的IDE中实现和调试Web服务的方法。通过这个过程,开发者可以熟练地创建、部署和调用Java平台上的Web服务,...

    JAX-WS 实现WebService发布

    **JAX-WS实现Web Service发布的详解** JAX-WS(Java API for XML Web Services)是Java平台上用于创建Web服务的标准API,它简化了Web服务的开发、部署和消费过程。JAX-WS允许开发者使用Java语言来定义和实现Web服务...

    JAX-WS Web service

    **JAX-WS Web服务开发概述** JAX-WS(Java API for XML Web Services)2.0,由JSR 224定义,是Java EE 5平台的关键组成部分,它是JAX-RPC 1.1的升级版。JAX-WS的主要目标是简化基于XML的Web服务的开发任务,它提供...

    jax-ws webservice demo

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

    jax-ws 方式发布web Service 后台用Hibernate实现,前端.NET通过引用服务方式实现

    rar中包含整个项目的源码和数据库生成脚本,采用jax-ws发布Web Service服务,支持java客户端和.Net客户端调用,数据库采用oracle10g,里面有创建数据库脚本文件createTable_Oracle10g.sql,由于Hibernate映射表中会...

    jax-ws实现webservice调用

    **Java API for XML Web Services (JAX-WS)** 是一种由Java SE和Java EE平台支持的用于构建Web服务的标准API。它使得开发人员能够轻松地创建、部署和使用基于SOAP(简单对象访问协议)的Web服务。在本教程中,我们将...

    使用Myeclipse-8.5开发基于JAX-WS的Web-service实例.docx

    使用 Myeclipse 8.5 开发基于 JAX-WS 的 Web Service 实例 本文档主要介绍了使用 Myeclipse 8.5 开发基于 JAX-WS 的 Web Service 实例的步骤,涵盖了 Web 服务程序和客户端程序的基本流程,以及在 Weblogic 10.3.4 ...

    JAX-WS2.0 API

    1. **企业级应用集成:**JAX-WS常用于构建企业级系统之间的集成,通过Web服务实现不同系统间的通信。 2. **跨平台通信:**由于SOAP是一种开放的标准,JAX-WS使得Java应用能够与其他平台(如.NET或PHP)上的应用进行...

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

    JAX-WS提供了一种简单的方式来创建SOAP(Simple Object Access Protocol)Web服务,它集成了Java SE和Java EE平台,使得开发者可以方便地实现服务接口和服务实现,然后通过工具自动生成WSDL(Web Service ...

    jax-ws2.1.zip

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

    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)的...

    一个包含jax-ws和jax-rs的例子(含服务端和客户端)

    2. **客户端**:客户端部分会展示如何使用JAX-WS的`javax.xml.ws.Service`类或JAX-RS的`Client` API来调用服务端提供的Web服务。对于JAX-WS,客户端可能会生成一个代理类来调用服务;对于JAX-RS,可以使用`Client`...

    jax-ws发布webservice

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

    JAX-WS API, JAX-RS API

    Java API for XML Web Services (JAX-WS) 是Java平台上的一个标准接口,用于创建和消费Web服务。它是Sun Microsystems在2004年推出的一个重要框架,旨在简化Web服务的开发,使得Java开发者能够更方便地实现基于SOAP...

Global site tag (gtag.js) - Google Analytics