• 分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)


     系列博文:

    分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客

    分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客

    分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)_闲猫的博客-CSDN博客

    分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客

    分布式.RPC-WebService CXF框架_闲猫的博客-CSDN博客

    分布式.RPC-WebService Restful风格实现_闲猫的博客-CSDN博客


    目录

    入门案例

    服务端

    客户端

    WSDL文件解析

     xsd文件解析

    注解开发

    @WebService

     @WebMethod()

    @WebParam(name="a")

    @WebResult(name="r")


    特点:跨平台、跨语言、但速度比较慢

    场景:适用于异构系统之间的调用,比如:两个厂家实现的系统彼此调用

    协议:基于SOAP协议(应用层

    入门案例

    服务端

    步骤:

    1. 创建一个java工程
    2. 编写提供服务的类
    3. 发布服务的方法
    4. 测试

    实现:

    1. 创建一个java工程

          

    2. 编写提供服务的类(服务类)

    模型类:

    public class Member implements Serializable[ww1]  {

        private static final long serialVersionUID = -7197511997605564716L;

        private Integer uuid;

        private String name;

         // 有参/无参构造方法

        // setter/getter方法

         // toString方法

    }


     [ww1]就是一个实现了Serializable [ww1]接口的JavaBean

    业务实现类:

    @WebService[ww1] 

    public class MemberService {

        public String get(Integer i) {

           return "张三";

        }

        public Member getMember(String sn) {

           return new Member(11, "赵芸");

        }

        public String setMember(Member member) {

           return member.toString();

        }

    }


     [ww1]必须写该主键否则报错

    注意】(服务类使用@WebService注解)如没有注解将报错:

    Exception in thread "main" java.lang.IllegalArgumentException: class cn.itcast.Service.MemberService has neither @WebService nor @WebServiceProvider annotation

    3. 发布服务的方法

    public static void main(String[] args) {

         //第一个参数:发布的地址

         //第二个参数:该地址对应的服务类

        Endpoint.publish("http://localhost:23456/member", new MemberService());

    }

    4. 测试

    URL地址:http://localhost:23456/member

    点击:http://localhost:23456/member?wsdl 

    出来这个就标识服务发布成功。

    客户端

    步骤:

    1. 创建java工程
    2. 生成本地代码
    3. 调用远程服务

    实现:

    1. 创建java工程

    2. 生成本地代码

             进入工程src目录下,使用指令:“wsimport –s . 发布地址?wsdl”,在CMD下执行。如下图:

             

     【说明】wsimport指令

            1. 该指令是JDK下指令

            2.直接使用的前提是已经配置了JDK环境变量

            3.如果没有配置环境变量,还想直接使用,先执行

                    Path D:\JavaConfig\Java\jdk1.7.0_72\bin (jdk路径,到bin一级)

                    再执行wsimport 指令

    【生成的代码】

            

    3. 调用远程服务

    • 第一种方式:

    public static void main(String[] args) {

        MemberServiceService memberService = new  MemberServiceService();[ww1] 

        MemberService memberServicePor =

                    memberService.getMemberServicePort()[ww2] ;

          

        Member mem = memberServicePor.getMember("");

        System.out.println(mem.getName() + " " + mem.getUuid());

    }


     [ww1]用来产生接口

     [ww2]获取接口

    内部实现:

    MemberServiceService代码:

    @WebServiceClient(name = "MemberServiceService", argetNamespace = "http://Service.itcast.cn/", wsdlLocation = "http://localhost:23456/member?wsdl")

    public class MemberServiceService extends Service

    {

       static {

            URL url = null;

            try {

                url = new URL("http://localhost:23456/member?wsdl");

            } catch (MalformedURLException ex) {

            }

        }

        @WebEndpoint(name = "MemberServicePort")

        public MemberService getMemberServicePort() {

            return super.getPort(new QName("http://Service.itcast.cn/",

                          "MemberServicePort"), MemberService.class);

        }

    }

    • 第二种方式:

    从第一种实现的源码中看第二种实现方式。

    public static void main(String[] args) {

        try {

            URL url[ww1]  = new URL("http://localhost:23456/member?wsdl");

           QName qname [ww2] = new QName("http://Service.itcast.cn/",

                  "MemberServiceService");

          

           Service service = Service.create[ww3] (url, qname);

           MemberService memberservice =       

                          service.getPort(MemberService.class)[ww4] ;

          

           Member mem = memberservice.getMember("");

           System.out.println(mem.getName() + " " + mem.getUuid());

        } catch (Exception e) {

           e.printStackTrace();

        }

    }


     [ww1]在哪里找

     [ww2]找什么

     [ww3]创建服务对象

     [ww4]根据Service类获取接口对象,即:提供服务的对象

    WSDL文件解析

           WSDL (Web Service Description Language) WebService描述语言,是WebService发布服务的描述,相当于WebService的使用说明书。通常一个WSDL文件描述的是一个服务类提供的服务的描述。

           描述的内容包括:

                  该服务类提供接口需要的模型类(返回值、形参;在类中的模型不进行模式)

                  对外提供的接口(方法描述:方法名、形参列表和返回值)

                  绑定的服务对象以及服务对象是啥

           以下图示WSDL的内容:

            

     xsd文件解析

           XSD文件是描述使用过程中的一些模型类,以及一些基本类的包装类(这个包装类不是Integer和Double等这种,而是将getEember、getMemberResponse这种类型)。

           以下是XSD文件解析:

            

    注解开发

           这里说的注解只是用来修改在客户端方法、变量的名称以及类的名称,可以和原始的方法名称、变量名、类名不同。这样就可以隐藏服务器内部的实现。

           注解包括四个:@WebService、@WebMethod、@WebParam、@WebResult。分别代表:服务类、方法、形参、返回值。

           以下是注解的位置,参考位置所在:

            

    @WebService

    注解写的位置:(MemberService是服务类)

     

    【说明】服务类和接口类不同

           在WebService服务端生成WSDL中有两种类对外提供服务,这两个类对应的是我们在服务端写的服务类,这两个类一个是服务类,各类就好似对外提供了一个服务,你可以根据调用不同的接口,来完成不同的功能。另一种是接口类,就是对外提供接口的类,用来实现具体的功能,其实这是一个接口,对外提供的接口就是定义服务类提供的接口。而服务类中提供的是获取各个接口的方法,比如:getMemberPoint用来获取接口。

           比如:现在一个学生管理系统,对外只提供一个服务器类,但学生管理系统下有不同的模块,那就是不同的接口类实现啦。

           服务类和接口类在调用中的关系如下:

           

            一个服务类对应的是一个WSDL文件。

    serviceName="abc"

             用来修改服务类的类名,下面是WSDL文件中的变化

            

     name="xyz"

             用来修改接口的类名,下面是WSDL文件中的变化

             

     targetNamespace=http://it.baidu.com

            用来修改一个服务类对应的WSDL的命名空间,下面是WSDL文件中的变化

            

     @WebMethod()

    注解写的位置:

            

     operationName="show" 

            用来修改接口类中方法的名称,下面是WSDL文件中的变化

            

     exclude=true

           隐藏此方法,不进行发布出去,虽然是共有方法也不发布出去,如果没有能发布的方法,在发布服务是(启动)时将报错。

    @WebParam(name="a")

           注解位置:

            

             用来修改形式参数名称,下面是XSD文件中的变化

            

    @WebResult(name="r")

            注解位置:

             

            用来修改返回值名称,下面是XSD文件中的变化

            


    END 

  • 相关阅读:
    servlet注解开发,简化web.xml文件
    Ubuntu服务器搭建 - 环境篇
    Vue create 之后的空架子完善
    【无标题】
    聚精品,通全球 2024中国(杭州)国际电商物流包装产业展览会四月隆重开幕
    Jeecg-boot中的popup弹框使用(基于表p_user_info),表格显示添加其它关联表的字段
    第七章 排序
    flutter系列之:flutter架构什么的,看完这篇文章就全懂了
    GCC详解的-Wl选项说明与测试
    【 C++ 】vector的常用接口说明
  • 原文地址:https://blog.csdn.net/weixin_42754896/article/details/126447862