WebService入门详解

WebService入门详解1 什么是 webservice 先来考虑一个问题 如果我们要在自己的程序里面展示天气预报 那怎么弄 正确的做法是我们发送一个请求到一个系统 他会给我们返回来天气情况 这个就是一个 webservice 天气预报系统就相当于 webservice 的服务端 我们的系统就相当于客户端 2 如何调用别人发布的 webservice

1、什么是webservice

先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于webservice的服务端,我们的系统就相当于客户端。如http://www.webxml.com.cn这个网站上面就列举了多个webservice服务站点

2、JAVA中如何调用别人发布的webservice

2.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解析

2.2、通过wsdl文档生成客户端调用代码

2.21、使用jdk自带的命令生成

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、一个关于WebService的Demo

3.1、服务端

package com.bxoon; import javax.jws.WebMethod; public interface WebServiceI { @WebMethod(exclude=true) String helloWord(String name); @WebMethod(exclude=true) String helloWord2(String name); } 
package com.bxoon; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public class HelloWebService implements WebServiceI { @Override public String helloWord(String name) { return"Hello: "+name; } @Override public String helloWord2(String name){ return"Hello: "+name; } public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:8080/helloWord",new HelloWebService()); } } 

3.2 客户端

wsimport -s . http://127.0.0.1:8080/helloWord?wsdl 
package com.bxoon; public class Client { public static void main(String[] args) { HelloWebServiceService service = new HelloWebServiceService(); HelloWebService webService = service.getHelloWebServicePort(); String result = webService.helloWord("11"); System.out.println(result); } } 

运行之后输出结果

Hello: 11 

到此,一个简单的WebService的helloword程序就完成了,下面对具体的代码进行解释。

其他注意事项:

  1. 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。不支持静态方法,final方法。
  2. 如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
  3. 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
  4. 服务类中不能没有方法
  5. @WebMethod(exclude=true)屏蔽方法

4、其他调用webservice的方式

这里只写了一种最基本的调用webService的方式,实际上调用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 = ' 
  
    ' +' 
   
     ' +' 
    
      ' +' 
     
       '+textVal+' 
     ' +' 
    ' +' 
   ' +' 
  '; 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 = " 
  
    " +" 
   
     " +" 
    
      " +" 
     
       renliang 
      " +" 
    " +" 
   " +" 
  "; //获得输出流 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 
  
    eles = doc.selectNodes("//return"); for(Element ele : eles){ System.out.println(ele.getText()); } } 
  

4.13、使用jquery调用cxf

$(function(){ $("#mybutton").click(function(){ var data = ' 
  
    ' +' 
   
     ' +' 
    
      ' +' 
     
       sss 
     ' +' 
    ' +' 
   ' +' 
  '; $.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文档元素名称修改

有时,自动生成的WSDL文档的名字可能不规范,我们是可以自定义的。在注解@webservice中可以指定一些属性来完成这个功能。

@WebService( portName="myHelloService",修改端口名字 serviceName="HelloServices",修改服务访问点集合名字 name="HelloService",修改服务类的名字 targetNamespace="hello.rl.com" 修改命名空间名字 ) 

或者使用如下方式

@WebResult(name="sirHello")修改返回值的元素的父标签名字 @WebParam(name="sir")修改传入参数的元素的父标签名字 

6、其他发布WebService的方式

其实上面说的使用jdk自带的方式发布WebService只是众多发布WebService的方式中的一种。现阶段发布方式主要有以下5种

  1. CXF(常用)
  2. Xfire(比较古老)
  3. Axis2 (常用)
  4. Axis1
  5. HttpClient
    jws的发布对java webservice框架产生了巨大的影响,经过大浪淘沙,目前java开发webservice的框架主要包括axis2和cxf。
    这篇文章介绍了发布WebService的多种方式以及实现,




下面对cxf和Axis2的使用方式做基本介绍,其他方式请自行寻找资料

6.1 CXF

6.1.1、什么是cxf

CXF全称Apache CXF,是apache基金会的一个为了简化webService开发的框架,可以让WebService的发布和调用更加简单。

Apache CXF = Celtix + Xfire

6.1.2、cxf目录详解(了解)

使用的方法。可以通过 samples 目录和它各个子目录下的 README.txt 的文件来详细了解示例的编译与运行的步骤。

6.1.3、使用cxf发布webservice

6.1.3.1、把cxf目录下lib下面的包全部加入到项目中
6.1.3.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(); } 

6.1.4、使用cxf的wsdl2java命令生成客户端代码

wsdl2java –d . http://127.0.0.1:6666/helloworld?wsdl

6.1.5、调用

调用方式不变

SayHelloIntefaceService ss = new SayHelloIntefaceService(); SayHelloInteface shf=ss.getSayHelloIntefacePort(); String str=shf.sayhellow("lisi"); System.out.println(str); 

6.2使用Axis2创建WebService服务

http://www.blogjava.net/tianchijiaozi/archive/2013/03/15/396452.html#Post

7、在web项目中发布webservice

上面是介绍了如何通过Main方法启动WebService,但在实际项目中不可能是采用main方法来启动的,那么如何在项目启动的时候启动一个WebService呢?下面介绍

  1. 创建服务接口在接口上加@webservice
  2. 创建服务接口的实现类
  3. 在web.xml中配置CXFServlet
     
         
          
          
            cxf 
           
          
            org.apache.cxf.transport.servlet.CXFServlet 
           
          
          
          
            cxf 
           
          
            /services/* 
           
          
          
          
            60 
           
          
         
  4. 配置cxf-servlet.xml
     
         
          
           
          
          
           
          
          
           
          
         
  5. 使用wsdl2java生成客户端代码
  6. 调用webservice

8.WebService的工作原理

再说WebService之前这里先说说RPC,什么是RPC呢?

RPC(Remote Procedure Call),远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。(来自百度百科) 

简单来说RPC是java中远程调用的一种技术或者约定,并不是一种具体的解决方案或者框架,而具体的框架有下面这些比较火的(排名不分先后)

  1. SpringCloud(Spring的,基于Socket的,SOA架构的分布式框架)
  2. Dubbo(x)(阿里巴巴的,基于Socket的,SOA架构的分布式框架)
  3. WebService(跨语言的,基于SOAP协议,走xml数据或json数据)
  4. Hessian(跨语言的,基于Binary-RPC协议,走二进制数据)
  5. HttpClient(通常用于RESTful风格的调用,跨语言,基于http和json)
  6. jdk原生(HttpURLConnection)

我们上面用的就是jdk原生的这种。本文也主要对这种方式的工作原理做简单解析,原理大概分为以下几个步骤

  1. Service端会在程序启动的时候扫描有标注@WebService的类,然后通过反射方法找到这个类的需要发布的方法,然后在用户访问wsdl文档的时候把这些东西组成SOAP协议内容然后返回给用户浏览器,用户就可以得到wsdl文档。同时服务端在启动的时候会启动一个socket用来等待客户端的连接。
  2. 客户端通过wsdl文档生成了代码然后在程序里面调用,实际上是通过了一个socket发送了一个请求给服务端,请求里面有指明客户端需要调用哪个类的哪个方法,以及请求参数,请求报文类似于
 
   
    
     
     
       2013-06-22T18:56:43.808+08:00 
      
     
    
   

Webservice的通讯协议是SOAP。

8.1 SOAP协议

  1. 上诉XML中描述了客户端需要调用哪个类的那个方法,服务端接收到客户端的请求之后,通过对应的信息以及参数反射调用具体的方法,最后把调用结果返回给客户端。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206429.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:43
下一篇 2026年3月19日 下午3:43


相关推荐

  • 计算几何入门

    计算几何入门计算几何

    2026年3月19日
    3
  • 简单实现微信扫码支付开发

    @文末附有开发案例代码的地址微信支付开发官方地址:https://pay.weixin.qq.com/wiki/doc/api/index.html 1. appid, 微信公众账号或开放平台APP的唯一标识 2. mch_id, 微信支付系统中的商户收款账号 3. partner, 财付通平台的商户账号 4. partnerkey, 财…

    2021年11月30日
    41
  • 完全卸载mysql(亲测有效!!!)「建议收藏」

    完全卸载mysql(亲测有效!!!)「建议收藏」1.停止mysql服务。  “运行”——>“cmd”——>输入“netstopmysql;”    看链接:  https://blog.csdn.net/Ludwig_/article/details/526345872.将控制面板中的mysql正常卸载  控制面板——》“程序”,找到并卸载!3.找到安装路径,将所有关于mysql的文…

    2026年4月19日
    4
  • カード名義_acwing题库

    カード名義_acwing题库原题链接给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。输入格式输入第一行包括一个整数 表示节点个数;接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;第 n+2 行是一个整数 m 表示询问个数;接下来 m 行,每行两个不同的正整数 x 和 y,表示一个询问。输出格式对于每一个询问,若 x 是 y 的祖先则输

    2022年8月8日
    3
  • MYSQL 修改密码的几种方式「建议收藏」

    MYSQL 修改密码的几种方式「建议收藏」MYSQL修改密码的几种方式1、最简单的方法就是借助第三方工具NavicatforMySQL来修改2、用SETPASSWORD命令先登录MySQL输入命令mysql-uroot-

    2022年6月30日
    21
  • armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别

    armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别ARM 处理器指令集一 苹果模拟器指令集 指令集 分析 i386 针对 intel 通用微处理器 32 架构的 x86 64 针对 x86 架构的 64 位处理器 i386 x86 64 是 Mac 处理器的指令集 i386 是针对 intel 通用微处理器 32 架构的 x86 64 是针对 x86 架构的 64 位处理器 模拟器并不运行 arm 代码 软件会被编译成 x86 可以运行

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号