加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService学习笔记(一)基础入门

发布时间:2020-12-16 22:27:36 所属栏目:安全 来源:网络整理
导读:鲁春利的工作笔记 ,谁说程序员不能有文艺范? 基本概念参阅:http://www.w3school.com.cn/ws.asp Web Service可以认为是一种标准,定义了操作的规范,任何语言都可以发布自己的服务或者实现自己的client来使用其他厂商提供的服务,数据交换的过程则是透明的

鲁春利的工作笔记,谁说程序员不能有文艺范?



基本概念参阅:http://www.w3school.com.cn/ws.asp


Web Service可以认为是一种标准,定义了操作的规范,任何语言都可以发布自己的服务或者实现自己的client来使用其他厂商提供的服务,数据交换的过程则是透明的。


不同的平台,不同的语言大都提供Web Service的开发实现,在JAVA领域,Web Service的框架很多,例如:Axis1&2,Xfire,CXF,Java自带的JAX-WS。


1、JAX-WS
????JAX-WS(Java API For XML-WebService),JDK1.6 自带的版本为JAX-WS2.1,其底层支持为JAXB(Java Architecture for XML Binding)。

??? JAX-WS(JSR 224)规范的API 位于javax.xml.ws.*包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。

wKioL1Zv2G2hPQziAAOoPIuN1n4354.jpg


wKiom1Zv2RWwu4fdAAEiIhuvhKY500.jpg

wKioL1Zv2UKhpafMAAQ1jwFZy9w739.jpg

????WS-MetaData(JSR 181)是JAX-WS 的依赖规范,其API 位于javax.jws.*包,使用注解配置公开的Web 服务的相关信息和配置 SOAP 消息的相关信息。

wKiom1Zv2cOQVZdFAALq-2cLNSU538.jpg


2、Axis2
????(Apache eXtensibleInteraction System)是Apache下的一个重量级WebService框架,提供了多语言支持。

????下载地址:http://axis.apache.org/

wKioL1ZvzQ7hTmRKAAJaDkSuQH4553.jpg


3、XFire

????XFire在2007年后已停止更新,最后的一个版本是1.2.6,在2007年5月3日发布。正式更名为Apache CXF,亦可以说是XFire2.0。


4、Apache CXF

????下载地址:http://cxf.apache.org/

????Apache CXF是开源的,是Celtix和XFire合并发展而来,CXF的名字来源于"Celtix"和"XFire"的首字母。

????CXF不仅提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,以及可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。

????另外,CXF可以天然的和Spring进行无缝集成。

wKiom1ZvzXGx4eFgAAMcymDM7Uc813.jpg



Web Service接口

package?com.lucl.apps.web.webservice.cxf.server;

import?javax.jws.WebService;

//?不指定名称的时候默认是实现类+分类(如Service、Port、PortType)
@WebService(name="HelloWorldPortType")
public?interface?HelloWorld?{
????String?sayHi(String?text);
}

??? 接口声明后使用类级别注解@WebService就标注了这个接口的方式将公开为Web服务,如果希望屏蔽掉某个方法,可以使用方法注解@Method的exclude=true。通常把公开为Web服务的接口叫做SEI(Service EndPoint Interface)服务端点接口。


实现类HelloWorldImpl

package?com.lucl.apps.web.webservice.cxf.server;

/**
?*?@author?lucl
?*?@description?将serviceNmae标注到HelloWorld接口查看wsdl文件时service仍然为实现类+Service
?*/
@WebService(serviceName="HelloWorld",?portName="HelloWorldPort")
public?class?HelloWorldImpl?implements?HelloWorld?{
????@Override
????public?String?sayHi(String?text)?{
????????System.out.println("sayHi?called");
????????return?"Hello?"?+?text;
????}
}

????这个实现类没有任何特殊之处,但是如果你的实现类还实现了其他的接口,那么你需要在实
现类上使用@WebService 注解的endpointInterface 属性指定那个接口是SEI(全类名)。Web服务的实现类通常称为SIB (Service Implementation Bean)。

????注意:JDK API说明在接口上不能指定endpointInterface属性,测试发现client调用访问时会出错。

wKiom1Zv48HjP5LtAAHlM9Ipt9A893.jpg

发布服务

package?com.lucl.apps.web.webservice.cxf.server;

import?javax.xml.ws.Endpoint;

import?org.apache.cxf.endpoint.Server;
import?org.apache.cxf.jaxws.JaxWsServerFactoryBean;

