WebService服务端、客户端编码,以及发布、访问

1、WebService的概念,解决上面问题?

WebService就是一个应用程序,它提供一种通过web方式访问的api。

解决两个系统或者(应用程序)之间的远程调用......

调用时跨语言,跨平台......

WebService最基本的组成部分就是客户端,服务端........


2、WebService的列子的应用

服务端:

(作为服务端,怎么将自己的应用程序发布成一个webservice,让别人调用)

xml(WebService的客户端与服务端进行交互的时候传递的数据格式)

wsdl: WebService description language(web服务描述语言...  相当于api)xml格式

发布服务:

新建一个Java工程,创建以下两个类:

HelloServer.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.webserver;  
  2.   
  3. public class HelloServer {  
  4.   
  5. }  

PublishServer.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.webserver;  
  2.   
  3. import javax.xml.ws.Endpoint;  
  4.   
  5. public class PublishServer {  
  6.     public static void main(String[] args) {  
  7.         //java jdk提供一个自带的类可以将java应用程序发布成webservice  
  8.         /** 
  9.          * Endpoint.publish(String address, Object implementor): 
  10.          * 参数1:提供服务对外的访问地址 
  11.          * 参数2:提供服务的类的对象 
  12.          */  
  13.         Endpoint.publish("http://127.0.0.1:9999/hello"new HelloServer());  
  14.     }  
  15. }  

运行主方法:

Exception in thread "main" java.lang.IllegalArgumentException: class com.cn.csii.webserver.HelloServer has neither @WebService nor @WebServiceProvider annotation
at com.sun.xml.internal.ws.server.EndpointFactory.verifyImplementorClass(EndpointFactory.java:292)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.getPrimaryWsdl(EndpointImpl.java:305)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:246)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:170)
at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:113)
at javax.xml.ws.Endpoint.publish(Endpoint.java:240)
at com.cn.csii.webserver.PublishServer.main(PublishServer.java:7)

报错的大概意思就是:HelloServer类即没有@WebService注解也没有@WebServiceProvider注解。

解决之道:

HelloServer.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.webserver;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. @WebService  
  6. public class HelloServer {  
  7.   
  8. }  
运行主方法,依然报错:

Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException: The web service defined by the class com.cn.csii.webserver.HelloServer does not contain any valid WebMethods.
at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:233)
at com.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:328)
at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:190)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:498)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:246)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:170)
at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:113)
at javax.xml.ws.Endpoint.publish(Endpoint.java:240)
at com.cn.csii.webserver.PublishServer.main(PublishServer.java:7)

报错的大概意思就是:通过HelloServer这个类定义的webservice应用没有包含有效的应用方法。

继续修改:

HelloServer.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.webserver;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.jws.WebService;  
  6.   
  7. @WebService  
  8. public class HelloServer {  
  9.     public void sayHello(){  
  10.         System.out.println("你好,北京时间:"+new Date());  
  11.     }  
  12. }  

运行主方法,没有报错,成功发布了服务。

通过http://127.0.0.1:9999/hello?wsdl地址在浏览器的地址栏上请求,可以得到wsdl文件


注意:1、Endpoint是java jdk提供的类,用来发布webservice,所以你的jdk版本必须在1.6.0_21之上....

2、被发布的类当中必须包含一个有效(方法必须为public的非静态,非final的方法)的方法

3、被发布的类上面必须有注解...

客户端

(作为客户端,怎么调用别人发布的webservice)

调用服务:我们可以通过java jdk自带的一个命令 wsimport 根据服务端说明书(wsdl)生产本地的java代码。我们直接操作这些java代码,就可以调用webservice。

wsimport -d . +服务说明书(wsdl)的地址,生成本地的class文件

wsimport -s . +服务说明书(wsdl)的地址,生成本地的class文件与java文件

wsimport -s . -p(包名) +服务说明书(wsdl)的地址,生成本地的class文件与java文件

这是java jdk自带的wsimport命令


配置好jdk的环境变量,检查wsimport命令是否可用。


使用wsimport命令将wsdl文件生成java代码:

这个命令只能生成class文件



但是,使用另外一个命令既可以生成class文件,也可以生产java源文件



第一种方式:通过wsimport(从客户端调用服务端)

例子1:

新建java工程(MyClient),将通过wsdl说明书生成的java源文件拷贝到MyClient项目中,并调用服务端代码:


例子2:调用自定义类型的服务

操作MyServer服务端java工程

User.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.bean;  
  2.   
  3. public class User {  
  4.     private int id;  
  5.     private String weixin;  
  6.     private String momo;  
  7.     private String weibo;  
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.     public void setId(int id) {  
  12.         this.id = id;  
  13.     }  
  14.     public String getWeixin() {  
  15.         return weixin;  
  16.     }  
  17.     public void setWeixin(String weixin) {  
  18.         this.weixin = weixin;  
  19.     }  
  20.     public String getMomo() {  
  21.         return momo;  
  22.     }  
  23.     public void setMomo(String momo) {  
  24.         this.momo = momo;  
  25.     }  
  26.     public String getWeibo() {  
  27.         return weibo;  
  28.     }  
  29.     public void setWeibo(String weibo) {  
  30.         this.weibo = weibo;  
  31.     }  
  32.       
  33. }  
HelloServer.java
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.webserver;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.jws.WebService;  
  6.   
  7. import com.cn.csii.bean.User;  
  8.   
  9. @WebService  
  10. public class HelloServer {  
  11.     public void sayHello(){  
  12.         System.out.println("你好,北京时间:"+new Date());  
  13.     }  
  14.     public User getUserByID(int id){  
  15.         User user = new User();  
  16.         user.setId(id);  
  17.         user.setWeixin("bitaotao-211");  
  18.         user.setWeibo("bitaotao@163.com");  
  19.         user.setMomo("btt@139.com");  
  20.         return user;  
  21.     }  
  22. }  
切换到PublishServer.java中将其发布到服务器上,运行主方法,然后在浏览器地址栏上操作地址:http://127.0.0.1:9999/hello?wsdl 生成wsdl文件


通过wsimport命令生成java代码:

wsimport -s . -p(包名) +服务说明书(wsdl)的地址,生成本地的class文件与java文件


将生成的java源代码拷贝到MyClient客户端工程中,并调用服务端代码:


通过工具调用webservice:

以下这两个工具已经在myeclipse中整合好了。

工具1:webservice explorer(通过图形化界面的方式调用webservice)


简单的使用方法:

点击webservice explorer按钮:


点击WSDL Page按钮:

然后点击WSDL Main,会出现在服务端写的方法。


点击getUserByID方法,输入id(这里先输入2),点击Go按钮


工具2:tcp/ip  Monitor可以拦截webservice客户端与webservice服务端进行交互的整个过程以及数据传输的格式...


Monitor:监控,监听。


简单使用:

点击TCP/IP Monitor进入操作界面,在上面的空白处,右击出现properties按钮,建立属性,点击右侧Add按钮,添加监听


填入值:


点击ok,并选中新建的监听,启动监听


在浏览器中也可以通过代理端口生成wsdl文件


第二种调用方式:通过java jdk自带的一个类URLConnect(可以发送一个http请求)

原理:我们可以通过URLConnect这个对象,发送一个http请求,往webservice服务端传送xml格式的数据,
模拟soap协议,因为SOAP协议就是在HTTP的基础上传送xml格式的数据...
暂时性修改一下端口号:

在WsimportInvoke.java类中运行主方法,切换到TCP/IP Monitor


在MyClient工程下:

UrlConnectionInvoke.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.webserver.invoke;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.OutputStream;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.URL;  
  8. /** 
  9.  * 原理:我们可以通过URLConnect这个对象,发送一个http请求,往webservice服务端传送xml格式的数据, 
  10.  * 模拟soap协议,因为SOAP协议就是在HTTP的基础上传送xml格式的数据... 
  11.  */  
  12. public class UrlConnectionInvoke {  
  13.     public static void main(String[] args) throws IOException {  
  14.         URL url = new URL("http://127.0.0.1:7418/hello");  
  15.         HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
  16.         connection.setDoInput(true);// 如果要接收服务器传送数据,必须设置为true  
  17.         connection.setDoOutput(true);// 如果要往服务器传送数据,必须设置为true  
  18.         // Content-Type: text/xml; charset=utf-8  
  19.         connection.setRequestProperty("Content-Type""text/xml;charset=utf-8");//设置内容类型  
  20.         connection.setRequestMethod("POST");// webservice 接收客户端的请求方式是post  
  21.         OutputStream outputStream = connection.getOutputStream();// 通过流往服务器发送数据  
  22.         /* 
  23.          * <?xml version="1.0" ?> <S:Envelope 
  24.          * xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> 
  25.          * <ns2:getUserByID xmlns:ns2="http://webserver.csii.cn.com/"> 
  26.          * <arg0>1</arg0> </ns2:getUserByID> </S:Body> </S:Envelope> 
  27.          */  
  28.         //将通过post请求的数据先封装到StringBuffer对象中  
  29.         StringBuffer buffer = new StringBuffer(5000);  
  30.         buffer.append("<?xml version=\"1.0\" ?>")  
  31.                 .append("<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">")  
  32.                 .append("<S:Body><ns2:getUserByID xmlns:ns2=\"http://webserver.csii.cn.com/\">")  
  33.                 .append("<arg0>1</arg0></ns2:getUserByID></S:Body></S:Envelope>");  
  34.         //将数据写入流中  
  35.         outputStream.write(buffer.toString().getBytes());  
  36.           
  37.         InputStream inputStream = connection.getInputStream();  
  38.         int len = 0;  
  39.         byte[] b = new byte[1024];  
  40.         StringBuilder builder = new StringBuilder();  
  41.         //边读边写  
  42.         while ((len=inputStream.read(b))!=-1) {  
  43.             String s = new String(b, 0, len,"utf-8");  
  44.             builder.append(s);  
  45.         }  
  46.         System.out.println(builder.toString());  
  47.     }  
  48.   
  49. }  
运行该类的主方法


第三种方式调用:通过客户端编程的方式调用

通过客户端编程的方式调用 webservice 我们需要通过java jdk 自带的类 Service ,
同时,我们需要依赖一个接口,这个接口我们可以通过wsimport 生成的本地代码当中获取...

在客户端MyClient工程中:

ServiceInvoke.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.cn.csii.webserver.invoke;  
  2.   
  3. import java.net.MalformedURLException;  
  4. import java.net.URL;  
  5. import javax.xml.namespace.QName;  
  6. import javax.xml.ws.Service;  
  7. import com.cn.csii.webserver.HelloServer;  
  8.   
  9. /** 
  10.  * 通过客户端编程的方式调用... 
  11.  * 需要依赖一个接口... wsimport生成... 
  12.  * @author Administrator 
  13.  * 
  14.  */  
  15. public class ServiceInvoke {  
  16.     public static void main(String[] args) throws MalformedURLException {  
  17.         //文档地址  
  18.         URL url = new URL("http://127.0.0.1:7418/hello?wsdl");  
  19.         /** 
  20.          * QName(String namespaceURI, String localPart) 
  21.          * 参数1:命名空间 
  22.          * 参数2:服务名称 
  23.          */  
  24.         QName qName = new QName("http://webserver.csii.cn.com/""HelloServerService");  
  25.         Service service = Service.create(url, qName);  
  26.           
  27.         //获取接口类型  
  28.         HelloServer helloServer = service.getPort(new QName("http://webserver.csii.cn.com/","HelloServerPort"), HelloServer.class);  
  29.         //直接调用  
  30.         helloServer.sayHello();  
  31.           
  32.     }  
  33. }  


webservice
第一天:webservice 简单的应用,原理的介绍
1、webservice 的概念,解决什么问题?
webservice 就是一个应用程序,它提供一种通过web 方式访问的api.
解决两个系统或者(应用程序)之间的远程调用.....
调用是跨语言,跨平台...
webservice 最基本的组成部分就是客户端,服务端...
2,webservice 的例子的应用。
服务端:(作为服务端,怎么将自己的应用程序发布成一个webservice,让别人调用)
xml (webservice的客户端与服务端进行交互的时候传递的数据格式)
webservice description language(web 服务描述语言.. api)xml,简称wsdl
soap(简单对象访问协议) webservice 的客户端与服务端进行交互的时候走的协议
(soap 分两个版本(soap 1.1 与soap1.2)),现在的本是soap1.1,因为java jdk 只支持soap1.1版本的协议发布..
***** soap 协议=在http 的基础之上传送xml 格式的数据..


发布服务:
//java jdk 提供一个自带的类可以将java 应用程序发布成webservice 
/**
* 1,提供服务对外的访问地址
* 2,提供服务的类的对象...
*/
Endpoint.publish("http://192.168.9.100:9999/helloService", new HelloService());


注意:1,endpoint是java jdk 提供的类,用来发布webservice,所以你的jdk 版本必须在1.6.0_21之上..
      2,被发布的类当中必须包含一个有效(方法必须为publish的非静态的,非final的方法)的方法
      3,被发布的类上面必须有注解...

客户端:
(作为客户端,怎么调用别人发布的webservice)
调用服务:我们可以通过java jdk 自带的一个命令 wsimport 根据服务端说明书(wsdl)生成本地的java 代码
我们直接操作这些java 代码,就可以调用webservice 
wsimport -d . +服务说明书(wsdl)的地址 生成本地的class 文件
wsimport -s . +服务说明书(wsdl)的地址 生成本地的class 文件与java文件
wsimport -s . -p(包名)+服务说明书(wsdl)的地址 生成本地的class 文件与java文件


第一种方式调用:通过wsimport
工具1:webservice explorer (通过图形化界面的方式调用webservice)


工具2:tcp/ip Monitor  可以拦截webservice客户端与webservice 服务端进行交互的整个过程以及数据传输的格式..


第二种方式调用:通过java jdk 自带的一个类URLConnect(可以发送一个http 请求)
原理:我们可以通过URLConnect 这个对象,发送一个http 请求,往webservice 服务端 传送xml 格式的数据,
模拟soap 协议 ,因为soap协议就是在http 的基础上传送xml格式的数据..


第三种方式调用:通过客户端编程的方式调用 webservice 我们需要通过java jdk 自带的类 Service ,
同时,我们需要依赖一个接口,这个接口我们可以通过wsimport 生成的本地代码当中获取...


/**
  互联网上有很多免费的服务,http://www.webxml.com.cn 可以在这个网站上面找到。
**/
1,调用互联网上手机号码归属地查询的服务
使用第一种:wsimport 生成本地代码调用
使用第二种:使用urlConnect 调用天气预报..


第四种调用方式:通过ajax 去调用webservice 
xmlhttpRequest 对象时浏览器自带的一个对象,可以通过此对象发送一个http 请求,传送xml 格式的数据到服务端
(模拟soap 协议...)
不能访问:跨域(a 站点的js 访问b 站点的请求...)


webservice 加深:
通过webservice 的客户端与服务端的几种调用方式,通过tcp ip/monitor 监控webservice 请求的过程
拦截请求的数据,对数据进行分析...
webservice 的客户端与服务端进行交互的时候,
第一次通过get 请求 wsdl 的服务说明书
第二次通过post 的方式 请求 webservice 服务...

理解wsdl 服务的说明书:


我们可以通过修改注解来修改wsdl 服务说明书的描述。
如果修改了说明书,则会影响wsimport 生成的本地代码....


扩展:怎么做一个网页的播放器
三种方式:
第一种方式:通过js 把 window media player 调出来
第二种方式:adobefalsh 里面有一种语言actionscript 可以操作硬件:摄像头,麦克风,扬声器。。。
各大浏览器对adobefalsh 提供支持,adobeflash 里面的actionscript 对js 提供了接口,js 就可以actionscript
完成播放的一些功能...
第三种方式:通过html5 来完成播放器的制作。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值