WebService入门详解
1、什么是webservice先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于webservice的服务端,我们的系统就相当于客户端。如http://www.webxml.com.cn这个网站上面就列举了多个webservice服务站点 2、JAVA中如何调用别人发布的webservice2.1、获取webservice的wsdl文档2.11、什么是wsdl文档wsdl跟java一样,也是一种语言,是通过xml的形式说明该webservice如何调用。 2.12、如何获取wsdl文档通过在webservice的url后面加?wsdl的方式,比如天气预报的的就是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 2.13、WSDL解析Wsdl文档从下往上读 2.2、通过wsdl文档生成客户端调用代码2.21、使用jdk自带的命令生成配置java环境变量后在命令窗口中输入wsimport –s . http://xxxx.xx.xx/xxx?wsdl即可生成java代码 2.3、生成代码后如何调用先把生成的代码复制到项目中,然后通过读wsdl文档来调用 //wsdl文档中service的name SayHelloIntefaceService ss = new SayHelloIntefaceService(); //wsdl文档中portType的name SayHelloInteface shf=ss.getSayHelloIntefacePort(); //wdl文档中complexType的name String str=shf.sayhellow("lisi"); //str即为webservice的服务端返回的信息 System.out.println(str); 3、如何发布一个webserviceEndpoint.publish("http://127.0.0.1:8080/sayHello",new SayHellowIntefaceImpl()); 注意:用Jdk1.6.0_21以后的版本发布一个WebService服务.与Web服务相关的类,都位于javax.xml.ws.*包中。 4、其他调用webservice的方式4.11、 使用ajax调用var xhr; function invoke(){ if(window.ActiveXObject){ xhr = new ActiveXObject("Microsoft.XMLHTTP"); }else{ xhr = new XMLHttpRequest(); } //指定请求地址 var url = "http://127.0.0.1:7777/hello?wsdl"; //定义请求类型和地址和异步 xhr.open("POST",url,true); //设置Content-Type xhr.setRequestHeader("Content-Type","text/xml;charset=UTF-8"); //指定回调方法 xhr.onreadystatechange = back; var textVal = document.getElementById("mytext").value; //组装消息体的数据 var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://server.hm.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +'<soapenv:Body>' +'<q0:sayHello>' +'<arg0>'+textVal+'</arg0>' +'</q0:sayHello>' +'</soapenv:Body>' +'</soapenv:Envelope>'; xhr.send(data); } function back(){ if(xhr.readyState == 4){ if(xhr.status == 200){ var doc = xhr.responseXML; alert(doc); alert(xhr.responseText); var tag = doc.getElementsByTagName("return")[0]; alert(tag) } } } 4.12、通过URLConnection调用//创建url地址 URL url = new URL("http://192.168.1.104:8080/hello"); //打开连接 URLConnection conn = url.openConnection(); //转换成HttpURL HttpURLConnection httpConn = (HttpURLConnection) conn; //打开输入输出的开关 httpConn.setDoInput(true); httpConn.setDoOutput(true); //设置请求方式 httpConn.setRequestMethod("POST"); //设置请求的头信息 httpConn.setRequestProperty("Content-type","text/xml;charset=UTF-8"); //拼接请求消息 String data = "<soapenv:Envelope xmlns:soapenv=" + ""http://schemas.xmlsoap.org/soap/envelope/" " + "xmlns:q0="http://server.rl.com/" " + "xmlns:xsd="http://www.w3.org/2001/XMLSchema" " + "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">" +"<soapenv:Body>" +"<q0:sayHello>" +"<arg0>renliang</arg0> " +"</q0:sayHello>" +"</soapenv:Body>" +"</soapenv:Envelope>"; //获得输出流 OutputStream out = httpConn.getOutputStream(); //发送数据 out.write(data.getBytes()); //判断请求成功 if(httpConn.getResponseCode() == 200){ //获得输入流 InputStream in = httpConn.getInputStream(); //使用输入流的缓冲区 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuffer sb = new StringBuffer(); String line = null; //读取输入流 while((line = reader.readLine()) != null){ sb.append(line); } //创建sax的读取器 SAXReader saxReader = new SAXReader(); //创建文档对象 Document doc = saxReader.read(new StringReader(sb.toString())); //获得请求响应return元素 List<Element> eles = doc.selectNodes("//return"); for(Element ele : eles){ System.out.println(ele.getText()); } } 4.13、使用jquery调用cxf$(function(){ $("#mybutton").click(function(){ var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://server.web.cxf.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +'<soapenv:Body>' +'<q0:sayHello>' +' <arg0>sss</arg0>' +' </q0:sayHello>' +'</soapenv:Body>' +'</soapenv:Envelope>'; $.ajax({ url:'http://localhost:8080/cxf-web-server/services/hello',type:'post',dataType:'xml',contentType:'text/xml;charset=UTF-8',data:data,success:function(responseText){ alert($(responseText).find('return').text()); },error:function(){ alert("error"); } }) }) }) 5、wsdl文档元素名称修改自动生成的文档的名字有时不规范,可以手动进行修改。 @WebResult(name=”sirHello”)修改返回值的元素的父标签名字 6、CXF使用详解说到webservice那么cxf是不得不说的一个东西 1、什么是cxf可以理解为使用webservice的一种框架,用了cxf,可以让发布和调用更加简单并且功能丰富 2、cxf目录详解(了解)Apache CXF = Celtix + Xfire bin(目录) docs(目录) etc(目录) lib(目录) 以下的 jar 包是所有 CXF 项目所必需的: 对于 Java2WSDL 和 WSDL2Java,除了必需的之外,还需要再增加如下 jar 包: 为了支持 JAX-WS ,除了必需的之外,还需要再增加如下 jar 包: 为了支持 XML 配置,除了必需的之外,还需要再增加如下 jar 包:aopalliance.jar 为了独立的 HTTP 服务支持,除了必需的之外,还需要再增加如下 jar 包:geronimo-servlet.jar 为了支持 Aegis ,除了必需的之外,还需要再增加如下 jar 包: 为了支持 WS-Security ,除了必需的之外,还需要再增加如下 jar 包:bcprov-jdk14.jar 为了支持 HTTP Binding ,除了必需的之外,还需要再增加如下 jar 包:jra.jar licenses(目录) modules(目录) samples(目录) 使用的方法。可以通过 samples 目录和它各个子目录下的 README.txt 的文件来详细了解示例的编译与运行的步骤。 3、使用cxf发布webservice1、把cxf目录下lib下面的包全部加入到项目中2、编写代码1、创建接口@WebService @BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) public interface SayHelloInteface { public String sayhellow(String name); } 2、创建实现类@WebService public class SayHellowIntefaceImpl implements SayHelloInteface { @Override public String sayhellow(String name) { return name+"hello world"; } } 3、使用cxf类发布public static void main(String[] args) { //运行 JaxWsServerFactoryBean jwsf=new JaxWsServerFactoryBean(); //CXF拦截器 jwsf.getInInterceptors().add(new LoggingInInterceptor()); jwsf.getOutInterceptors().add(new LoggingOutInterceptor()); jwsf.setAddress("http://127.0.0.1:8080/sayHello"); jwsf.setServiceClass(SayHelloInteface.class); jwsf.setServiceBean(new SayHellowIntefaceImpl()); jwsf.create(); } 4、使用cxf的wsdl2java命令生成客户端代码wsdl2java –d . http://127.0.0.1:6666/helloworld?wsdl 5、调用调用方式不变 SayHelloIntefaceService ss = new SayHelloIntefaceService(); SayHelloInteface shf=ss.getSayHelloIntefacePort(); String str=shf.sayhellow("lisi"); System.out.println(str); 6、在web项目中发布webservice
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |