WebService原理与实例
一、通过jdk实现webservice。 ? ? 发布webservice。 ? ? ? ? ? 1、jdk提供了@WebService注释,用来标记webservice类 ? 2、对于webservice发布的方法要求非static或者final的。jdk中提供了Endpoint类用来发布webservice import javax.jws.WebService; @WebService public interface ServerWebInter { public Integer addInteger(Integer a,Integer b); public String sayHello(String name); } import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public class ServerWeb implements ServerWebInter{ public static void main(String[] args) { //参数一位webservice发布的地址 参数二位webservice的具体实现类 Endpoint.publish("http://localhost:8888/webservice/ServerWeb",new ServerWeb()); System.out.println("game,over!"); } public Integer addInteger(Integer a,Integer b){ System.out.println("您都不要看书了,您都悟透了您都!"); return a+b; } public String sayHello(String name){ System.out.println(name); return name+",hello"; } }执行main方法 打开浏览器输入上面发布的地址: http://localhost:8888/webservice/ServerWeb?wsdl ?其中?wsdl是后面加上的。能看到下面所示页面即表示webservice发布成功
<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --> <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://server.webservice.ccsu.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://server.webservice.ccsu.com/" name="ServerWebService"> <types> <xsd:schema> <xsd:import namespace="http://server.webservice.ccsu.com/" schemaLocation="http://localhost:8888/webservice/ServerWeb?xsd=1"/> </xsd:schema> </types> <message name="addInteger"> <part name="parameters" element="tns:addInteger"/> </message> <message name="addIntegerResponse"> <part name="parameters" element="tns:addIntegerResponse"/> </message> <message name="sayHello"> <part name="parameters" element="tns:sayHello"/> </message> <message name="sayHelloResponse"> <part name="parameters" element="tns:sayHelloResponse"/> </message> <portType name="ServerWeb"> <operation name="addInteger"> <input wsam:Action="http://server.webservice.ccsu.com/ServerWeb/addIntegerRequest" message="tns:addInteger"/> <output wsam:Action="http://server.webservice.ccsu.com/ServerWeb/addIntegerResponse" message="tns:addIntegerResponse"/> </operation> <operation name="sayHello"> <input wsam:Action="http://server.webservice.ccsu.com/ServerWeb/sayHelloRequest" message="tns:sayHello"/> <output wsam:Action="http://server.webservice.ccsu.com/ServerWeb/sayHelloResponse" message="tns:sayHelloResponse"/> </operation> </portType> <binding name="ServerWebPortBinding" type="tns:ServerWeb"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="addInteger"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="sayHello"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="ServerWebService"> <port name="ServerWebPort" binding="tns:ServerWebPortBinding"> <soap:address location="http://localhost:8888/webservice/ServerWeb"/> </port> </service> </definitions>二、解析wsdl文件 wsdl文件中包含 <service>节点即服务 ?name属性为webservice的名称下面的 <soap:address location>为服务的地址。<port>节点binding即对应的具体实现类,通过这个与上面 <binding>节点的name属性相等可以找到具体的实现类。<binding>中的type=“ServerWeb”找到<typeport>中的name=“serverweb”,而中有多少个<operation>即有该webservice提供了多少个方法。<operation>中的name即方法名其中<input>为输入参数<output>为输出参数,其中的message属性对应<message>中的name 属性,这样还是看不出来有多少参数与参数的类型。其上 <xsd:schema> <xsd:import namespace="http://server.webservice.ccsu.com/" schemaLocation="http://localhost:8888/webservice/ServerWeb?xsd=1"/> </xsd:schema> 中schemaLocation的地址在文件中打开<message>中的name对应http://localhost:8888/webservice/ServerWeb?xsd=1页面<xs:complexType?>中的name ?其子节点表明了方法的参数个数与类型 三、通过jdk自带的工具调用jdk ? 方法一、通过wsimport导入(jdk提供了wsimport命令用来将wsdl文件方向生成java文件) 打开cmd命令,wsimport -s . ?服务的地址如http://localhost:8888/webservice/ServerWeb?wsdl ? ? 将在刚才目录下生成相对应的Java文件以及相应的包文件夹
<span style="white-space:pre"> </span>/** * 通过wsimport方法调用webservice * */ public static void wsimportTest(){ //1、wsimport生成的wsdl中的<service name="ServerWebService">这个节点 ServerWebService service = new ServerWebService(); //2、通过wsdl中的<service>节点下的<port name="ServerWebPort" binding="tns:ServerWebPortBinding">得到webservice实现类的代理 ServerWeb web = service.getServerWebPort(); //3、调用具体的方法 Integer count = web.addInteger(35,23); System.out.println(count); String returnStr = web.sayHello("admin"); System.out.println(returnStr); }方法二、通过ajax+js的方式调用 webservice提供了SOAP(Sample Object Access Protocol)用来传输数据,soap通过HTTP的的方式来传输(其只有POST的方式,因为soap需要有请求体? ? <env:Body?>)起通过XML的方式携带数据。 通过myelcipse得到请求soap以及webservice回传的soap的格式 点击1出Web Services Explorer 2处WSDL Page 点击3处在4处输入服务的地址将会看到ServiceWebPortBinding,点击将会显示具体对应的方法。点击方法在右边的Add 中输入参数点击Go按钮在下一个方框中显示resource ?点击resource将会看到SOAP Request Envelope以及SOAP Response Envelope的请求格式: <script > var xhr = new ActiveXObject("Microsoft.XMLHTTP"); function sendSoap(){ //服务地址 var wsUrl = "http://localhost:8888/webservice/ServerWeb"; //请求提 var soap = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:q0='http://server.webservice.ccsu.com/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema instance'>"+ "<soapenv:Body><q0:sayHello><arg0>admin</arg0></q0:sayHello></soapenv:Body></soapenv:Envelope>"; //打开连接 xhr.open("POST",wsUrl,true); //重新设置请求头 xhr.setRequestHeader("Content-Type","text/xml; charset=utf-8"); //设置回调函数 xhr.onreadystatechange = _back; //发送请求 xhr.send(soap); } function _back(){ if(xhr.readyState==4){ if(xhr.status==200){ var ret = xhr.responseXML; alert(ret); alert("webservice 调用成功了"); } } } </script> 方法三、通过URLConnection调用webservice /**
/** * 通过客户端的方式调用webservice * @throws Exception */ public static void clientTest() throws Exception{ URL wsurl = new URL("http://localhost:8888/webservice/ServerWeb"); //QName 的第一个参数WSDL文档中targetNamespace对应的值 第二个参数<service>的值 Service service = Service.create(wsurl,new QName("http://server.webservice.ccsu.com/","ServerWebService")); //QName 第一个还是名称空间 第二个是<service>下的port 对应服务的借口 ServerWeb web = service.getPort(new QName("http://server.webservice.ccsu.com/","ServerWebPort"),ServerWeb.class); String ret = web.sayHello("admin"); System.out.println(ret); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |