WebService
一、WebService
WebService是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,能够与其它兼容的组件进行相互操作。
WebService是一种部署在网络上的对象或者组件。
二、SOA
SOA(Service-Oriented Architecture)面向服务的体系结构
SOA是一个组件模型,它将应用程序的不同功能单元(服务),通过这些服务之间定义良好的接口和契约联系起来。
SOA与Web Service的区别与联系
Soa服务和Web Service之间的区别在于设计
SOA并没有确切的定义服务具体如何交互,而仅仅定义服务如何相互理解以及如何交互
其中的区别也就是如何执行流程的战略与如何执行流程的战术之间的区别
Web Service在需要交互的服务之间如何传递消息有具体的指导原则。
Web Service也是实现SOA具体方式之一。
SOA的特征:
- 服务的重用(Reuse)
- 服务的互操作性(interoperability)
- 服务是自治的(autonomous)功能实体
- 服务之间的松耦合度(Loosly Coupled)
- 服务是位置透明的(location transparency)
SOA的优势:
- 集成现有系统,不必另起炉灶
- 服务设计松耦合,带来多方面优点
- 统一了业务架构,可扩展性增强
- 加快了开发速度,减少了开发成本
- 持续改进业务过程,降低激变风险
SOA的不足:
- 可靠性:还没有完全 为事务的最高可靠性,不可否认性,消息一定会被传送且仅传送一次以及事务撤回做好准备。
- 安全性:由于一个应用软件的组件容易去与属于不同域的其他组件进行对话,确保不同又要相互连接的系统之间的安全必就复杂的多。
三、WSDL
WSDL(Web Service decription Language)-web服务描述语言
Web 服务描述语言规范定义了一个XML词汇表,该词汇表依照请求和响应消息,在服务请求都和服务提供都之间定义了一种契约。
3.1、基本结构
WSDL文档可以分为两部分,顶部分由抽象定义组成;
底层部分则由具体描述组成。
抽象定义
- Types:独立于机器和语言的类型定义,
- Message:包括函数参数(输入与输出分开)或者文档描述
- PortTypes:引用消息部分中消息定义来描述函数签名(操作史、输入参数、输出参数)
具体定义
- Bindings:PortTypes部分的每一个操作在引绑定实现
- Servies:确定每一绑定的端口地址
抽象元素:
Types元素-数据类型定义的容器
Message元素-通信消息的数据结构的抽象类型定义
PortType元素--可以描述一个Web Service可被执行的操作以及相关消息
具体元素:
Binding元素-特定端口类型的具体协议和数据格式规范的绑定
Service元素-相关服务访问点的集合
四、SOAP概述
SOAP(Simple Object Access Protocol),简单对象访问协议,是一个基于XML的用于在分布式环境下交换信息的轻量级协议
SOAP包含4个部分:
- SOAP封装:封装定义了一个描述消息中的内容是什么,是谁发送 ,谁应该接受并处理它以及如何处理它们的框架。
- SOAP编码规则:用于表示应用程序需要使用的数据库类型的实例。
- SOAP RPC表示:表示远程过程调用和应答的协定
- SOAP绑定:使用底层协议交换信息。
SOAP的优点:
- 相对于厂商无关
- 相对于平台独立
- 相对于操作系统独立
- 相对于编程语言独立
传输和语言绑定以及数据编码的参数选择都是由实现决定的
4.1、SOAP
- SOAP是简易对象访问协议
- SOAP是一种通信协议
- SOAP是用于应用程序之间的通信
- SOAP是一种用于发送消息的格式
- SOAP被设计用来通过因特网进行通信
- SOAP独立于平台
- SOAP独立于语言
- SOAP基于XML
- SOAP可扩展
- SOAP允许绕过防火墙
- SOAP将被作为W3C标淮来发展
五、Web Service发展历史
Java API for XML-based Web Service
六、创建WebService
- 1.创建WebService工程
- 2.创建服务java类
- 3.创建WebService
- 4.添加jax-ws支持的jar包
- 5.发布WebService工程和发布WEB项目一样
- 6.通过URL访问 http://localhost:8080/PB_WebService/CalculatorPort?wsdl
创建服务端WebService
java类
package com.pb.service; /** * 一个简单的计算器类 * */ public class Calculator { // 加法 public int add(int num1,int num2) { return num1+num2; } // 减法 public int sub(int num1,int num2) { return num1-num2; } // 乖法 public int mul(int num1,int num2) { return num1*num2; } // 除法 public int div(int num1,int num2) { return num1/num2; } // 除模 public int mod(int num1,int num2) { return num1%num2; } }
WebService
package com.pb.service; @javax.jws.WebService(targetNamespace = "http://service.pb.com/", serviceName = "CalculatorService", portName = "CalculatorPort") public class CalculatorDelegate { com.pb.service.Calculator calculator = new com.pb.service.Calculator(); public int add(int num1, int num2) { return calculator.add(num1, num2); } public int sub(int num1, int num2) { return calculator.sub(num1, num2); } public int mul(int num1, int num2) { return calculator.mul(num1, num2); } public int div(int num1, int num2) { return calculator.div(num1, num2); } public int mod(int num1, int num2) { return calculator.mod(num1, num2); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name></display-name> <servlet> <description>JAX-WS endpoint - CalculatorService</description> <display-name>CalculatorService</display-name> <servlet-name>CalculatorService</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CalculatorService</servlet-name> <url-pattern>/CalculatorPort</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener></web-app>
发布tomcat上
通过http://localhost:8080/PB_WebService/CalculatorPort?wsdl访问
结果
说明成功
创建客户端
创建Java项目
创建Web Service Client
测试类
package com.pb.client.test; import com.pb.service.CalculatorDelegate; import com.pb.service.CalculatorService; public class WebServiceClientTest { public static void main(String[] args) { //获取服务实例 CalculatorService service=new CalculatorService(); //获取服务的代理类接口 CalculatorDelegate cd=service.getCalculatorPort(); //调用方法 System.out.println("和:"+cd.add(10, 3)); System.out.println("差:"+cd.sub(10, 3)); System.out.println("积:"+cd.mul(10, 3)); System.out.println("商:"+cd.div(10, 3)); System.out.println("模:"+cd.mod(10, 3)); } }
七、Apache CXF
八、使用CXF创建HelloWorld
1.新建JAVA项目
2.导入jar包
3.创建WebService接口如:HelloWorldServcie
4.创建接口的实现类HelloWorldServiceImpl
5.
6.
接口
package com.pb.service; /** * HelloWorld接口 * */ public interface HelloWorldService { /** * 说话的方法 */ public void sayHello(String name); }
实现类
package com.pb.service.impl; import com.pb.service.HelloWorldService; /** * HelloWorldService实现类 * */ public class HelloWorldServiceImpl implements HelloWorldService { @Override public void sayHello(String name) { System.out.println(name+" say HelloWorld!!!"); } }
服务类
package com.pb.webservice; import org.apache.cxf.frontend.ServerFactoryBean; import com.pb.service.HelloWorldService; import com.pb.service.impl.HelloWorldServiceImpl; public class WebService { /** * 发布WebService */ public static void main(String[] args) { // ServerFactoryBean对象 ServerFactoryBean bean=new ServerFactoryBean(); //创建接口实例对象 HelloWorldService hello=new HelloWorldServiceImpl(); //设置服务类型 bean.setServiceClass(HelloWorldService.class); //设置发布地址 通过 http://localhost:8080/helloWorld?wsdl验证访问 bean.setAddress("http://localhost:8080/helloWorld"); //设置实体服务的类 bean.setServiceBean(hello); //发布 bean.create(); } }
客户端
package com.pb.client; import org.apache.cxf.frontend.ClientProxyFactoryBean; import com.pb.service.HelloWorldService; /** * 客户端 */ public class ClientService { public static void main(String[] args) { // 代理工厂bean ClientProxyFactoryBean bean=new ClientProxyFactoryBean(); //设置类型 bean.setServiceClass(HelloWorldService.class); //设置服务地址 bean.setAddress("http://localhost:8080/helloWorld"); //创建服务对象实例 HelloWorldService service=(HelloWorldService)bean.create(); //调用方法 service.sayHello("张三"); } }
九、和Spring集成
客户端