文章目录

  • 1 webservice概述
  • 2 webservice核心要素
    • 2.1 SOAP
    • 2.2 WSDL
  • 3 webservice的使用场景
  • 4 webservice的结构
  • 5 Java中的webservice
    • 5.1 webservice服务端
    • 5.2 webservice客户端
  • 6 WDSL文件说明
  • 7 webservice 请求与响应监控
  • 8 webservice 在Tomcat中发布
  • 9 在Spring中使用webservice

1 webservice概述

webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice服务,获取这些信息;

webservice 是一种系统之间进行调用的技术,系统之间调用的技术有:httpClient、hessian、dubbo、webservice 等;WebService 是一种跨越编程语言,跨越操作系统,跨越终端的远程调用技术,比如一个系统是 Java 语言开发的,另一个系统是 PHP 语言开发的,他们之间要实现信息交互,则可以使用 webservice 进行数据交互;

??所以 webservice 实现了异构系统之间的通信,不管是采用什么语言编写的,不管部署在什么操作系统平台上,使用 webservice 都可以实现信息的交换;

2 webservice核心要素

2.1 SOAP

SOAP 英文全称为:Simple Object Access Protocol,即简单对象访问协议,它是基于 xml 格式的消息交换协议;

OAP 定义了信息交换的格式,它包含一个重要的信封 envelope,使用信封envelope 来包装要传递的信息,使用命名空间 namespace 来区分传递的信息;简单来说,在 WebService 中传递的信息就是一封信,SOAP 就是信的通用格式,它定义了一封信应该有信封,信封里装着信的内容;

信封(envlope)的格式是固定的,而信的内容(要传递的数据)可以自己定义;SOAP 协议传输的数据采用 xml 格式进行封装,采用 http 协议进行传输,即soap=xml+http;

2.2 WSDL

WSDL 英文全称为 Web Service Description Language,即 Web Service 描述语言;它使用 xml 对 Web Service 进行描述,比如提供服务的方法、参数、返回值、数据类型等信息进行描述;简单来说,wsdl 就是 webservice 服务的使用说明书;

3 webservice的使用场景

1、应用系统集成
多个应用系统集成在一起,则需要信息交换或通信,那么可以采用 webservice进行通信;

2、异构系统之间通信
异构系统,主要是指编程语言不同的系统;不同系统之间,特别是开发语言不同的系统之间,可以通过 webservice 进行信息交换;

3、软件复用
webservice 可以作为一个公共的服务,供客户端调用,避免软件重复开发工作;

4 webservice的结构

服务端:提供服务,供客户端调用;
客户端:调用服务,获得服务的数据;

5 Java中的webservice

各种编程语言下都有 webservice 技术,比如 php、c#、Java 等;由于 webservice 定义交互的格式,所以不同编程语言之间可以实现相互调用,数据交换和通信;
Java 中的 webservice,即 Java API for XML-Based Webservices,简称JAX-WS 规范;

JAX-WS 是 sun 公司随 Java 5 发布的一项 webservice 规范,在此之前是JAX-RPC,JAX-RPC 不是很完善;由于 JAX-RPC 并不是很完善,所以在 Java 5 发布后,随即发布了 JAX-RPC2.0,该版本已经比较成熟和完善,后来为了和之前的规范进行区分,又将其改名为JAX-WS 2.0;

Java 5 对应 JAX-WS 2.0 版本;
Java 6 对应 JAX-WS 2.1 版本;
Java 7 对应 JAX-WS 2.2 版本;
目前 JAX-WS 是 2.2.9

5.1 webservice服务端

1、定义一个服务接口及实现,并将实现类注解为@WebService,标注了该注解的类的方法就变为 webservice 方法;

public interface UserService {public String sayHi (String name);public String work (String work);public User getUser (User user);}
/*** 标注了该@WebService注解的类的方法就变为webservice方法*/
@WebService
public class UserServiceImpl implements UserService {@Overridepublic String sayHi(String name) {return "Hi, " + name;}@Overridepublic String work (String work) {return "He is working " + work;}@Overridepublic User getUser (User user) {user.setName(user.getName() + "-service");return user;}
}
public class User {private int id;private String name;private Date birthday;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}

2、通过 Endpoint 的 publish 方法,将上一步定义的服务发布出去;

