系列博文:
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客
分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)_闲猫的博客-CSDN博客
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
目录
特点:跨平台、跨语言、但速度比较慢
场景:适用于异构系统之间的调用,比如:两个厂家实现的系统彼此调用
协议:基于SOAP协议(应用层
步骤:
实现:
1. 创建一个java工程
2. 编写提供服务的类(服务类)
模型类:
public class Member implements Serializable[ww1] {
private static final long serialVersionUID = -7197511997605564716L;
private Integer uuid;
private String name;
// 有参/无参构造方法
// setter/getter方法
// toString方法
}
业务实现类:
@WebService[ww1]
public class MemberService {
public String get(Integer i) {
return "张三";
}
public Member getMember(String sn) {
return new Member(11, "赵芸");
}
public String setMember(Member member) {
return member.toString();
}
}
[ww1]必须写该主键否则报错
【注意】(服务类使用@WebService注解)如没有注解将报错:
Exception in thread "main" java.lang.IllegalArgumentException: class cn.itcast.Service.MemberService has neither @WebService nor @WebServiceProvider annotation
3. 发布服务的方法
public static void main(String[] args) {
//第一个参数:发布的地址
//第二个参数:该地址对应的服务类
Endpoint.publish("http://localhost:23456/member", new MemberService());
}
4. 测试
URL地址:http://localhost:23456/member
点击:http://localhost:23456/member?wsdl
出来这个就标识服务发布成功。
步骤:
实现:
1. 创建java工程
2. 生成本地代码
进入工程src目录下,使用指令:“wsimport –s . 发布地址?wsdl”,在CMD下执行。如下图:
【说明】wsimport指令
1. 该指令是JDK下指令
2.直接使用的前提是已经配置了JDK环境变量
3.如果没有配置环境变量,还想直接使用,先执行
Path D:\JavaConfig\Java\jdk1.7.0_72\bin (jdk路径,到bin一级)
再执行wsimport 指令
【生成的代码】
3. 调用远程服务
public static void main(String[] args) {
MemberServiceService memberService = new MemberServiceService();[ww1]
MemberService memberServicePor =
memberService.getMemberServicePort()[ww2] ;
Member mem = memberServicePor.getMember("");
System.out.println(mem.getName() + " " + mem.getUuid());
}
内部实现:
MemberServiceService代码:
@WebServiceClient(name = "MemberServiceService", argetNamespace = "http://Service.itcast.cn/", wsdlLocation = "http://localhost:23456/member?wsdl")
public class MemberServiceService extends Service
{
static {
URL url = null;
try {
url = new URL("http://localhost:23456/member?wsdl");
} catch (MalformedURLException ex) {
}
}
@WebEndpoint(name = "MemberServicePort")
public MemberService getMemberServicePort() {
return super.getPort(new QName("http://Service.itcast.cn/",
"MemberServicePort"), MemberService.class);
}
}
从第一种实现的源码中看第二种实现方式。
public static void main(String[] args) {
try {
URL url[ww1] = new URL("http://localhost:23456/member?wsdl");
QName qname [ww2] = new QName("http://Service.itcast.cn/",
"MemberServiceService");
Service service = Service.create[ww3] (url, qname);
MemberService memberservice =
service.getPort(MemberService.class)[ww4] ;
Member mem = memberservice.getMember("");
System.out.println(mem.getName() + " " + mem.getUuid());
} catch (Exception e) {
e.printStackTrace();
}
}
WSDL (Web Service Description Language) WebService描述语言,是WebService发布服务的描述,相当于WebService的使用说明书。通常一个WSDL文件描述的是一个服务类提供的服务的描述。
描述的内容包括:
该服务类提供接口需要的模型类(返回值、形参;在类中的模型不进行模式)
对外提供的接口(方法描述:方法名、形参列表和返回值)
绑定的服务对象以及服务对象是啥
以下图示WSDL的内容:
XSD文件是描述使用过程中的一些模型类,以及一些基本类的包装类(这个包装类不是Integer和Double等这种,而是将getEember、getMemberResponse这种类型)。
以下是XSD文件解析:
这里说的注解只是用来修改在客户端方法、变量的名称以及类的名称,可以和原始的方法名称、变量名、类名不同。这样就可以隐藏服务器内部的实现。
注解包括四个:@WebService、@WebMethod、@WebParam、@WebResult。分别代表:服务类、方法、形参、返回值。
以下是注解的位置,参考位置所在:
注解写的位置:(MemberService是服务类)
【说明】服务类和接口类不同
在WebService服务端生成WSDL中有两种类对外提供服务,这两个类对应的是我们在服务端写的服务类,这两个类一个是服务类,各类就好似对外提供了一个服务,你可以根据调用不同的接口,来完成不同的功能。另一种是接口类,就是对外提供接口的类,用来实现具体的功能,其实这是一个接口,对外提供的接口就是定义服务类提供的接口。而服务类中提供的是获取各个接口的方法,比如:getMemberPoint用来获取接口。
比如:现在一个学生管理系统,对外只提供一个服务器类,但学生管理系统下有不同的模块,那就是不同的接口类实现啦。
服务类和接口类在调用中的关系如下:
一个服务类对应的是一个WSDL文件。
serviceName="abc"
用来修改服务类的类名,下面是WSDL文件中的变化
name="xyz"
用来修改接口的类名,下面是WSDL文件中的变化
targetNamespace=http://it.baidu.com
用来修改一个服务类对应的WSDL的命名空间,下面是WSDL文件中的变化
注解写的位置:
operationName="show"
用来修改接口类中方法的名称,下面是WSDL文件中的变化
exclude=true
隐藏此方法,不进行发布出去,虽然是共有方法也不发布出去,如果没有能发布的方法,在发布服务是(启动)时将报错。
注解位置:
用来修改形式参数名称,下面是XSD文件中的变化
注解位置:
用来修改返回值名称,下面是XSD文件中的变化
END