1、服务端代码
1.1、编写SEI
SEI即(Service Endpoint Interface)SEI在ws中称为portType,在java中称为接口
package jaxws.server;
/**
* @className: HelloService
* @description: jaxws服务端口
* @author: hanson
* @version: V1.0
*/
public interface HelloService {
/**
* 问候
* @param name 名称
* @return 问候语
*/
String sayHello(String name);
}
1.2、编写SEI实现类
package jaxws.server.impl;
import jaxws.server.HelloService;
import javax.jws.WebService;
/**
* @className: HelloServiceImpl
* @description: SEI实现类
* @author: HanSon.Q
* @version: V1.0
*/
@WebService
public class HelloServiceImpl implements HelloService {
/**
* 问候
* @param name 名称
* @return 问候语
*/
@Override
public String sayHello(String name) {
return "你好哇! " + name;
}
}
使用了一个类级别的注解@Webservice
,使用了这个注解的类、接口、枚举、注解的所有方法都将会公开为Web服务,如果想屏蔽SEI中的某个方法,可以使用方法注解@WebMethod(exclude=true)
.
1.3、使用Endpoint发布服务
package jaxws.server;
import jaxws.server.impl.HelloServiceImpl;
import jaxws.server.impl.HelloServiceSoap12Impl;
import javax.xml.ws.Endpoint;
/**
* @className: JaxwsServerApp
* @description: 主程序, 用于发布服务
* @author: HanSon.Q
* @date: 2018/2/6 11:33
* @version:V1.0
*/
public class JaxwsServerApp {
public static void main(String[] args) {
HelloService helloService = new HelloServiceImpl();
Endpoint.publish("http://127.0.0.1:1234/hello", helloService);
}
}
点击运行,没有发生错误说明服务发布成功
2、查看WSDL
发布程序启动成功之后,通过浏览器访问 http://127.0.0.1:1234/hello?wsdl
来验证web服务的正确性。 通过WSDL可以知道如何调用web服务!
2.1、WSDL明细
<definitions
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://impl.server.jaxws/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://impl.server.jaxws/"
name="HelloServiceImplService">
<types>
<xsd:schema>
<xsd:import namespace="http://impl.server.jaxws/" schemaLocation="http://127.0.0.1:1234/hello?xsd=1"/>
</xsd:schema>
</types>
<message name="sayHello">
<part name="parameters" element="tns:sayHello"/>
</message>
<message name="sayHelloResponse">
<part name="parameters" element="tns:sayHelloResponse"/>
</message>
<portType name="HelloServiceImpl">
<operation name="sayHello">
<input wsam:Action="http://impl.server.jaxws/HelloServiceImpl/sayHelloRequest" message="tns:sayHello"/>
<output wsam:Action="http://impl.server.jaxws/HelloServiceImpl/sayHelloResponse" message="tns:sayHelloResponse"/>
</operation>
</portType>
<binding name="HelloServiceImplPortBinding" type="tns:HelloServiceImpl">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="sayHello">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="HelloServiceImplService">
<port name="HelloServiceImplPort" binding="tns:HelloServiceImplPortBinding">
<soap:address location="http://127.0.0.1:1234/hello"/>
</port>
</service>
</definitions>
3、利用wsimport.exe生成客户端代码
wsimport是JDK自带的ws客户端工具,它可以根据wsdl生成客户端调用代码(java),不用考虑服务端开发语言。
3.1、常用使用参数介绍
- -keep:是否生成java源文件
- -d:指定.class文件的输出目录
- -s:指定.java文件的输出目录
- -p:定义生成类的包名,不定义的话有默认包名
- -verbose:在控制台显示输出信息
- -b:指定jaxws/jaxb绑定文件或额外的schemas
- -extension:使用扩展来支持SOAP1.2
wsimport.exe 在%JAVA_HOME%\bin目录下面
3.2、使用示例
首先在d盘下创建temp目录并在此目录下创建s文件夹和d文件夹分别用来存储.java文件和.class文件。 然后使用下面的命令回车执行
E:\>wsimport -keep -d D:\temp\d -s D:\temp\s -p jaxws.client -verbose http://127.0.0.1:1234/hello?wsdl
3.3、将生成的客户端代码拷贝到工程中
3.4、编写客户端代码
3.4.1、基于wsimport生成客户端代码方式
package jaxws.client.app;
import jaxws.client.HelloServiceImpl;
import jaxws.client.HelloServiceImplService;
/**
* @className: JaxwsClientApp
* @description: 客户端
* @author: HanSon.Q
* @version: V1.0
*/
public class JaxwsClientApp {
public static void main(String[] args) {
//1、创建服务视图
HelloServiceImplService helloServiceImplService = new HelloServiceImplService();
//2、通过服务视图得到服务端点(SEI)
HelloServiceImpl helloServiceImplPort = helloServiceImplService.getPort(HelloServiceImpl.class);
//3、调用服务方法
String result = helloServiceImplPort.sayHello("程序猿");
System.out.println(result);
}
}
运行结果
你好哇! 程序猿
3.4.2、基于Service类
package jaxws.client.app;
import jaxws.client.HelloServiceImpl;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @className: SimpleObjectAccessProtocolClientApp
* @description: SOAP客户端
* @author: HanSon.Q
* @date: 2018/2/6 14:23
* @version: V1.0
*/
public class SimpleObjectAccessProtocolClientApp {
public static void main(String[] args) throws MalformedURLException {
//1、定义url,参数为wsdl地址
URL url = new URL("http://127.0.0.1:1234/hello?wsdl");
//2、定义qname,第一个参数是命名空间,第二个参数名称是wsdl里边的服务名
QName qName = new QName("http://impl.server.jaxws/", "HelloServiceImplService");
//3、创建服务视图
Service service = Service.create(url,qName);
//4、通过服务视图得到服务端点
HelloServiceImpl helloService = service.getPort(HelloServiceImpl.class);
//5、调用web服务
String result = helloService.sayHello("Python");
System.out.println(result);
}
}
运行结果
你好哇! Python
3.4.3、对比两种客户端方式
- wsimport工具生成的客户端代码无法指定服务地址,使用生成的服务视图类获取服务端点实例
- service调用Webservice可以指定webservice的地址,只需要服务端点的接口即可获取服务端点实例
4、WebService小结
- 优点
- 采用xml支持跨平台远程调用
- 基于http的soap协议,可跨越防火墙
- 支持面向对象开发
- 有利于软件和数据重用,实现松耦合
- 缺点
- 由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高