WebService总结

article/2025/10/6 3:39:39

目录

WebService简介

WebService架构图

理解:

WebService的开发规范

SOAP协议

soap的组成

WSDL 

UDDI

WebService的优缺点

WebService优点

WebService缺点

SOA

ApacheCXF框架

CXF分为JAX-WS和JAX-RS两种开发方式

ApacheCXF实现WebService(JAX-WS)

服务端发布服务

客户端访问服务

ApacheCXF实现WebService(JAX-RS)

服务端发布服务

客户端访问服务

WebService简介

含义:webService即web服务,他是一种跨编程语言和跨操作系统平台的远程调用技术。

WebService架构图

理解:

  • 跨语言:右侧为服务端,左侧为客户端;若右边的服务使用PHP语言实现的,那么调用右边服务端的客户端不管是用什么语言实现的,都可以去远程访问右边的客户端的接口。
  • 跨平台:无论右边的服务端部署在那个系统平台,只要其提供了一个接口给外界去调用,那么左边的客户端部署在哪里,使用什么语言,一样可以远程调用服务端。
  • WebService主要适用于多个系统之间的交互以及数据传递

注意:客户端与服务端可能使用不同语言开发的,但是通过webservice提供的服务接口,客户端与服务端之间可以传递对象。

WebService的开发规范

JAX-WS:java API for XML-WebService,jdk1.6版本自带JAX-WS2.1,其底层支持JAXB;JAX-WX规范的API位于javax.xml.ws.*包内,其中大部分都是注解,提供API操作web服务

JAXM&SAAJ:

  • JAXM:java API for XML Message,其主要定义了包含发送和接收消息的API,相当于Web服务的服务器端,其API位于javax.messaging.*包,他是javaEE的可选包,因此需要单独下载
  • SAAJ:soap with Attachment API for java,其为与JAXM搭配使用的API,为构建soap包和解析soap包提供了重要的支持;其支持附件传输,他在客户端和服务端都需要使用,其API位于javax.xml.soap.*包

JAX-RS:java API for RESTful Web Services,其是java针对REST风格定制的一套web服务规范,该API位于javax.ws.rs.*包内。

注意:

  • JAX-WS和JAXM&SAAJ是基于soap协议,而JAX-RS基于http协议。
  • 三者规范中,只有jax-rs规范支持传递json数据,其他的规范都仅支持传递xml数据

SOAP协议

含义:simple object access protocol——简单对象访问协议,它是用于交换XML编码信息的轻量级协议。

soap的组成

  • Envelope:其为必须的部分,以XML的根元素出现
  • Headers:可选的
  • Body:必须的,在body部分包含了要执行的服务器的方法和发送给服务器的数据

理解:

  • soap作为一个基于XML语言的协议用于网上传输数据
  • soap是基于http的,他相当于在http的基础上+xml数据格式
  • soap可以运行在任何其他传输协议上
  • XML-envelope为描述信息内容和如何处理内容定义了框架,将程序编码成了XML对象的规则,执行远程调用(RPC)的约定 

WSDL 

含义:WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。

理解:

  • 通过wsdl说明书,就可以描述webservice服务端对外发布的服务
  • wsdl说明书基于XML文件,其可以通过XML语言来描述整个服务
  • 在wsdl中描述了:对外发布的服务名称(类)、接口的方法名称(方法)、接口参数(方法参数)、服务返回的数据类型(方法返回值)
  • 一般在webservice的url后面跟上?wsdl来获取WSDL信息

UDDI

含义:UDDI是一个跨产业、跨平台的开放性架构,其可帮助web服务提供商在互联网上发布web服务的信息

理解:

  • UDDI就是一种目录服务,企业可以通过UDDI来注册和搜索web服务
  • UDDI通过soap进行通讯,其构建于.NET之上

WebService的优缺点

WebService优点

  • 异构平台的互通性(跨平台)
  • 更广泛的软件复用(远程调用实现复用)
  • 成本低,可读性强,应用范围广(基于soap协议)
  • 更迅捷的软件发行方式

WebService缺点

