WebService(3):JAX-WS

来源:互联网 发布:java 判断紧急号码 编辑:程序博客网 时间:2024/05/12 17:33

一.概述

JAX-WS2.0 的全称为 Java API for XML-Based Webservices (JAX-WS) 2.0。JAX-WS 2.0 是对 JAX-RPC 1.0 规范的扩展,是 JAX-RPC 1.1 的后续版本, JAX-RPC 2.0 标准发布不久后便被重新命名为 JAX-WS 2.0。 JAX-WS 2.0 是面向 Java 5 的开发 Web services 的最新编程标准,它提供了新的编程模型和对以往的 JAX-RPC 方式的 Web services 进行了增强。 JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XMLBinding (JAXB, JSR 222),在parsing层,使用的是the Streaming API for XML (StAX, JSR 173),同时它还完全支持schema规范。

特性:
支持SOAP 1.1(默认)
支持XML/HTTP Binding
支持WS-Addressing
支持document/literal样式
支持WS-I Basic Profile
支持消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)

二.java project

这里写图片描述

1.服务端

HelloWorld.java

package com.now.services;import javax.jws.WebParam;import javax.jws.WebService;@WebService  public interface HelloWorld {     public String sayHi(@WebParam(name="who") String who);     public String sayHello(@WebParam(name="who") String who);  }

HelloWorldImpl.java

package com.now.services;import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic class HelloWorldImpl implements HelloWorld {      @Override      public String sayHi(String who) {         return"Hi, " + who;      }      @Override      @WebMethod(exclude=true)      public String sayHello(String who) {         return"Hello, " + who;      }   }

Server.java

public class Server {      public static void main(String args[]) {         Endpoint.publish("http://localhost:8080/com/now/services/HelloWorld",  new HelloWorldImpl());      }  }

浏览器访问地址: http://localhost:8080/com/now/services/HelloWorld?wsdl
这里写图片描述

2.客户端

(1)wsimport工具生成客户端代码

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

参数含义:
-d:生成客户端执行类的class文件的存放目录
-s:生成客户端执行类的源文件的存放目录
-keep:表示导出webservice的class文件时是否也导出源代码java文件
-p:以package的形式生成文件
-verbose:在控制台显示输出信息

将服务端发布的wsdl生成客户端的类文件:

wsimport  -keep  -d .  -s .\src  -p com.now  -verbose  http://localhost:8080/com/now/services/HelloWorld?wsdl

其中,.表示当前目录。
这里写图片描述

这里写图片描述

(2)客户端调用代码

新建一个包存放调用文件:
这里写图片描述

InvokeHelloServer.java

