webservice是实现异构系统远程调用的技术,在java世界里有很多实现方式,如axis、xfire、cxf等。这里我们先用jdk自带的JAX-WS(Java API For XML-WebService) 来体验一下。
一 服务器建立
1.1 创建接口
Web服务的接口通常称为SEI (Service Endpoint Interface)。
java代码:
package org.zttc.service;
import javax.jws.WebService;
@WebService()
public interface IMyService {
public int add(int a,int b);
public int minus(int a,int b);
}
1.2 创建实现类
Web服务的实现类通常称为SIB (Service Implementation Bean)
java代码:
package org.zttc.service;
import javax.jws.WebService;
@WebService(endpointInterface="org.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;
}
}
1.3 创建服务
java代码:
package org.zttc.service;
import javax.xml.ws.Endpoint;
public class MyServer {
public static void main(String[] args) {
String address = "http://localhost:8888/ns";
Endpoint.publish(address, new MyServiceImpl());
}
}
运行本类,在浏览器中敲入 http://localhost:8888/ns?wsdl 可以查看wsdl文件;
二 客户端的使用
java代码:
package org.zttc.service;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class TestClient {
public static void main(String[] args) {
try {
//创建访问wsdl服务地址的url
URL url = new URL("http://localhost:8888/ns?wsdl");
//通过Qname指明服务的具体信息
QName sname = new QName("http://service.zttc.org/", "MyServiceImplService");
//创建服务
Service service = Service.create(url,sname);
//实现接口
IMyService ms = service.getPort(IMyService.class);
System.out.println(ms.add(12,33));
//以上服务有问题,依然依赖于IMyServie接口
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
QName 的创建参数来自WSDL文件
<definitions targetNamespace="http://service.zttc.org/" name="MyServiceImplService">
三 wsimport的使用
cmd> wsimport -d d:/webservice/01 -keep -verbose http://localhost:8888/ns?wsdl
-d 指定生成的目录
-keep 保持源文件
-verbose 显示生成的详细过程
-p 指定包名
客户端代码
java代码:
package org.zttc.service;
import java.net.MalformedURLException;
public class TestClient2 {
public static void main(String[] args) throws MalformedURLException {
MyServiceImplService msis = new MyServiceImplService();
IMyService ms = msis.getMyServiceImplPort();
System.out.println(ms.minus(29,11));
}
}
四 wsdl简单讲解
4.1 types
用来定义访问的类型,描述方法名、参数、返回值
http://localhost:8888/ns?xsd=1
4.2 message
SOAP(simple object access protocol)消息,一个方法一般对应两个,接收消息与发送消息。
4.3 portType
指明服务器的接口,并且通过operation绑定相应的in和out的消息:其中in表示参数,out表示返回值
4.4 binding
指定传递消息所使用的格式。早期会用soap encoding ,现在是literal
4.5 service
指定服务所发布的名称等基本信息
五 soap的使用和TCPMon
5.1 在eclipse中可以查看soap消息格式
J2EE视图->Launch the Web Services Explorer->WSDL网址
5.2 TCPMon
Listen Port #
客户端访问的接口,等于客户端首先将消息提交给TCPMon之后,再由TCPMon转发给服务器
Listener
Target Hostname
Target Port #
服务器的地址,TCPMon转发的地址
5.3 定义参数名称
java代码:
@WebResult(name="addResult")
public int add(@WebParam(name="a")int a,@WebParam(name="b")int b);
@WebResult(name="minusResult")
public int minus(@WebParam(name="a")int a,@WebParam(name="b")int b);
六 代码优先还是契约优先
6.1 传递一个对象类型
6.2 代码优先还是契约优先
6.3 SOA(service-oriented architecture)
服务类型
基于实体的服务
基于功能的服务
基于流程的服务
业务流程 (BPM) ERP 不同业务系统之间的流程
工作流程(JBPM) 同一系统内