1.笔记内容
1. 便民网站分析;2. java开发webservice;3. webservice和socket区别;4. 什么是webservice;5. Soap1.1和soap1.2区别;6. wsdl;7. 客户端开发的第二种方式;8. soap;9. 通过http发送soap协议体;10. webservice客户端开发总结;
2.便民网站分析
2.1:通过便民网站,查询日常信息
分析:
Tcp: 是一种传输层协议,是一种面向连接的协议,经过三次握手客户端和服务端建立一个连接(通道)。Tcp传输数据时稳定。
Udp:是一种传输层协议,是一种数据报协议,速度快但不稳定。它是面向非连接的协议,它不与对方建立连接,而且直接就把数据报发送过去。
2.2:Socket实现天气查询
企业开发后台服务常使用socket。socket开发时注意:1.服务端要有可持续运行能力,保证线程一直在运行。2.并发处理能力,要使用多线程。
分析:
实现:
//创建服务端
public class WeatherServer {
public static void main(String[] args) throws Exception {
/**
* 创建socket服务端 应用服务的端口建议10000以上,主要目的避免端口被占用问题
*/
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("启动天气查询服务!");
while (true) {
try {
/**
* 接受客户端连接 阻塞方法
*/
Socket socket = serverSocket.accept();
Thread.sleep(1000);
/**
* 开启一个新线程 新线程处理内容就是:接受客户端的请求,向客户端发送数据
* 可以使用线程池 ThreadPoolExecutor
*/
new Thread(new WeatherRunable(socket)).start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//加入多线程测试
public class WeatherRunable implements Runnable {
private Socket socket;
public WeatherRunable(Socket socket) {
this.socket = socket;
}
public void run() {
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
try {
/**
* 接受客户端请求数据
*/
dataInputStream = new DataInputStream(socket.getInputStream());
String cityName = dataInputStream.readUTF();
System.out.println("from client..." + cityName);
/**
* 向客户端发送数据
*/
dataOutputStream = new DataOutputStream(socket.getOutputStream());
String result = "晴";
dataOutputStream.writeUTF(result);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dataInputStream.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
dataOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//创建客户端
/**
* 天气查询socket客户
* @author zhaojd
*/
public class WeatherClient {
public static void main(String[] args) throws Exception, IOException {
/**
* 创建socket链接
*/
Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
while (true) {
try {
socket = new Socket("127.0.0.1", 12345);
/**
* 向服务器发送数据
*/
dataOutputStream = new DataOutputStream(socket.getOutputStream());
String cityName = "广州";
dataOutputStream.writeUTF(cityName);
System.out.println("to server..." + cityName);
/**
* 接受服务器数据
*/
dataInputStream = new DataInputStream(socket.getInputStream());
String result = dataInputStream.readUTF();
System.out.println("from server..." + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
dataInputStream.close();
dataOutputStream.close();
socket.close();
}
}
}
}
小结:
使用socket传输数据需要关注如何解析数据流。
如果可以面向对象开发,直接传输Java对象,既可减轻开发的复杂度。
3. java开发webservice
java中共有三种webservice规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。
3.1 Jaxws
JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。Jaxws开发的webservice传输soap协议。
3.2 JAXM&SAAJ
JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输等,JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,JAXM&SAAJ通常不使用。
3.3 JAX-RS
JAX-RS 是JAVA针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。这种方式,当前比较流行,因为jax-RS可以发布 rest风格webservice,因为rest的webservice不采用soap传输,直接采用http传输,可以返回xml或json,比较轻量。
3.4 Jaxws实现天气查询(支持Java面向对象开发)
3.4.1 服务端
定义Java接口,提供天气查询方法。
1.SEI
编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中称为接口。
//SEI
public interface WeatherInterface {
//根据城市名称查询天气信息
public String queryWeather(String cityName);
}
2.SEI实现类
/**
* 天气查询SEI的实现类
* @author zhaojd
* 使用@WebService标记该类为webservice的服务类
*/
@WebService
public class WeatherInterfaceImpl implements WeatherInterface{
public String queryWeather(String cityName) {
// TODO Auto-generated method stub
System.out.println("from client..." + cityName);
//使用静态数据
String result = "晴";
//return这句即向客户端返回数据
System.out.println("to client..." + result);
return result;
}
}
3.发布webservice服务
/**
* 发布天气查询服务
* @author zhaojd
*/
public class WeatherServer {
public static void main(String[] args) {
/**
* 发布天气查询服务
* 第一个参数:webservice的地址
* 第二个参数:使用@webService 标记的服务对象
*/
Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
}
}
4.验证webservice服务是否发布成功
在webservice的地址后面添加?wsdl,查询webservice的使用说明书内容是否完整,如果wsdl内容完整,表示webservice发布成功。
阅读wsdl方法(wsdl是xml格式文档):
从下往上读:找到service —>port —>binding (binding中的type就是portType;最终通过binding知道portType) portType有方法,调用webservice就是调用portType的方法。
3.4.2 客户端(支持面向对象开发)
客户端功能调用webservice,先知道webservice地址,一般情况下,明知要知道wsdl的地址,就可以知道webservice地址。
1.阅读wsdl
找到service(服务视图),通过binding找到portType(服务端点)
2.使用wsimport生成webservice的客户端调用代码
Wsimport:是jdk提供的一个工具,作用是根据webservice的wsdl地址生成客户端调用代码。单独创建一个工程wsimport存放生成代码,通过cmd进入工程wsimport目录。默认生成的代码所在包名,是wsdl中命名空间的倒序。
3.Wsimport介绍
wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码)。当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。
wsimport.exe位于JAVA_HOME\bin目录下.
常用参数为:
-d<目录> - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数。
示例:
C:/> wsimport –s . http://127.0.0.1:1234/weather?wsdl
注意:-s不能分开,-s后面有个小点
4.将生成的客户端开发拷贝到客户端程序并编写客户端代码
/**
* jaxws天气查询客户端
* @author zhaojd
*/
public class WeatherClient {
public static void main(String[] args) {
/**
* 创建服务视图对象
*/
WeatherInterfaceImplService weatherInterfaceImplService = new WeatherInterfaceImplService();
/**
* 通过服务视图得到portType(接口类型)
*/
WeatherInterfaceImpl weatherInterfaceImplPort =
weatherInterfaceImplService.getWeatherInterfaceImplPort();
/**
* 调用webservice方法。
*/
String result = weatherInterfaceImplPort.queryWeather("广州");
System.out.println(result);
}
}
4.webservice和socket区别
Socket:
是一种传输层的协议。常用tcp、udp。Socket是操作系统提供的一套网络接口,不同的编程语言都有实现。Socket是跨平台的。传输数据时需要程序员自己解析数据流。
优点 :传输速度很快。应用场景:如果要考虑传输速度,优先使用Socket。
Webservice:
使用soap协议:基于http(http也是应用层协议,基于socket传输数据)的应用层协议, http或soap都是跨平台的。Soap是http协议的基础上,一个基于XML的协议。不同:都是底层的通信协议,请求包的格式不同而已,soap包是XML格式,http纯文本格式。
Jaxws开发Webservice,传输数据库是面向对象方式,不用程序员自己解析数据流。
Webservice如何传输数据:
因为webservice要经过两次序列化,传输速度不快。
缺点:传输速度慢。优点:面向对象开发,soap协议是一个标准协议,方便进行跨平台、跨公司进行接口开发。应用场景:不考虑传输速度前提下,根据soap标准协议,方便进行接口定义。
5.什么是webservice
web服务+跨平台+远程调用+soap协议传输数据
5.1 定义
Webservice即web服务,是一种跨平台的远程调用技术,基于http的soap协议传输数据,也可以直接使用http传输数据。
1. Webservice即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
2. 采用标准SOAP(Simple Object Access Protocol)协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输的是xml数据。
3. 采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准。
4. xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
5. XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。
当前非SOAP协议的webService以轻量为首要目标,比如rest webservice也是webservice的一种方式。
5.2 webservice三要素
5.2.1 soap
soap协议是webservice传输协议,即简单对象访问协议。Soap协议是xml格式,理解为基于http传输xml数据。Soap=http+xml。
5.2.2 wsdl
wsdl是webservice的使用说明书。根据阅读wsdl可以知道如何去调用webservice。从下往上读,找到service服务视图,通过binding找到portType(服务类)。
5.2.3 UDDI
UDDI是一个目录服务,存储了全球的webservice地址。
UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
5.3 webservice应用场景
5.3.1 用于分布式应用集成,实现软件重用
系统A和系统B可以通过单点登陆系统进行用户身份认证。
单点登陆系统:将用户登陆功能抽取出来,组成一个单独系统,达到软件重用的目标。
用户信息可以在单点登陆系统一处存储,系统A和系统B不用记录用户信息,方便有效进行系统集成。
5.3.2 建议不用webservice
同构程序间通信可以不用webservice,前提是多个同构程序是相同的公司开发的。比如:一个公司作了两个程序,都 是java,采用java提供一个远程调用技术,RMI。RMI 指的是远程方法调用 (Remote Method Invocation)。RMI基于socket传输数据,支持面向对象,要比soap协议传输快。Socket>RMI>soap
5.3.3 建议使用webservice
公开接口:
在互联网发布服务接口,不考虑客户端的类型,使用webservice发布服务。因为webservice基于soap协议(w3c标准协议),所以使用soap发布服务。
调用webservice服务端
由于webservice服务端已确定,作为客户端别无选择。
5.4 webservice优缺点
5.4.1 优点
1、采用xml支持跨平台远程调用。
2、基于http的soap协议,可跨越防火墙。
(因为SOAP一般使用HTTP协议,而服务器的这个协议一般都是开放的,而且是可以穿过防火墙的)
3、支持面向对象开发。
4、有利于软件和数据重用,实现松耦合。
5.4.2 缺点
由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议去完成简单的数据传输的效率不高。如果直接用http传输自定义数据内容比webservice开发更快捷,例如第三方支付公司的支持接口。
5.5 小结
Webservice是基于http发布web服务,可以采用soap协议作为传输数据格式,也可以直接使用http传输数据,比如rest方式。
5.6 再谈socket和webservice应用场景
Socket:
优点:传输速度快。缺点:需要手动解析数据流,如果用socket传输数据需要接口双方定义接口协议格式(传什么格式xml,传什么json???),自定义协议,不方便进行接口开发。场景:要考虑传输速度,优先使用socket,但是需要自定义协议(接口双方定义一个传输的数据格式)。
Socket开发:注意:socket服务可持续性,高并发性。
Webservice:
优点:采用标准soap协议,接口双方只要遵循标准协议开发使用接口。通过wsdl知道接口内容。方便进行接口开发。缺点:传输速度慢。场景:公开接口,在不考虑客户端类型或传输性能,接口面向整个互联网,优先考虑webservice。
Webservice性能差的原因:如果传输soap经过两次对象序列化,webservice的性能依赖中间件的性能。
6.wsdl
6.1 定义
1.wsdl指网络服务描述语言(Web Services Description Language)
2.wsdl是一种使用xml编写的文档。这种文档可描述某个webservice。它可规定服务的位置,以及此服务提供的操作(或方法)。
WSDL是一种XML文档、WSDL用于描述网络服务、WSDL也可用于定位网络服务、通过wsdl知道webservice如何调用。
6.2 说明书的结构
从下往上读:
<service> 服务视图,webservice的服务结点,它包括了服务端点
<binding> 为每个服务端点定义消息格式和协议细节
<portType>服务端点,描述web service可被执行的操作方法,以及相关的消息,通过binding指向portType
<message> 定义一个操作(方法)的数据参数(可有多个参数)
<types> 定义webservice使用的全部数据类型
7.客户端开发第二种方法(jaxws标准方法)
7.1 使用jdk的service类调用webservice
/**
* 使用jdk的service类调用webservice
*
* @author zhaojd
*
*/
public class WertherClient_02 {
public static void main(String[] args) throws Exception {
// wsdl的路径
URL wsdlDocumentLocation = new URL("http://127.0.0.1:54321/weather?wsdl");
/**
* 从wsdl中找到服务视图
* 第一个参数:wsdl的命名空间
* 第二个参数:服务视图名称
*/
QName serviceName =
new QName("http://server.weather.jaxws.ws.keymobile.cn/","WeatherInterfaceImplService");
// 第一步:使用Service创建服务视图
Service service = Service.create(wsdlDocumentLocation, serviceName);
// 第二步:从服务视图得到portType对象
WeatherInterfaceImpl weatherInterfaceImpl = service.getPort(WeatherInterfaceImpl.class);
String weather = weatherInterfaceImpl.queryWeather("广州");
System.out.println(weather);
}
}
/**
1. 使用jaxws标准方法调用公网天气查询
*/
public class WeatherClient_02 {
public static void main(String[] args) throws Exception {
/**
* wsdl的路径
*/
URL wsdlDocumentLocation = new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl");
/**
* 从wsdl中找到服务视图
* 第一个参数:wsdl的命名空间
* 第二个参数:服务视图名称
*/
QName serviceName = new QName("http://WebXml.com.cn/", "WeatherWebService");
/**
* 第一步:通过Service类来创建服务视图
*/
Service service = Service.create(wsdlDocumentLocation, serviceName);
/**
* 第二步:通过服务视图获取到portType
*/
WeatherWebServiceSoap weatherWebServiceSoap = service.getPort(WeatherWebServiceSoap.class);
/**
* 第三步:调用方法
*/
ArrayOfString arrayOfString = weatherWebServiceSoap.getWeatherbyCityName("广州");
List<String> results = arrayOfString.getString();
for (String result : results) {
System.out.println(result);
}
}
}
7.2 小结
使用jaxws标准方法调用webservice可以指定webservice的调用地址,比通过生成代码调用webservice要灵活!
8. soap
8.1 soap定义
Soap(Simple Object Access Protocol)简单对象访问协议,基于http传输xml数据,soap协议体是xml格式。
1. SOAP 是一种网络通信协议
2. SOAP 用于跨平台应用程序之间的通信
3. SOAP 被设计用来通过因特网(http)进行通信
4. SOAP = HTTP+XML,其实就是通过HTTP发xml数据
5. SOAP 很简单并可扩展支持面向对象
6. SOAP 允许您跨越防火墙
7. SOAP 将被作为 W3C 标准来发展
8.2 使用TCP/IP Monitor监视Soap协议
8.2.1 TCP/IP Moinitor的配置
TCP/IP Monitor:是eclipse自带的一个工具,通过代理的方法监视tcp协议内容。
8.3 测试
编写webservice客户端,向代理端口中发送数据。地址:http://127.0.0.1:54321/weather?wsdl
客户端请求的soap协议内容:
POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://server.weather.jaxws.ws.keymobile.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 226
Soap协议体内容:
Xml格式。
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeather xmlns:ns2="http://server.weather.jaxws.ws.itcast.cn/">
<arg0>广州</arg0>
</ns2:queryWeather>
</S:Body>
</S:Envelope>
响应内容:
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8
Date: Tue, 30 Dec 2014 06:40:50 GMT
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://server.weather.jaxws.ws.itcast.cn/">
<return>晴</return>
</ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
8.4 soap协议体的内容
//必需有 Envelope 元素,此元素将整个 XML 文档标识为一条 SOAP 消息
//必需有Body 元素,包含所有的调用和响应信息
//可选的 Header 元素,包含头部信息
//可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap=http://www.w3.org/2001/12/soap-envelope soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
... ...
</soap:Header>
<soap:Body>
... ...
<soap:Fault>
... ...
</soap:Fault>
</soap:Body>
</soap:Envelope>
Soap协议常用1.1和1.2两个版本。
8.5 Soap1.2协议测试
如何将service类发布soap1.2? 在SEI实现类上添加如下注解@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) Soap1.2要发布,需要下载扩展包:Jaxws实现soap1.2需要加入jaxws扩展包,从sun下载jaxws-ri-2.2.8,解压jaxws-ri-2.2.8并将lib下的jar包加载到java工程中。
soap1.2请求和响应:
请求内容:
POST /weather HTTP/1.1
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml;
charset=utf-8;action="http://server.weather.jaxws.ws.keymobile.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 224
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeather xmlns:ns2="http://server.weather.jaxws.ws.keymobile.cn/">
<arg0>广州</arg0>
</ns2:queryWeather>
</S:Body>
</S:Envelope>
响应内容:
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: application/soap+xml; charset=utf-8
Date: Tue, 30 Dec 2014 07:39:51 GMT
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://server.weather.jaxws.ws.itcast.cn/">
<return>晴</return>
</ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
8.6 Soap1.1和Soap1.2的对比
Soap1.1版本:
通过http进行post请求。
Content-Type: text/xml; charset=utf-8
Soap1.1命名空间:http://schemas.xmlsoap.org/soap/envelope/
Soap1.2版本:
Post请求
Content-Type: application/soap+xml;
soap1.2命名空间:http://www.w3.org/2003/05/soap-envelope
soap1.1的服务端需要soap11客户端调用
soap1.2的服务端soap1.1客户端和soap1.2客户端都 可以调用。
9. 通过http发送soap协议体(xml)
思路:模拟一个http的客户端(相当于一个浏览器),客户端通过程序实现,向webservice的服务端发送soap协议(xml)。在企业开发中,很多都是http接口,需要写程序模拟http请求,请求数据解析数据。
实现的核心代码:
//开启 一个http链接
//webservice地址
URL url = new URL("http://127.0.0.1:12345/weather");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//设置post请求,post是大写
httpURLConnection.setRequestMethod("POST");
//Content-Type: text/xml; charset=utf-8
httpURLConnection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
//设置请求和响应
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
String requestString = requestString("郑州");
//发送soap协议
httpURLConnection.getOutputStream().write(requestString.getBytes());
//接收响应内容
InputStream inputStream = httpURLConnection.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len=-1;
byte[] b = new byte[1024];
//将inputStream内容写到byteArrayOutputStream
while((len= inputStream.read(b, 0, 1024))!=-1){
byteArrayOutputStream.write(b, 0, len);
}
//获取响应内容
String responseString = byteArrayOutputStream.toString();
System.out.println(responseString);
//解析响应的xml数据。
//....
inputStream.close();
byteArrayOutputStream.close();
10. Webservice客户端开发方法总结
10.1 使用客户端生成代码方法
第一步:使用wsimport或其它工具(比如cxf的wsdl2java)生成客户端的调用
第二步:使用生成代码调用webservice服务端
1. 使用生成的service服务视图类创建服务视图对象。
2. 调用service服务对象的getPortXXX方法得到portType。
//创建服务视图对象
WeatherInterfaceImplService weatherInterfaceImplService =new WeatherInterfaceImplService();
//通过服务视图得到portType(接口类型)
WeatherInterfaceImpl weatherInterfaceImpl = weatherInterfaceImplService.getWeatherInterfaceImplPort();
//调用webservice方法
String result = weatherInterfaceImpl.queryWeather("郑州");
10.2 使用jaxws标准方法(Service类)(推荐使用)
第一步:使用wsimport或其它工具(比如cxf的wsdl2java)生成客户端的调用
第二步:使用url、qname、service调用服务端
//wsdl的路径
URL wsdlDocumentLocation = new URL("http://127.0.0.1:54321/weather?wsdl");
//从wsdl中找到服务视图
//第一个参数:wsdl的命名空间
//第二个参数:服务视图名称
QName serviceName = new QName("http://server.weather.jaxws.ws.itcast.cn/", "WeatherInterfaceImplService");
//第一步使用Service创建服务视图
Service service =Service.create(wsdlDocumentLocation, serviceName);
//从服务视图得到portType对象
//参数:portType
WeatherInterfaceImpl
weatherInterfaceImpl = service.getPort(WeatherInterfaceImpl.class);
10.3 模拟http客户端调用webservice服务
使用HttpURLConnection或apache的Httpclient模拟http请求,调用webservice。注意:使用此方法不需要生成客户端调用代码。