/**
?*?
?*?@author?luchunli
?*?@description?自定义Web?Service的Server
?*
?*/
public?class?WebServiceServer?{
????public?static?void?main(String?args[])?{
//??CXF实现方式
//????????{
//????????????JaxWsServerFactoryBean?factory?=?new?JaxWsServerFactoryBean();
//????????????factory.setServiceClass(HelloWorldImpl.class);
//????????????factory.setAddress("http://localhost:9000/helloWorld");
//????????????Server?server?=?factory.create();
//????????????server.start();
//????
//????????????System.out.println("Server?ready...");
//????
//????????????try?{
//????????????????Thread.sleep(5?*?60?*?1000);
//????????????}?catch?(InterruptedException?e)?{
//????????????????e.printStackTrace();
//????????????}
//????????????System.out.println("Server?exiting");
//????????????System.exit(0);
//????????}
//?JAX-WS实现方式????
????????HelloWorldImpl?implementor?=?new?HelloWorldImpl();
????????String?address?=?"http://localhost:9000/helloWorld";
????????Endpoint.publish(address,?implementor);
????????System.out.println("Server?ready...");
????}
}

使用javax.xml.ws包中的EndPoint类的静态方法publish来发布服务。

public?abstract?class?Endpoint?extends?Object

JDK API 1.6中对javax.xml.ws.Endpoint说明如下:

JAX-WS?2.0引入的类,称为Web?服务端点。?
????使用在此类中定义的静态方法创建端点。一个端点总是绑定到一个?Binding?和一个实现者,
这两项都是在创建端点时设置的。?
????端点要么处于已发布状态,要么处于未发布状态。可以使用?publish?方法开始发布端点,此时端
点开始接受传入请求。相反,可以使用?stop?方法停止接受传入请求并取消端点。一旦停止,就不能再
次发布该端点。?
????可以在端点上设置?Executor?以便更好地控制用来指派传入请求的线程。例如,通过创建?
ThreadPoolExecutor?并向端点注册可以启用带有特定参数的线程池。?
处理程序链可以使用所含的?Binding?来设置,Binding?接口是?JAX-WS?协议绑定的基本接口。
????端点可以使一个元数据文档(如?WSDL?和?XMLSchema?文档)列表与之绑定。发布时,JAX-WS?实现
将根据实现者上存在的注释,尽可能多地重用这些元数据,而不是生成新的元数据。


运行WebServiceServer类

wKiom1Zw3G7ySrUfAAMfM35CtLE321.jpg


查看WSDL

wKiom1ZxMqmB59qlAAKgcOMuKuk517.jpg



实现客户端

package?com.lucl.apps.web.webservice.cxf.client;


import?java.net.URL;

import?javax.xml.namespace.QName;
import?javax.xml.ws.Service;

import?com.lucl.apps.web.webservice.cxf.server.HelloWorld;
import?org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
?*?
?*?@author?luchunli
?*?@description?自定义Web?Service的Client
?*
?*/
public?final?class?WebServiceClient?{
????private?WebServiceClient()?{
????????//?......
????}?

????public?static?void?main(String?args[])?throws?Exception?{
????//?cxf实现
//????????{
//????????????JaxWsProxyFactoryBean?factory?=?new?JaxWsProxyFactoryBean();??
//????????????factory.setServiceClass(HelloWorld.class);??
//????????????factory.setAddress("http://localhost:9000/helloWorld");??
//????????????HelloWorld?helloworld?=?(HelloWorld)?factory.create();??
//????????????System.out.println(helloworld.sayHi("luchunli"));??
//????????????System.exit(0);??
//????????}
????????//?wsdl文档路径
????????URL?wsdlDocument?=?new?URL("http://localhost:9000/helloWorld?wsdl");
????????//?QName参数为指定名称空间?URI?和本地部分的?QName?构造方法。
????????//?????URI实际就是把包名给倒过来了
????????//?????而nativeQName默认为实现类+Service,通过serviceName指定名称。
????????String?namespaceURI?=?"http://server.cxf.webservice.web.apps.lucl.com/";
????????String?nativeQName?=?"HelloWorld";????//?对应wsdl:service
????????QName?qname?=?new?QName(namespaceURI,?nativeQName);
????????//?Service?对象提供?Web?服务的客户端视图。
????????Service?service?=?Service.create(wsdlDocument,?qname);
????????//?
????????Class<HelloWorld>?serviceEndpointInterface?=?HelloWorld.class;?
????????HelloWorld?helloWorld?=?service.getPort(serviceEndpointInterface);
????????System.out.println(helloWorld.sayHi("luchunli"));
????}
}

wKioL1Zw3W3gZlRNAAGk6GK2kS4020.jpg

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读