WebService(3):JAX-WS

一.概述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值