在上一篇博客中WebService Raw Client ,我们揭开了WebService的内衣,看清了WebService的躶体。明白如何通过查看WSDL来构建SOAP协议的请求和应答。
任何一种工具,都是为了隐藏复杂繁琐的底层实现,这也以藏了原理。但工具却极大的简化了我们的工作。在理解原理以后,我们需要追求工具的便利性。今天就是承接上一篇博文,使用JAX-WS来简化client的开发。我还是使用天气预报服务 http://www.webservicex.net/globalweather.asmx?WSDL
J2EE SDK
在使用JAX-RS前,先安装J2EE SDK。要求至少版本5以上,我装的是7。在SDK目录glassfish4\glassfish\bin下,有一个命令wsimport是我们需要的。这个命令可以将WSDL转为基于JAX-WS的java类。这些类是开发客户端所依赖的。
导入WSDL
使用wsimport命令,将WSDL转为java类。
C:\glassfish4\glassfish\bin>wsimport -extension -keep -verbose -d d:/share http://www.webservicex.net/globalweather.asmx?WSDL
keep : 保留生成的.java文件
verbose : 输出编译信息。
d : 声明文件产生在哪一个目录中
extension : 在不声明extension的情况下,wsimport只支持soap,对绑定在http上的port不进行编译。所以需要声明extension.
在目录d:/share下,可以看到生成的文件。
编写client
在eclipse中,生成一个java project。然后将WSDL生成的java或class导入到项目中。
然后在自己的方法中就可以调用WSDL提供的方法了:
public class App
{
public static void main( String[] args )
{
GlobalWeather service = new GlobalWeather();
GlobalWeatherSoap port = service.getGlobalWeatherSoap();
String body = port.getWeather("shanghai", "China");
System.out.println(body);
}
}
运行以后,输出:
<?xml version="1.0" encoding="utf-16"?>
<CurrentWeather>
<Location>Shanghai / Hongqiao, China (ZSSS) 31-10N 121-26E 3M</Location>
<Time>Apr 17, 2014 - 11:30 AM EDT / 2014.04.17 1530 UTC</Time>
<Wind> from the NW (320 degrees) at 4 MPH (4 KT) (direction variable):0</Wind>
<Visibility> 1 mile(s):0</Visibility>
<Temperature> 62 F (17 C)</Temperature>
<DewPoint> 57 F (14 C)</DewPoint>
<RelativeHumidity> 82%</RelativeHumidity>
<Pressure> 29.94 in. Hg (1014 hPa)</Pressure>
<Status>Success</Status>
</CurrentWeather>
是不是超级简单了啊?