由于soap是基于xml传输的,本身使用xml传输会传输一些无关的内容进而影响效率,随着soap的完善,soap协议增加了许多内容,这样就导致了使用soap去完成简单的数据传输而携带的信息变得更多进而影响效率

注意:基于JAX-RS规范下的webservice也可以传输json格式数据,这在一定程度上弥补了传输效率问题

SOA

含义:面向服务架构,其是一种思想,它将应用程序的不通功能单元通过中立的契约联系起来,使得各种形式的功能单元相互集成,目前来说webservice是soa的一种较好的实现方式。

ApacheCXF框架

含义:其是Apache开源基金组织提供的优秀的webservice实现框架

CXF分为JAX-WS和JAX-RS两种开发方式

  • JAX-WS:基于xml协议的WebService技术
  • JAX-RS:基于restful风格的开发方式

ApacheCXF实现WebService(JAX-WS)

服务端发布服务

导入依赖

       <!--进行jaxws开发的核心包--><dependencies><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.0.1</version></dependency><!--内置jetty web服务器--><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http-jetty</artifactId><version>3.0.1</version></dependency><!--日志的实现--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version></dependency><!--junit测试类--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies>

在resources文件内添加日志(log4j.properties) 

#info等级的日志输出到CONSOLE和LOGFILE这两个目的地(LOGFILE表示将日志写到文件中,CONSOLE则将日志写到控制台)
log4j.rootCategory=info,CONSOLE,LOGFILE
#设置日志优先控制台输出
log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE
#定义控制台日志输出器
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
#控制台日志布局
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#控制台日志布局的设置
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p %30.30c %x-%m\n
#定义文件日志输出器
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#日志的存放位置
log4j.appender.LOGFILE.File=C:\\All\\jax.log
#启用文件日志追加模式
log4j.appender.LOGFILE.Append=true
#文件日志布局
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout

创建服务接口

@WebService
public interface HelloWorld {//对外发布服务的接口的方法public String sayHello(String name);
}

注意:对外发布服务的接口,需要用@webservice注解来标识这是一个webservice接口

创建接口实现类

public class HelloWorldImpl implements HelloWorld {public String sayHello(String name) {return name+"hello webservice!";}
}

测试类内发布服务

public class WsTest {public static void main(String[] args) {//创建发布服务的工厂JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();//设置服务地址factory.setAddress("http://localhost:8000/ws/hello");//设置发布的服务类factory.setServiceBean(new HelloWorldImpl());//添加日志输入、输出拦截器,观察soap请求以及soap响应内容factory.getInInterceptors().add(new LoggingInInterceptor());factory.getOutInterceptors().add(new LoggingOutInterceptor());//发布服务factory.create();System.out.println("发布服务成功,端口8000放行");}
}

访问wsdl说明书

访问:http://localhost:8000/ws/hello?wsdl

注意:在之前设置服务的地址后面加?wsdl

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.tedu.cn/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://tedu.cn/" name="HelloWorldImplService" targetNamespace="http://impl.tedu.cn/">
<wsdl:import location="http://localhost:8000/ws/hello?wsdl=HelloWorld.wsdl" namespace="http://tedu.cn/"> </wsdl:import>
<wsdl:binding name="HelloWorldImplServiceSoapBinding" type="ns1:HelloWorld">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sayHello">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="sayHello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sayHelloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloWorldImplService">
<wsdl:port binding="tns:HelloWorldImplServiceSoapBinding" name="HelloWorldImplPort">
<soap:address location="http://localhost:8000/ws/hello"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

客户端访问服务

导入依赖(和服务端使用的依赖一样)

获得服务端接口

@WebService
public interface HelloWorld {public String sayHello(String name);
}

注意:客户端获得的服务端接口的包名.接口名必须与服务端的包名.接口名都相同才可以进行远程调用(也必须有@WebService注解)

远程访问服务端

public class ClientTest {public static void main(String[] args) {//服务接口的访问地址:http://localhost:8000/ws/hello//创建cxf代理工厂JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();//设置远程访问服务端的地址factory.setAddress("http://localhost:8000/ws/hello");//设置接口的类型factory.setServiceClass(HelloWorld.class);//对该接口生成代理对象HelloWorld helloWorld = factory.create(HelloWorld.class);//打印代理对象类型System.out.println(helloWorld.getClass());//远程访问服务端方法String msg = helloWorld.sayHello("lili");System.out.println(msg);}
}

ApacheCXF实现WebService(JAX-RS)

服务端发布服务

导入依赖

