webservice开发---------如何使用jdk发布webservice及调用
第一次见到webservice时,懵,懵,懵,它是什么?主要功能是什么?怎么用?围绕着这些开始webservice学习之旅
一:简介
webService是一种跨编程语言和跨操作系统平台的远程调用技术;
采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。
比如,我们的应用上需要用到天气信息,我们可以调用互联网上查询天气的web服务,这样用户就可以在我们的网站上看到天气信息, 我们也可以把自己写好的代码发布,这样别人也可以调用;
webservice分为服务端(发布服务)和客户端(调用服务)两部分;
二:Jdk发布和调用webservice
这篇文章用Jdk发布一个WebService服务及调用,下一篇介绍如何使用框架cxf发布webservice;
发布须知:
@WebService注解(注:此注解是jdk1.6提供的,位于javax.jws.WebService包中)-
- 将java类标记为实现Web Service,将 Java 接口标记为定义 Web Service 接口。
- 给类添加@WebService注解后,所有非静态方法都会被发布;
- 方法上加@WebMethod(exclude=true)后,此方法不被发布;
- 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败;
通过EndPoint(端点服务类)发布一个WebService
- EndPoint是jdk提供的一个专门用于发布服务的类,位于 javax.xml.ws.Endpoint包中
- 该类的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。
WSDL(web service definition language)
- WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档,
定义了客户端与服务端发送请求和响应的数据格式和过程
发布服务:
1.创建webProject(可以是纯java工程)
2.创建类,加上@WebService注解
3.在类中定义你要发布的方法
@WebService
public class SayWeb {
public String sayHello(String name){
return "hello"+name;
}
public void sayBye(){
System.out.println("bye");
}
/**
* 添加@WebMethod(exclude=true)注解
*/
@WebMethod(exclude=true)
public int sayInt(int i){
return ++i;
}
/**
* 静态方法
*/
public static void sayGood(){
System.out.println("Good");
}
/**
* main方法中发布
*/
public static void main(String[] args) {
String address = "http://localhost:9001/service/sayweb";
Endpoint.publish(address, new SayWeb());
System.out.println("发布成功");
}
}
4.发布webservice
5.在浏览器中搜索发布的地址(发布的地址无法访问,可以访问的是发布地址+?wsdl)
6.wsdl文档
生成代码方式调用服务
第一种:
jdk文件中bin文件里面有一个wsimport.exe应用程序,是用来给客户端生成调用代码的
1.新建webprogect(也可以是纯java工程),作为客户端
2.打开cmd命令 输入
wsimport -s E:\workspace\client\src -p com.client -keep http://localhost:9001/service/sayweb?wsdl
-keep:表示生成客户端代码,url为wsdl文档的地址
-p:表示生成的代码所放的包名
-s:表示生成源码(直接调用),src目录
出现以下代码,表示生成代码成功,
parsing WSDL…
Generating code…
Compiling code…
3.刷新项目,看到在指定包下生成调用源码
4.编写测试方法,调用代码
public static void main(String[] args) {
//获取工厂 wsdl文档:<service name="SayWebService">
SayWebService swb = new SayWebService();
//获取服务端口上的对象 wsdl文档:<port name="SayWebPort" binding="tns:SayWebPortBinding">
SayWeb sw = swb.getSayWebPort();
sw.sayBye();
System.out.println(sw.sayHello("nihao"));
}
第二种:
1.单击项目右键—->new—–>web service client
2.输入wsdl文档地址—>finish
3.自动生成java代码,主要使用的是***Locator和****Stub
4.测试
public static void main(String[] args) {
try {
SayWebServiceLocator swst = new SayWebServiceLocator();
java.net.URL url = new java.net.URL("http://localhost:9001/service/sayweb?wsdl");
SayWebPortBindingStub stub = new SayWebPortBindingStub(url,swst);
stub.sayBye();
System.out.println(stub.sayHello("nihao"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
测试结果
服务端:
客户端
总结:
1.发布服务端除了在main方法中,还可以在servlet容器初始化时,还可以放在监听器中等
2.使用wsimport命令的方式调用webservice,在实际项目中,并不推荐,因为要生成很多java代码文件,如果服务端更改,需要重新生成代码文件,不过使用jdk去发布webservice简单易于操作,只为更好的理解web服务的调用。在后面文章中着重介绍cxf框架以及如何调用如天气等免费的web服务
参考文章
https://blog.csdn.net/cherry_11qianqian/article/details/81531675