在上一篇博客中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目录glassfish4glassfishbin下,有一个命令wsimport是我们需要的。这个命令可以将WSDL转为基于JAX-WS的java类。这些类是开发客户端所依赖的。
导入WSDL
使用wsimport命令,将WSDL转为java类。
C:glassfish4glassfishbin>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>
是不是超级简单了啊?