    <dependencies><!--进行jaxrs开发的核心包--><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxrs</artifactId><version>3.0.1</version></dependency><!--内置jetty web服务器--><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http-jetty</artifactId><version>3.0.1</version></dependency><!--日志的实现--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version></dependency><!--客户端调用时需要使用的依赖--><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-rs-client</artifactId><version>3.0.1</version></dependency><!--对json支持的两个依赖(就是不仅可以传递xml数据,也可以传递json数据)--><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-rs-extension-providers</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.codehaus.jettison</groupId><artifactId>jettison</artifactId><version>1.3.7</version></dependency><!--junit测试类--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><plugins><!--maven编译插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding><showWarnings>true</showWarnings></configuration></plugin></plugins></build>

在resources文件内添加日志(log4j.properties) 

#info等级的日志输出到CONSOLE和LOGFILE这两个目的地(LOGFILE表示将日志写到文件中,CONSOLE则将日志写到控制台)
log4j.rootCategory=info,CONSOLE,LOGFILE
#设置日志优先控制台输出
log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE
#定义控制台日志输出器
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
#控制台日志布局
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#控制台日志布局的设置
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p %30.30c %x-%m\n
#定义文件日志输出器
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#日志的存放位置
log4j.appender.LOGFILE.File=C:\\All\\jax.log
#启用文件日志追加模式
log4j.appender.LOGFILE.Append=true
#文件日志布局
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout

创建实体类(User)

@XmlRootElement(name="User")
public class User {private String name;private String city;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", city='" + city + '\'' +'}';}
}

@XmlRootElement(name="User")

作用:基于restful风格的webservice,客户端与服务端之间的通讯可以传递xml数据、json数据;而@XmlRootElement用于指定对象序列化为xml或json数据时根节点的名称。

xml形式
<User><name>张三</name><city>北京</city>
</User>json形式
{"User":{"name":"张三","city":"北京"}}

创建服务端接口(IUserService)

@Path("/userService")
@Produces("*/*")
public interface IUserService {@POST@Path("/save")@Consumes({"application/xml","application/json"})String saveUser(User user);@GET@Path("/get/{name}")@Consumes("application/xml")@Produces({"application/xml","application/json"})User findUserByName(@PathParam("name") String name);
}

@Path("/userService")

理解:该注解可以用在类上以及方法上,表示当前服务接口或接口方法对应的路径(若要访问接口方法则必须先访问接口,在接口的基础上进行path路径拼接)

@POST或@GET

含义:处理接口对应方法的请求类型

@Produces({"application/xml","application/json"})

含义:服务器所支持的返回的数据格式(xml格式或json格式)

@Consumes("application/xml")

含义:服务器所支持的请求数据的格式类型

@PathParam

作用:注解用于路径中的参数与接口方法中的参数进行绑定

创建接口实现类(UserServiceImpl)

public class UserServiceImpl implements IUserService {@Overridepublic String saveUser(User user) {System.out.println("保存了"+user.toString());return "user保存成功";}@Overridepublic User findUserByName(String name) {User user = new User();if ("lili".equals(name)){user.setName("lili");user.setCity("北京");}else {user.setName("随机");user.setCity("随机");}return user;}
}

发布服务

public class JaxrsTest {public static void main(String[] args) {//创建发布服务的工厂JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();//设置服务地址factoryBean.setAddress("http://localhost:8001/");//设置服务类factoryBean.setServiceBean(new UserServiceImpl());//添加日志输入输出拦截器factoryBean.getInInterceptors().add(new LoggingInInterceptor());factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());//发布服务factoryBean.create();System.out.println("发布服务成功。端口:8001");}
}

访问:http://localhost:8001/userService/get/lili

客户端访问服务

导入依赖(和服务端使用的依赖一样)

制作需要使用的实体类

@XmlRootElement(name="User")
public class User {private String name;private String city;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", city='" + city + '\'' +'}';}
}

注意:这里实体类所用的包名可以和服务端的不一样,但是@XmlRootElement(name="User")注解必须存在

远程调用服务端

前言:这里远程调用服务端只需要使用WebClient工具类即可完成,他调用请求方法后所返回的返回值为Response对象,该对象可以通过readEntity()方法来获取特定类型的返回值供我们使用。

WebClient中的静态方法

