WebService是基于SOAP协议的,全称是Simple Object Access Protocol(简单对象访问协议)。
SOAP不是什么神奇的东西,等于HTTP+XML,即在HTTP协议的基础上传输XML文档数据,Content-Type类型是text/xml;charset=UTF-8
Webservice网址是:http://www.webxml.com.cn,上面有很多公共的服务可以拿来练习。最重要的是上面的以.wsdl结尾的路径地址,这是我们调用该Webservice服务的基础。
一.调用WebService服务
1.用wsimport.exe根据上述.wsdl路径生成java代码。
命令行:
C:\Program Files\Java\jdk1.7.0_51\bin>wsimport.exe -s d:/wscode -p com.maizuo.webservice http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?wsdl
生成java代码的命令如上,-s 后跟目录,表示生成的.java文件放在此目录中;-p 后跟的其实是包名,如果指定的包名合适的话,到时候可以直接把代码拷贝到项目中而不用做任何修改。
2.把java文件拷贝到项目对应的包中
3.创建服务访问点集合对象
从下往上看WSDL文档,找到<service name="HelloService">(也可能有命名空间,则可能是<wsdl:service name="HelloService">),可以看到service的name属性值是HelloService,这个类就是入口类。
HelloService hs=new HelloService();
4.根据服务访问点获得服务类对象
通过hs打点的方式,在编辑器有代码提示的情况下可以看到合适的方法
DDD d=hs.getxxx();
5.通过服务类对象就可以调用服务类的方法
d.getxxx
二.发布WebService服务
1.用@WebService注解标注要提供服务的类。要提供服务的类,简称服务类,需要至少有一个非static、非final的方法,因为static或者final的方法在发布后,调用者根本得不到该方法。如果有多个方法,但只想发布部分方法,可以用@WebMethod(exclude = true)修饰不想被发布出去的方法,这样调用者也得不到该方法了:
@WebService() public class Hello { @WebMethod(exclude = true) public String sayHello(String name) { return name + " hello!"; } public String sayHi(String name) { return name + " hi!"; } }
如上,调用的时候只能访问sayHi(String name)方法。至于服务类中的方法有没有返回值、返回值类型是什么、有没有参数,这些需要根据业务需求来定。
2.可以在服务类中也可以在其他任意类中,写一个main方法,只需一行代码,调用javax.xml.ws.Endpoint抽象类的静态方法publish(String address, Object implementor),其中参数address是发布的地址,一般是ip地址加上端口号加斜杠(或者斜杠后面再加上些类似命名空间的字符串),implementor则为一个服务类对象:
public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:8088/hh", new Hello()); }经过以上两个步骤,就发布成功了一个WebService服务。
在浏览器中访问http://127.0.0.1:8088/hh,得到如下页面内容
Web Services
Endpoint Information Service Name: {http://server.maizuo.com/}HelloService Port Name: {http://server.maizuo.com/}HelloPort Address: http://192.168.1.60:8080/ WSDL: http://192.168.1.60:8080/?wsdl Implementation class: com.maizuo.server.Hello现在WSDL对应的链接即为调用此WebService服务时需要的.wsdl链接,通过最上面介绍的调用方式调用即可。