webservice:web 服务,一种跨编程语言跨操作系统的远程调用技术

  • 用途:主要用于多个异构系统的数据交互
  • 分类:
    • SOAP架构的webservice:使用 SOAP 协议
    • Restful架构的webservice:使用 Http 协议

SOAP 三要素

1、SOAP协议:Simple Object Access Protocol ,简单对象访问协议,一种基于XML的协议,它使应用程序通过http协议来交换数据

  • SOAP = Http + xml
  • 常用版本:soap 1.1 和 soap 1.2

2、WSDL:web service description language,基于xml的用于描述webservice的函数、参数、返回值等信息,通俗理解为 webservice 的使用说明书

3、UDDI:Universal Description,Discovery and Integration,一种目录服务,企业用它对web services进行注册和搜索,从而达到资源共享,促进全球经济合作

简单开发使用

使用 java 发布一个 webservice 服务端:
1、编写服务接口和其实现类,并用 @webService 进行注解

  1. // 要发布的服务接口
  2. @WebService
  3. public interface WeatherService {
  4. String queryWeather(String cityName);
  5. }
  6. // 服务实现
  7. @WebService
  8. public class WeatherServiceImpl implements WeatherService {
  9. @Override
  10. public String queryWeather(String cityName) {
  11. System.out.println("当前城市:" + cityName);
  12. if ("上海".equals(cityName)) {
  13. return "晴天";
  14. }
  15. return "其他地区未知";
  16. }
  17. }

2、发布服务:

  • Endpoint.publish(url , 服务实现类)

    1. public class WeatherPublisher {
    2. public static void main(String[] args) {
    3. // 发布服务:服务地址 服务实现类实例
    4. // 发布服务后,自动生成说明书,说明书地址:服务地址?wsdl
    5. Endpoint.publish("http://localhost:8080/weatherService", new WeatherServiceImpl());
    6. }
    7. }

    3、获取webservice说明书:

  • 发布成功后,会自动生成webservice说明书,地址为:发布地址?wsdl

  • 在浏览器输入:http://localhost:8080/weatherService?wsdl

webservice 客户端:

wsdl 说明书阅读:从下往上

  • 先找到服务视图名称 ,再在 service 标签下的 port 标签获取 binding 属性
  • 通过服务视图名称找到相关的 binding :
  • 由 type 属性找到相应的 portType 标签 ,这就是服务的核心类,webservice 中所有的服务调用都在这里

根据 wsdl 生成客户端调用代码:wsimport -d . -s . -p 包名 wsdl地址

  • -d:生成 .class 文件存放的未知,上面使用了相对路径 .
  • -s:生成 .class 对应的源代码
  • -p:指定生成文件的包名
  • wsdl:文档地址,即 http://localhost:8080/weatherService?wsdl

将生成的 .java 文件导入项目(放在 -p 参数指定的包名中),然后通过如下的代码进行使用:

  1. public class Main {
  2. public static void main(String[] args) {
  3. // 进行客户端调用
  4. // 创建服务视图名称对象
  5. WeatherServiceImplService weatherServiceImplService = new WeatherServiceImplService();
  6. // 通过服务视图名称对象找到binding---直接通过binding找到portType(服务核心类对象)
  7. WeatherServiceImpl weatherServiceImplPort = weatherServiceImplService.getWeatherServiceImplPort();
  8. // 调用方法
  9. String weather = weatherServiceImplPort.queryWeather("上海");
  10. System.out.println(weather);
  11. }
  12. }

spring 整合 jax-ws 开发 webservice

服务端:
1、导入相关依赖:

  1. <!-- CSF WS开发核心 -->
  2. <dependency>
  3. <groupId>org.apache.cxf</groupId>
  4. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  5. <version>3.4.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.cxf</groupId>
  9. <artifactId>cxf-rt-transports-http</artifactId>
  10. <version>3.4.2</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.cxf</groupId>
  14. <artifactId>cxf-rt-transports-http-jetty</artifactId>
  15. <version>3.4.2</version>
  16. <scope>test</scope>
  17. </dependency>
  18. <!-- spring webmvc -->
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-webmvc</artifactId>
  22. <version>5.3.1</version>
  23. </dependency>

2、配置 web.xml

  1. <!-- spring配置文件位置 -->
  2. <context-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>classpath:spring-cxf.xml</param-value>
  5. </context-param>
  6. <!-- 加载spring工厂配置文件 -->
  7. <listener>
  8. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  9. </listener>
  10. <!-- 配置cxf的servlet -->
  11. <servlet>
  12. <servlet-name>cxf</servlet-name>
  13. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  14. </servlet>
  15. <servlet-mapping>
  16. <servlet-name>cxf</servlet-name>
  17. <url-pattern>/services/*</url-pattern>
  18. </servlet-mapping>

3、创建 SEI(Service Endpoint Interface)服务发布接口:

  1. @WebService
  2. public interface WeatherService {
  3. String query(String location);
  4. }

4、创建 SEI 实现类

  1. @WebService
  2. public class WeatherServiceImpl implements WeatherService {
  3. @Override
  4. public String query(String location) {
  5. System.out.println("当前城市:" + location);
  6. if ("上海".equals(location)) {
  7. return "晴天";
  8. }
  9. return "其他地区未知";
  10. }
  11. }

4、使用 Spring 整合 CXF 发布 webservice,配置 spring-cxf.xml

  1. <!-- address:客户端访问服务器路径 -->
  2. <!-- serviceClass:配置接口 -->
  3. <!-- serviceBean:配置实现 -->
  4. <jaxws:server id="weatherService" address="/weather" serviceClass="org.example.service.WeatherService">
  5. <jaxws:serviceBean>
  6. <bean class="org.example.service.impl.WeatherServiceImpl"/>
  7. </jaxws:serviceBean>
  8. </jaxws:server>

5、启动服务器:http://localhost:8080/services/weather?wsdl