package invoke;import com.now.HelloWorldImpl;import com.now.HelloWorldImplService;public class InvokeHelloServer {    public static void main(String[] args) {         //创建一个用于产生HelloWorldImpl实例的工厂,HelloWorldImplService类是wsimport工具生成的        HelloWorldImplService factory = new HelloWorldImplService();         //通过工厂生成一个HelloWorldImpl实例,HelloWorldImpl是wsimport工具生成的        HelloWorldImpl helloWorldImpl =factory.getHelloWorldImplPort();        String result = helloWorldImpl.sayHi("now u see me");        System.out.println(result);    }}

运行结果:

Hi, now u see me

三.javaweb

这里写图片描述

1.新建web项目

MyEclipse建立一个web项目,整体目录如下:
这里写图片描述

HelloWorld.java

package com.now;import javax.jws.WebService;@WebService  public class HelloWorld {    public String sayHello(String name) {          return ("Welcome, I am Server. Hello, " + name);      }      public int sum(int a, int b) {          return a + b;      }  }

sun-jaxws.xml

<?xml version="1.0" encoding="UTF-8"?>  <endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">    <endpoint name="HelloWorld" implementation="com.now.HelloWorld" url-pattern="/service/HelloWorld" />  </endpoints> 

2.wsgen工具

(1)概述

wsgen 是在JDK自带的一个工具,该命 令的主要功能是用来生成合适的JAX-WS。它读取Web Service的类文件(Hello.class),同时生成所有用于发布Web Service所依赖的源代码文件、经过编译过的二进制类文件、WSDL文件和相关的xsd文件。
主要用于Server端通过Java类编译成Webservice及相关的wsdl文件

(2)参数含义

-wsdl:参数代表生成webservice
-s:参数代表生成的.java文件目录
-d: 参数代表生成的编译class文件目录
-r :参数代表生成的.wsdl文件与.xsd文件目录
-cp:参数代表classpath,即读取的类文件(Hello.class)所在的目录(不包括类文件的包目录)

wsgen -cp MyJaxWsWebProject\WebRoot\WEB-INF\classes com.now.HelloWorld -wsdl -s MyJaxWsWebProject\src -r MyJaxWsWebProject\wsdl

这里写图片描述
运行结果:
这里写图片描述

PS: wsgen工具是可选择的,可用可不用,因为会在runtime时自动生成。
这里写图片描述

3.JAR包

(1)所需jar包

下载的是jaxws-ri-2.2.10.zip,解压

FastInfoset.jargmbal-api-only.jarha-api.jarjavax.annotation.jarjavax.mail_1.4.jarjaxb-api.jarjaxb-impl.jarjaxb-xjc.jarjaxws-api.jarjaxws-rt.jarjaxws-tools.jarjsr181-api.jarmanagement-api.jarmimepull.jarpolicy.jarsaaj-api.jarsaaj-impl.jarstax-ex.jarstax2-api.jarstreambuffer.jarwoodstox-core-asl.jar

(2)jar包下载地址

https://jax-ws.java.net/2.2.10/

4.结果

这里写图片描述

客户端调用参考上面
这里写图片描述

四.Spring集成

这里写图片描述
jdk自带的webservices会占用一个独立的端口。

HelloWorld .java

package com.now;import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic interface HelloWorld {    @WebMethod    public String sayHello(String name);}

HelloWorldImpl .java

package com.now;import javax.jws.WebService;import org.springframework.stereotype.Component;@Component@WebService(serviceName = "HelloWorldService", endpointInterface = "com.now.HelloWorld")public class HelloWorldImpl implements HelloWorld {    public String sayHello(String name) {        return "Hello," + name;    }}

application.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">    <context:component-scan base-package="com.now"></context:component-scan>    <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">        <property name="baseAddress" value="http://localhost:8090/services/"/>    </bean></beans>

web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app>    <context-param>        <param-name>contextConfigLocation</param-name>          <param-value>classpath:application.xml</param-value>     </context-param>    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener></web-app>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.now</groupId>  <artifactId>MySpringJaxWs</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>war</packaging>  <build>    <plugins>      <plugin>        <artifactId>maven-compiler-plugin</artifactId>        <configuration>          <source>1.6</source>          <target>1.6</target>        </configuration>      </plugin>    </plugins>  </build>  <dependencies>         <dependency>           <groupId>org.springframework.ws</groupId>           <artifactId>spring-ws-core</artifactId>           <version>2.1.4.RELEASE</version>       </dependency>       <dependency>           <groupId>org.jdom</groupId>           <artifactId>jdom</artifactId>           <version>1.1</version>       </dependency>       <dependency>           <groupId>jaxen</groupId>           <artifactId>jaxen</artifactId>           <version>1.1.6</version>       </dependency>    </dependencies>  </project>

这里写图片描述

五.wsgen与wsimport工具区别

这里写图片描述

参考

http://blog.csdn.net/rongbo_j/article/details/50975087
http://www.cnblogs.com/xiaotao726/p/4522955.html
http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/
http://www.examclouds.com/java/web-services/wsimport-wsgen
http://blog.csdn.net/lifetragedy/article/details/7205832

0 0