WebService(jdk中的wsimport解析wsdl,jdk发布webservice)
学习webservice预备知识
(1)XML—Extensible Markup Language 扩展性标记语言
XML,用于传输格式化的数据,是Web服务的基础。
namespace-命名空间。
xmlns=“http://www.xr.com” 使用默认命名空间。
xmlns:xr=“http://www.xr.com”使用指定名称的命名空间。
(2)WSDL—WebService Description Language Web服务描述语言。
通过XML形式说明服务在什么地方-地址。
通过XML形式说明服务提供什么样的方法 – 如何调用。
(3)SOAP—Simple Object Access Protocol(简单对象访问协议)
SOAP作为一个基于XML语言的协议用于有网上传输数据。
SOAP = 在HTTP的基础上+XML数据。
SOAP是基于HTTP的。
SOAP的组成如下:
Envelope – 必须的部分。以XML的根元素出现。
Headers – 可选的。
Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。
webservice网址
Webservice服务网站:http://www.webxml.com.cn
查询手机归属地
客户端发送请求
POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: ws.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getMobileCodeInfo xmlns="http://WebXml.com.cn/">
<mobileCode>string</mobileCode>
<userID>string</userID>
</getMobileCodeInfo>
</soap12:Body>
</soap12:Envelope>
服务端响应请求
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">
<getMobileCodeInfoResult>string</getMobileCodeInfoResult>
</getMobileCodeInfoResponse>
</soap12:Body>
</soap12:Envelope>
一、jdk中的wsimport解析wsdl
WSDL解析
点开webservice网站上的手机归属地查询里的
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
查看wsdl对服务器的描述
Wsdl文档从下往上读
wsdl:service—所有请求服务的站点集合
wsdl:port—定义为webservice单个服务访问点
binding—特定服务访问点与具体服务类的绑定
PortType—对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)
Operation—对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)
Types-数据类型定义的容器,它使用某种类型系统需要的输入参数和输出参数的数据类型
Message—通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(输入参和输出参)
使用jdk当中的wsimport.exe生成客户端代码
常用参数为:
-d<目录> - 将生成.class文件,默认参数。
-s<目录> - 将生成.java文件和class文件。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数
1、首先在E:盘下创建一个wsCode文件夹
2、然后打开命令窗体,跳转到这个文件夹下
复制上面的内容
3、在命令窗口的文件夹下执行命令
wsimport -s . -p com.xr.mobile http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
4.执行完毕后,去你创建的文件夹下,会发现出现以下内容
然后右键让这些文件按类型排序,删除所有class文件,留下java文件
打开idea软件
首先创建一个java项目,然后再在这个项目下创建一个java项目wsclient
将生成的java文件复制进com.xr.mobile包中
写一个测试包com.xr.server
写一个用来测试的类MobileTest
MobileCodeWS:
MobileCodeWSSoap:
getMobileCodeInfo:
package com.xr.server;
import com.xr.mobile.MobileCodeWS;
import com.xr.mobile.MobileCodeWSSoap;
public class MobileTest {
public static void main(String[] args) {
//创建服务站点
MobileCodeWS mcws=new MobileCodeWS();
//获取服务站点下的类
MobileCodeWSSoap mcwss=mcws.getMobileCodeWSSoap();
//调用绑定类中的方法
String mobile=mcwss.getMobileCodeInfo("13888888888","");
System.out.println(mobile);
}
}
然后运行就可以了,结果为
二、jdk发布webservice
首先创建一个java项目wsserver
随便在包中com.xr.hello写一个类HelloWorld
package com.xr.hello;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class HelloWorld {
public @WebResult(name="java3server")
String sayHello(@WebParam(name = "name") String name){
return name+"hello";
}
public static void main(String[] args) {
/*
* Endpoint断点服务类
* 使用静态publish方法*/
Endpoint.publish("http://127.0.0.1:999/hello",new HelloWorld());
}
}
然后运行,在浏览器中测试,注意浏览器中的地址要在原地址后面加?wsdl否则无法进入
看看自己发布的可不可被调用,则只要重复以上使用wsimport解析即可
wsdl文档名称修改
package com.xr.hello;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService(
serviceName = "myService",//服务站点名
portName = "myPort",//绑定端口名
name="helloWorld",//服务对应的类名
targetNamespace = "com.xr.hello"//服务站点所在包名
)
public class HelloWorld {
public @WebResult(name="java3server")
String sayHello(@WebParam(name = "name") String name){
return name+"hello";
}
/*写了这个则这个方法在wsdl文件中不显示*/
@WebMethod(exclude = true)
public@WebResult(name = "haha") String sayYou(@WebParam(name = "you") String you){
return you+"你";
}
public static void main(String[] args) {
/*
* Endpoint断点服务类
* 使用静态publish方法*/
Endpoint.publish("http://127.0.0.1:999/hello",new HelloWorld());
}
}