public class Server {public static void main(String[] args) {//发布webserviceString wsAddress = "http://localhost:6868/01-ws-java-server/ws";Endpoint endpoint = Endpoint.publish(wsAddress, new UserServiceImpl());System.out.println("webservice发布成功:" + endpoint.isPublished());}
}

3、运行 main 方法;

4、 在 浏 览 器 里 输入 http://localhost:6868/01-ws-java-server/ws?wsdl 将 会 看 到webservice 的 wsdl 信息;有了服务端的 webservice 描述文件 wsdl,就可以根据这个描述文件开发客户端调用程序

5.2 webservice客户端

1、根据服务端的 wsdl 文件生成客户端调用代码:
在命令行输入命令(需要配置了 Java 环境变量):
wsimport -encoding [编码] -keep -p [包名] [发布的服务地址?wsdl]
比如:

wsimport -encoding utf8 -keep -p com.ws.stub -Xnocompile http://localhost:6868/01-ws-java-server/ws?wsdl

其中:
wsimport 命令
-encoding 指定生成代码的编码格式
-keep 保存生成的代码
-p 指定包名
-Xnocompile 表示生成的代码不编译



2、使用生成的代码调用服务端提供的服务;

public class Client {public static void main(String[] args) {//1.创建一个webservice的客户端UserServiceImplService userServiceImplService = new UserServiceImplService();//2.获取远程服务接口对象UserServiceImpl userService = userServiceImplService.getUserServiceImplPort();//3.直接调用远程服务接口对象的方法String hi= userService.sayHi("张三丰");System.out.println(hi);String work = userService.work("Java");System.out.println(work);User user = new User();user.setId(100);user.setName("张无忌");user.setBirthday(DateUtils.dateToXmlDate(new Date()));User userServer = userService.getUser(user);System.out.println(userServer.getId() + "--" + userServer.getName() + "--" + userServer.getBirthday());}
}

注意Date类型要使用工具类特殊处理

public class DateUtils {/*** 将Date类转换为XMLGregorianCalendar** @param date* @return*/public static XMLGregorianCalendar dateToXmlDate(Date date){Calendar cal = Calendar.getInstance();cal.setTime(date);DatatypeFactory dtf = null;try {dtf = DatatypeFactory.newInstance();XMLGregorianCalendar dateType = dtf.newXMLGregorianCalendar();dateType.setYear(cal.get(Calendar.YEAR));//由于Calendar.MONTH取值范围为0~11,需要加1dateType.setMonth(cal.get(Calendar.MONTH)+1);dateType.setDay(cal.get(Calendar.DAY_OF_MONTH));dateType.setHour(cal.get(Calendar.HOUR_OF_DAY));dateType.setMinute(cal.get(Calendar.MINUTE));dateType.setSecond(cal.get(Calendar.SECOND));return dateType;} catch (DatatypeConfigurationException e) {e.printStackTrace();}return null;}/*** 将XMLGregorianCalendar转换为Date** @param cal* @return*/public static Date xmlDate2Date(XMLGregorianCalendar cal){return cal.toGregorianCalendar().getTime();}
}

6 WDSL文件说明

service

  • 整个 webservice 的服务信息,比如服务名,包括所有的服务;

binding

  • 定义每个服务接口的消息格式和协议细节;

portType

  • 描述整个 webservice 可以被执行的操作及相关信息;

message

  • 定义操作的一个或多个数据参数;

types

