一.概述
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;
@WebService
public 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.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.jar
jaxws-rt.jar
jaxws-tools.jar
jsr181-api.jar
management-api.jar
mimepull.jar
policy.jar
saaj-api.jar
saaj-impl.jar
stax-ex.jar
stax2-api.jar
streambuffer.jar
woodstox-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;
@WebService
public 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.youkuaiyun.com/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.youkuaiyun.com/lifetragedy/article/details/7205832