首页技术文章正文

+webService的一些理解【黑马java培训】

更新时间:2019年07月26日 11时12分44秒 来源:黑马程序员论坛



Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。
Web Service技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。
Web Service的三要素:SOAP、WSDL、UDDI,soap用来描述传递信息的格式, WSDL 用来描述如何访问具体的接口,uddi用来管理,分发,查询Web Service。
优点
采用XML,支持跨平台远程调用;基于http的soap协议,可以跨越防火墙;支持面向对象开发;有利于软件和数据重用,实现松耦合。

缺点
由于soap是基于xml传输,本身使用xml传输会传输一些无关内容从而影响效率,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap去完成简单的数据传输而携带的信息更多效率再受影响;
Web Service作为web跨平台访问的标准技术,很多公司都限定要求使用WebService,但如果是简单的接口可以直接使用http传输自定义数据格式,开发更快捷。
相关术语:
WSDL
Web Service描述语言WSDL(Seb Service DefinitionLanguage)就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述WebService及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
WSDL直译为Web Service定义语言;它描述了WebService服务器端与客户端交互、请求和响应数据的格式和方式。wsdl通过XML形式说明服务在什么地方、提供什么方法。

SOAP
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。
SEI
SEI(Web Service EndPoint Interface)是Web Service服务器端用来处理请求的接口。
UUDI
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标

JAX-WS
JAX-WS(Java APIfor XML Web Services)规范是一组XML WebServices的JAVA API;也即JDK内置的Web Service实现,用来开发和发布Web Service服务。

CXF
Apache的用于开发webservice服务器端和客户端的框架。
实现Web Service的框架有:Axis,Axis2,Xfire,CXF以及JAXWS-ri(JAX WebService参考实现)。


相关元素:
Wsdl文档中包含的基本元素有:
Type(消息类型):数据类型定义的容器,它使用某种类型系统(如 XSD)。
Message(消息):通信数据的抽象类型化定义,它由一个或者多个 part 组成。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。
Part:消息参数
Operation(操作):对服务所支持的操作进行抽象描述,对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。
PortType(端口类型):特定端口类型的具体协议和数据格式规范。
Binding:特定端口类型的具体协议和数据格式规范。
Port:定义为绑定和网络地址组合的单个服务端点。
Service:相关服务访问点的集合,包括其关联的接口、操作、消息等。


  
  
  
  
  
  
  
@WebService  //表示,这就是一个webservice组件,就是一个对外允许远程访问的类
  
@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
  
public class  AdminWsService {
  
      
  
    @WebResult(name="loginReturn")  //设置返回接收wsdl里字段的名称,没有太大作用
  
       public String  login(@WebParam(name="name") String  name,@WebParam(name="password") String password){
  
              System.out.println("用户名:"+name+"密码:"+password);
  
              return "登录成功"+name;
  
       }
  
      
  
       /**
  
        * 默认情况,在websercie组件里面的方法都是可以远程调用
  
        * 有么一种情况,虽然方法写在webservice组个里面,但不希望远程调用。
  
        * @param name
  
        * @param password
  
        * @return
  
        */
  
       @WebMethod(exclude=true)
  
       public String register(String  name,String password){
  
              System.out.println("用户名:"+name+"密码:"+password);
  
              return "注册成功"+name;
  
       }
  
      
  
       /**
  
        * 默认情况,远程客户端代码生成的方法与服务端是一样的。
  
        * @param name
  
        * @param password
  
        * @return
  
        */
  
       @WebMethod(operationName="todo")
  
       public String undo(String name,String  password){
  
              System.out.println("用户名:"+name+"密码:"+password);
  
              return "注册成功"+name;
  
       }
  
      
  
       public Date update(User user){
  
              System.out.println("用户名:"+user.getName()+"密码:"+user.getPassword()+"生日:"+user.getDay());
  
              return new Date();
  
       }
  
  
}
  
public class  RunServer {
  
      
  
       public static void main(String[] args)  {
  
              //创建一个服务对象
  
              AdminWsService  ass=new AdminWsService();
  
              //发布服务
  
              Endpoint.publish("http://localhost:8090/admin",  ass);
  
              System.out.println("=================发布服务成功================");
  
       }
  
  
}
  
  
public class  RunClient {
  
      
  
       public static void main(String[] args)  {
  
              //1.创建一个代理对象,默认情况下生成名字格式:服务端webservice组件的类型+Service;
  
              AdminWsServiceService ass=new  AdminWsServiceService();
  
              //2.通过代理对象获调用对象,默认情况下生成的名字与服务端webservice组件一样。
  
              AdminWsService  as=ass.getAdminWsServicePort();   //getXXXPort(); XXX是组件名
  
              //3.通过调用对象调用远程方法
  
              //String msg=as.login("张三",  "123456");
  
              //System.out.println(msg);
  
              //as.todo(arg0, arg1)
  
              
  
              User user=new User();
  
              user.setName("张三");
  
              user.setPassword("123");
  
              //Date是一个有数据结构的类型,所以每一个开发语言实现的方式都不一样的。
  
              //webservice是跨语言远程的调用技术,对于这些有数据结构的类型统一使用了一种兼容的格式。
  
              //java对这个webservice规范统一的日期类型使用了类XMLGregorianCalendar来实现
  
      
  
              user.setDay(DateUtils.datetoXMLGregorianCalendar(new  Date()));
  
              
  
              XMLGregorianCalendar  xmlGc=as.update(user);
  
              Date  d=DateUtils.xmlGregorianCalendarToDate(xmlGc);
  
              System.out.println(d);
  
       }}
  