  • 定义 webservice 使用的全部数据类型;

7 webservice 请求与响应监控

webservice 的请求和响应是 soap 格式的 xml,可以采用一个端口监听工具 TCPMon,通过这个工具,我们可以非常方便地监听目标端口请求与响应的数据;

TCPMon 相当于一个“ 拦截器”,所有我们向目标服务器发送的数据包和服务器返回的数据包都要经过这个拦截器(也可以叫作代理服务器),进而拦截到请求和响应的数据包;

如上图,如果不使用监控工具,我们是通过 http://xxx.xxx.xxx:8080 访问服务端的服务;如果使用监控工具,则通过访问监控工具,由监控工具请求服务端的,服务,然后再把结果返回给我们,则访问请求变为:http://xxx.xxx.xxx:9000
需要访问9000重新生成WDSL,并替换掉之前的WDSL,然后重新发起请求。

8 webservice 在Tomcat中发布

1、添加相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ws</groupId><artifactId>03-ws-web-server</artifactId><version>1.0.0</version><dependencies><dependency><groupId>com.sun.xml.ws</groupId><artifactId>jaxws-rt</artifactId><version>2.2.10</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

2、编写服务接口

public interface UserService {public String sayHi(String name);public String work(String work);public User getUser(User user);}

3、添加服务实现类,并标注@webservice注解

/*** 标注了该@WebService注解的类的方法就变为webservice方法*/
@WebService
public class UserServiceImpl implements UserService {@Overridepublic String sayHi(String name) {return "Hi, " + name;}@Overridepublic String work (String work) {return "He is working " + work;}@Overridepublic User getUser (User user) {user.setName(user.getName() + "-service");return user;}
}

4、在WEB-INF文件夹下创建webservice配置文件

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"><!-- 服务路径http://网站路径/ws/userService --><endpoint name="userService"implementation="com.ws.service.impl.UserServiceImpl"url-pattern="/ws/userService" /></endpoints>

5、在web,xml中添加WSServlet,servlet3.0也可以不添加如下配置

<?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"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- Servlet 3.0或者以上不需要配置 --><servlet><servlet-name>jaxws</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>jaxws</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping></web-app>

调用和之前一样

9 在Spring中使用webservice

1、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ws</groupId><artifactId>05-ws-spring-web-server</artifactId><version>1.0.0</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.13.RELEASE</version></dependency><dependency><groupId>org.jvnet.jax-ws-commons.spring</groupId><artifactId>jaxws-spring</artifactId><version>1.9</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

2、编写服务接口
3、编写接口的实现类,并添加@webservice注解,需要让spring将该类加载为一个bean,所以需要加上@servcice或者@Component注解

/*** 标注了该@WebService注解的类的方法就变为webservice方法*/
@Component
@WebService
public class UserServiceImpl implements UserService {@Overridepublic String sayHi(String name) {return "Hi, " + name;}@Overridepublic String work (String work) {return "He is working " + work;}@Overridepublic User getUser (User user) {user.setName(user.getName() + "-service");return user;}
}

4、添加spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="applicationContext-jaxws.xml"/></beans>

5、配置spring的jax-ws配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:ws="http://jax-ws.dev.java.net/spring/core"xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsdhttp://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd"><context:component-scan base-package="com.ws.service.impl" /><!-- 绑定webservice地址,需要与web.xml的地址对应 --><!-- 访问:http://localhost:8080/webservice-server-spring-web//ws/userService"?wsdl --><!--alt + enter--><wss:binding url="/ws/userService"><wss:service><ws:service bean="#userServiceImpl" /></wss:service></wss:binding></beans>

6、配置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"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- needed for ContextLoaderListener --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- Bootstraps the root web application context before servlet initialization --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 用于配置地址栏请求路径 --><servlet><servlet-name>JaxWsServlet</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class></servlet><servlet-mapping><servlet-name>JaxWsServlet</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping></web-app>

调用和之前一样

Java webservice详解相关推荐

  1. SOA、微服务结构、RMI、RPC、Rest、RestFul、Soap、WebService详解

    SOA.RMI.RPC.Rest.RestFul.Soap.WebService详解 目录 一.SOA是什么? SOA的应用场景: SOA主要的使用场景:   ​ 数据总线是什么? SOA最显著的优势 ...

  2. Apache Thrift - java开发详解

    2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...

  3. Java泛型详解-史上讲解最详细的,没有之一

    目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...

  4. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  5. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

  6. 最详细的java泛型详解

    来源:最详细的java泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. ja ...

  7. Java异常详解及如何处理

    来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...

  8. 基础拾遗------webservice详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  9. Java基础——Java NIO详解(一)

    一.基本概念 1.I/0简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过str ...

最新文章

  1. 你不可不知的家庭装修禁忌
  2. 线程之线程共享成员变量的几种情况
  3. mxnet基础到提高(11)--循环
  4. JavaWeb总结(十五)
  5. C++ STL一些注意事项
  6. AE插件Stardust for mac(最强粒子特效)
  7. 数据科学 IPython 笔记本 9.9 花式索引
  8. 多线程同步执行,CountDownLatch使用
  9. [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换
  10. day_work_01
  11. 能力提升综合题单Part 8.1 图的存储与遍历
  12. java学生管理系统遇到的难题_学生信息管理系统错误总结
  13. 华为悦盒EC6018V9E线刷linux教程
  14. 计算机电源模式怎么删,电脑的电源选项里只剩下了平衡模式怎么办?
  15. 非root用户安装或升级CUDA和CUDNN版本
  16. 【读后感1】读《我是一只it小小鸟》有感
  17. 关于windows下的System32与SysWOW64两个文件夹
  18. MIT线性代数1806(35) 总复习
  19. 搜索词分析工具-网站关键词挖掘
  20. 外企面试,哪有你想象的那么难!

热门文章

  1. 台式机笔记本需要做机械硬盘和固态硬盘4K对齐吗?怎么做?
  2. 平方根(sqrt)算法
  3. php数组去重 (一维数组/二维数组)
  4. 当使用ftp访问文件夹时,拒绝访问
  5. matlab删除mat中的个别变量,从.mat文件中删除变量
  6. 小学计算机反思案例,小学数学有效教学案例及反思
  7. java_excel导出带折线图饼图之类
  8. 水晶报表之分页预留空白方便打印信纸
  9. 天虹迷你主机装linux,极简天虹迷你主机,小身材高性能,你的生活好搭档
  10. 要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法(没有全部列