服务端
服务:
1、add(int a,int b)
2、minus(int a,int b)
具体如下:
<pre name="code" class="java">@WebService public interface IMyService { //两数相加 public int add(int a, int b); //两数相减 public int minus(int a, int b); }
实现类
(注意:引用正确的包)
@WebService(endpointInterface="com.zttc.service.IMyService") public class MyServiceImpl implements IMyService { @Override public int add(int a, int b) { System.out.println(a+"+"+b+"="+(a+b)); return a+b; } @Override public int minus(int a, int b) { System.out.println(a+"-"+b+"="+(a-b)); return a-b; } }
发布服务:
注意:要确保端口号未被占用,发布地址不能重复使用。
//发布地址 String address="http://localhost:5555/service"; //发布 Endpoint.publish(address, new MyServiceImpl()); System.out.println("Service Success!!!");
查看服务:
在浏览器地址栏输入 http://localhost:5555/service?wsdl(自定义的发布地址+"?wsdl"),查看服务。
之后我们需要用到其中的targetNamespace 和name值。
<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://service.zttc.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.zttc.com/" name="MyServiceImplService"> <types> <xsd:schema> <xsd:import namespace="http://service.zttc.com/" schemaLocation="http://localhost:5555/service?xsd=1"/> </xsd:schema> </types> <message name="add"> <part name="parameters" element="tns:add"/> </message> <message name="addResponse"> <part name="parameters" element="tns:addResponse"/> </message> <message name="minus"> <part name="parameters" element="tns:minus"/> </message> <message name="minusResponse"> <part name="parameters" element="tns:minusResponse"/> </message> <portType name="IMyService"> <operation name="add"> <input wsam:Action="http://service.zttc.com/IMyService/addRequest" message="tns:add"/> <output wsam:Action="http://service.zttc.com/IMyService/addResponse" message="tns:addResponse"/> </operation> <operation name="minus"> <input wsam:Action="http://service.zttc.com/IMyService/minusRequest" message="tns:minus"/> <output wsam:Action="http://service.zttc.com/IMyService/minusResponse" message="tns:minusResponse"/> </operation> </portType> <binding name="MyServiceImplPortBinding" type="tns:IMyService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="add"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="minus"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="MyServiceImplService"> <port name="MyServiceImplPort" binding="tns:MyServiceImplPortBinding"> <soap:address location="http://localhost:5555/service"/> </port> </service> </definitions>
客户端
调用服务:
1)伪客户端调用
这种调用方式中,调用和被调用者都在同一个java项目中,并不是真正意义上的调用。先在这里介绍下这种方式,其他的在第二种方法中介绍。
try { //服务地址 URL url=new URL("http://localhost:5555/service?wsdl"); //使用targetNamespace和name QName sname=new QName("http://service.zttc.com/","MyServiceImplService");//命名空间,提供的名称 Service service=Service.create(url,sname); //实现接口 IMyService ms=service.getPort(IMyService.class); System.out.println("1+2="+ms.add(1,2)); } catch (MalformedURLException e) { e.printStackTrace(); }
2)远程调用——使用wsimport生成服务端
新建一个java project,使用命令wsimport。
语法:wsimport -d 本地存放路径 -keep -verbose wsdl地址
现在将操作之前发布好的服务
在本地目录中可以找到生成的文件,有java文件和class文件。
将wsimport生成的文件拷贝到新的project中,新建Test类,进行测试,代码与1)伪客户端调用类似,不再重复。这样,我们就模拟了远程调用模式。
小结:
今天主要介绍了WebService的入门demo,下篇介绍wsdl的具体配置。