步骤:
发布一个简单Web Service服务,并提供对外的wsdl文档的话;那么只需要执行如下几步即可。
1、编写服务器端类,并添加@WebService注解;
2、调用Endpoint.publish启动并发布服务。

调用Web Service服务
1.wsimport是JDK自带的工具,在JDK的bin文件夹中;主要功能是根据服务端生成的WSDL文件生成客户端代码。生成java客户端代码常使用的命令参数说明:
  
参数
  
说明
-p
指定客户端生成类的包路径;值如:cn.abc
-s
指定客户端执行类的源文件存放目录
-d
指定客户端执行类的class文件的存放目录
-keep
表示不覆盖已经生成的同名源代码
-b
指定jaxws/jaxb绑定文件或额外的schemas
-extension
扩展来支持SOAP1.2

2. 利用wsimport生成客户端代码:
  
wsimport -keep  -p cn.itcast.ws.client.hello http://localhost:9080/ws/hello?wsdl
  
生成代码后,在包中包含了class文件,可以自行删除。

3.调用服务
  
public static  void main(String []args){
  
HelloWebServiceService service = new  HelloWebServiceSerivce();
  
HelloWebService helloWebServicePort  = service.getHelloWebServicePort();
  
String str =  helloWebServicePort.sayHello(“Hello”);
  
System.out.println(“返回值是:”  + str);
  
  
}
  

4.总结:
1、使用wsimport根据wsdl文件生成服务端代码;
2、利用生成的服务器端代码调用服务。

关于注解的说明:
1.1. @WebService
只有添加了该注解的类,才能通过endpoint发布Web Service服务;并且该类至少包含一个实例方法。静态方法和final方法不能被发布为服务的方法。
@WebService注解有如下属性:

serviceName:对外发布的服务名,指定 Web Service 的服务名称:wsdl:service。缺省值为 Java 类的简单名称 + Service
endpointInterface:服务接口全路径, 指定做SEIService EndPoint Interface)服务端点接口。
name:此属性的值包含XML Web Service的名称。在默认情况下,该值是实现XMLWeb Service的类的名称,wsdl:portType 的名称。缺省值为 Java 类或接口的非限定名称。
portName:缺省值为 WebService.name + Port
targetNamespace:指定命名空间,默认是使用接口实现类的包名的反缀。
wsdlLocation:指定用于定义 Web Service WSDL 文档的 Web 地址。Web 地址可以是相对路径或绝对路径。
1.2. @WebMethod
使用了此注解的方法表示作为Web Service 操作的方法,应用于客户机或服务器服务端点接口(SEI)上的方法。它的属性有如下:

operationName:指定与此方法相匹配的wsdl:operation 的名称。缺省值为 Java 方法的名称。
action:定义此操作的行为。对于 SOAP 绑定,此值将确定 SOAPAction 头的值。缺省值为 Java 方法的名称。
exclude:指定是否从 Web Service 中排除某一方法。缺省值为false
1.3. @WebResult
用于定制从返回值至 WSDL 部件或 XML 元素的映射。它的属性有如下:

name:当返回值列示在 WSDL 文件中并且在连接上的消息中找到该返回值时,指定该返回值的名称。对于 RPC 绑定,这是用于表示返回值的 wsdl:part属性的名称。对于文档绑定,-name参数是用于表示返回值的 XML 元素的局部名。对于 RPC DOCUMENT/WRAPPED 绑定,缺省值为 return。对于DOCUMENT/BARE 绑定,缺省值为方法名 + Response
targetNamespace:指定返回值的 XML 名称空间。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为 BARE 时才使用此参数。
header:指定头中是否附带结果。缺省值为false
partName:指定 RPC DOCUMENT/BARE 操作的结果的部件名称。缺省值为@WebResult.name
1.4. @WebParam
用于定制从单个参数至 Web Service 消息部件和 XML 元素的映射。它的属性有如下:
partName:定义用于表示此参数的 wsdl:part属性的名称。仅当操作类型为RPC 或者操作是文档类型并且参数类型为BARE 时才使用此参数。
targetNamespace:指定参数的 XML 元素的 XML 名称空间。当属性映射至 XML 元素时,仅应用于文档绑定。缺省值为 WebService targetNamespace
mode:此值表示此方法的参数流的方向。有效值为 ININOUT OUT
header:指定参数是在消息头还是消息体中。缺省值为 false


推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!