  • create(String url):表示请求的服务端url地址
  • type(String type):指定请求的数据格式(xml、json)
  • accept(String type):指定接收响应的数据格式(xml、json)
  • post(请求参数):表示要带着该参数来发起post请求

注意:以上方法除了post()和get()等请求的方法返回值为Response类型,其他方法的返回值均为WebClient类型,所以可以实现链式调用

public class ClientTest {public static void main(String[] args) {User user = new User();user.setName("nana");user.setCity("广东");//通过WebClient对象远程调用服务端(post请求)Response response = WebClient.create("http://localhost:8001/userService/save").type("xml").accept("json").post(user);//读取response中请求体的内容,并获取特定类型的返回值String s = response.readEntity(String.class);System.out.println(s);//通过WebClient对象远程调用服务端(get请求)Response response1 = WebClient.create("http://localhost:8001/userService/get/lili").accept("xml").type("json").get();//读取response中请求体的内容,并获取特定类型的返回值User user1 = response1.readEntity(User.class);System.out.println(user1);}
}


http://chatgpt.dhexx.cn/article/EIUO0k32.shtml

相关文章

WebService技术详解CXF

WebService WebService简介 Web Service技术&#xff0c; 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件&#xff0c; 就可相互交换数据或集成。依据Web Service规范实施的应用之间&#xff0c; 无论它们所使用的语言、 平台或内部协议是什么&…

WebService技术入门

一、Webservice简介 1、 WebService是一种跨编程语言和跨操作系统平台的远程调用技术。具有异构平台的互通性,软件的复用性等优点。 2、WebService的三要素&#xff1a; &#xff08;1&#xff09;SOAP(简单对象访问协议)&#xff0c;基于HTTP协议&#xff0c;采用XML格式&…

WebService技术详解 (一)

WebService WebService简介 Web Service技术&#xff0c; 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件&#xff0c; 就可相互交换数据或集成。依据Web Service规范实施的应用之间&#xff0c; 无论它们所使用的语言、 平台或内部协议是什么&…

WebService技术详解

WebService简介 Web Service技术&#xff0c; 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件&#xff0c; 就可相互交换数据或集成。依据Web Service规范实施的应用之间&#xff0c; 无论它们所使用的语言、 平台或内部协议是什么&#xff0c; 都可…

信息系统项目管理师:Web Service技术篇

一、Web Service技术 Web Service是解决应用程序之间相互通信的一种技术。WebService是描述一系列操作的接口。它使用标准的、规范的XML描述接口。 Web Application是面向用户的&#xff0c;而Web Service面向的则是计算机。 Web Service模型&#xff1a;服务提供者、服务请求者…

WebService全面详解

目录 1. 什么是WebService 2. WebService的三要素 2.1 SOAP 2.1.1SOAP协议格式 2.1.2 SOAP1.1协议&#xff1a; 2.13 SOAP1.2 2.1.4 SOAP1.1和SOAP1.2区别 2.2 WSDL 2.3 UDDI 3. WebService开发规范 3.1 JAX-WS 3.2 JAXM&SAAJ 3.3 JAX-RS 4. WebService应用场…

jQuery来实现一个ajax实例

下面介绍使用jQuery来实现一个简单的ajax实例 主要的效果是使用ajax来实现书籍的价格随着书籍的数量变化&#xff0c;有一个增加按钮和一个减少按钮 jsp页面代码 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <…

jsp+ajax实例

下面介绍JSP前台表单内容通过Ajax异步提交到后台Servlet进行校验&#xff08;校验方式多种&#xff0c;包括提取数据库信息&#xff0c;校验用户名是否重复等&#xff09;&#xff0c;异步在JSP表单页面显示校验结果信息的基本过程。 一、说明&#xff1a; 1.由于本…

Ajax的简单实例

AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 AJAX 是一种用于创建快速动态网页的技术。 通过在后台与服务器进行少量数据交换&#xff0c;AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部…

Ajax例子

Ajax实现无刷新三联动下拉框 1.html代码 < HTML > < HEAD > < title > Ajax实现无刷新三联动下拉框 </ title > < meta content "Microsoft Visual Studio .NET 7.1" name "GENERATOR" > < meta content "C#"…

javaweb+jQuery ajax实例

什么是ajax AJAX即“Asynchronous Javascript And XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。 AJAX 异步 JavaScript和XML&#xff08;标准通用标记语言的子集&#xff09;。 AJAX 是一种用于创建快速动态网…

原生js的Ajax实例

与jQuery不同&#xff0c;原生js的ajax的实现相比来说复杂一些&#xff0c;因为jquery中的$.ajax()方法已经把js的实现封装起来&#xff0c;使用起来更加方便。但是&#xff0c;原生js的实现过程&#xff0c;对于理解ajax&#xff0c;好像更清晰一些。 之前写过的jQuery的ajax…

Ajax最简单实例(java)

总体介绍&#xff0c;不感兴趣的请跳过&#xff1a;以下内容是关于DWR来实现Ajax的方法。 一、 Ajax的介绍。 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 …

Ajax学习(二)—— 一个简单的Ajax实例

通过上篇博客认识Ajax之后,我们通过一个简单的实例来消化消化理论知识,一睹Ajax的庐山真面目。 1.实例功能: 当用户输入用户名,文本框失去焦点后,通过异步调用来判断该用户名是否已经存在。若存在,则在上图中红框处显示提示。当用户名可用时,提交按钮变为可用状态。 2.…

Ajax实例(JAVA)

这是一个用于留言板留言提交与读取的简单实例&#xff0c;不包括回复、编辑与删除等其它管理功能。 本实例的目的在于用一个简单的例子展示如果在java web应用中&#xff0c;用javascript开发Ajax应用。 一、web页面 msbord.jsp 1、本页面用于留言显示 2、本页面提供留言功能…

原生js实现Ajax实例讲解

Ajax简介 ajax 异步 JavaScript 和 XML。 ajax是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。我们知道&#xff0c;传统的网页&#xff08;不使用ajax&#xff09;如果需要更新内容&#xff0c;必须重新加载整个网页。Ajax的出现&#xff0c;使…

jsp ajax实例讲解

下面介绍JSP前台表单内容通过Ajax异步提交到后台Servlet进行校验&#xff08;校验方式多种&#xff0c;包括提取数据库信息&#xff0c;校验用户名是否重复等&#xff09;&#xff0c;异步在JSP表单页面显示校验结果信息的基本过程。 一、说明&#xff1a; 1.由于本…

jqueryajax实例

运用ajax结合dom写的小实例&#xff0c;其中记录了过程中遇到的问题和解决方法 任务要求&#xff1a; 模拟“请求用户列表”&#xff0c;向后台请求&#xff0c;后台会去数据库中将你的用户列表全部查出来&#xff0c;返回很多条记录&#xff0c;现在将记录显示在页面上用表格打…

Ajax简介和实例

目录 什么是 AJAX &#xff1f; AJAX实例 ajax-get无参 ajax-get有参 对象和查询字符串的互转 ajax-post ajax-post 表单 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 什么是 AJAX &#xff1f; 菜鸟教程是这样介绍的&#xff1a…

Ajax实例讲解与技术原理

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 摘要&#xff1a;AJAX即“Asynchronous Javascript And XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。AJAX 是一种用于创建快速动态网页的…