• webService


    WebService的注解都位于javax.jws包下: 
    
    @WebService-定义服务,在类上边
        targetNamespace:指定命名空间,一般是接口的包名倒序
        name:portType的名称,客户端生成代码时 为接口名称
        portName:port的名称
        serviceName:服务名称
        endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。 
    
    @WebMethod-定义方法,在公开方法上边
        operationName:方法名
        exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false 
    
    @WebResult-定义返回值,在方法返回值前边
        name:返回结果值的名称 
    
    @WebParam-定义参数,在方法参数前边
        name:指定参数的名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    发布服务

    Java项目中 发布 一个WebService服务:

    • @WebService
      此注解用在类上指定将此类发布成一个WebService
    • EndPoint
      此类为端点服务类,其中 publish() 方法用于将一个已经添加了@WebService 注解对象绑定到一个地址的端口上,用于发布
    package cn.tgb.ws;
    
    importjavax.jws.WebMethod; 
    importjavax.jws.WebService; 
    importjavax.xml.ws.Endpoint;
    
    @WebService
    public classHelloWebService { 
    	
    	publicString HelloWord(String name){
    		return"Hello: "+name; 
    	} 
    
    	/**
    	  * @WebMethod-定义方法,在公开方法上边
    	  * 	exclude:设置为true表示此方法不是webservice方法
    	  * 	添加exclude=true后,HelloWord2()方法不会被发布
    	  */
    	@WebMethod(exclude=true) 
    	public String HelloWord2(String name){
    		return"Hello: "+name; 
    	} 
    
    	publicstatic void main(String[] args) {  
    		/**
    		* 参数1:服务的发布地址
    		* 参数2:服务的实现者
    		*/ 
    		Endpoint.publish("http://192.168.24.138:456/helloWord",
    						new HelloWebService()); 
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    运行以上程序进行发布

    然后浏览器访问:http://192.168.24.138:456/helloWord?wsdl

    只要在客户端浏览器能看到此WSDL文档,说明服务发布成功

    注意:

    1. EndPoint是 jdk 提供的一个专门用于发布服务的类,该类的publish()方法接收两个参数,一个是本地的服务地址,二是提供服务的类。位于javax.xml.ws.Endpoint包中
    2. 类上添加注解@WebService
      类中所有 非静态方法 都会被发布;
      静态方法和 final 方法不能被发布;
      方法上加@WebMentod(exclude=true)后,此方法不被发布

    客户端

    wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码)
    wsimport.exe位于JAVA_HOME\bin目录下 
    常用参数为:
            -d<目录>  - 将生成.class文件。默认参数。
            -s<目录> - 将生成.java文件。
            -p<生成的新包名> -将生成的类,放于指定的包下
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    根据WSDL文档来在客户端编写代码,访问发布的服务

    wsimport是JDK自带的,可以根据WSDL文档生成客户端调用代码的工具。无论服务器端WebService使用什么语言编写的,都将在客户端生成Java代码

    wsimport.exe命令参数:

    • -d:生成 .class 文件。默认参数。
    • -s:生成 .java 文件
    • -p:自定义包结构。将生成的类,放于指定的包下

    例如:

    解析地址生成源码到E盘
    wsimport -s . http://192.168.24.138:456/helloWord?wsdl
    
    • 1
    • 2

    在这里插入图片描述

    自定义包结构的命令:
    wsimport -s . -p com.test.ws.client  http://192.168.24.138:456/helloWord?wsdl
    
    • 1
    • 2

    在这里插入图片描述

    1、概述

    webservice 主流框架:CXF官网、XFire、Axis1/2

    这里学习的是 ApacheCXF 框架下的 WebService,Apache CXF = Celtix + XFire,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用

    WSDL 报文解析

    在服务端启动后,访问暴露的地址加上 ?wsdl ,得到报文,总览如下:
    在这里插入图片描述

    <definitions>
    	<types> 定义 webservice 使用的数据类型
    	<message> 每个消息均有一个或多个部件,可看作是 Java 中方法调用的参数
    	<portType>类似Java中的一个函数库/一个模块/一个类
    	<binding>为每个端口定义消息格式和协议细节
    </definitions>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    wsdl:definitions

    在这里插入图片描述

    wsdl:types

    在 Java 中定义的服务接口中方法的输入参数和返回值
    在这里插入图片描述
    图片中的报文,参数和返回值的名字都是默认的

    可以在方法中修改为自定义的,修改方式如下:
    在这里插入图片描述
    修改重启后如下:
    在这里插入图片描述

    wsdl:message

    在这里插入图片描述

    wsdl:portType

    在这里插入图片描述

    wsdl:binding

    特定端口类型的具体协议和数据格式的绑定
    在这里插入图片描述

    JAXB

    JAXB 可以实现 java 对象与 XML格式之间的转换

    Unmarshaller 类将XML转化为Java对象
    Marshaller 类将Java对象转化为XML

    @XmlRootElement注解使用在 pojo 类上,表明xml的根元素用类名表示

    提供实体类:

    @XmlRootElement
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public class Book {
        private Long id;
        private String bookName;
        private double price;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    编写 Unmarshaller + Marshaller 程序:

    	public static void main(String[] args) throws JAXBException {
            myMarshaller();
            myUnMarshaller();
        }
    
        private static void myMarshaller() throws JAXBException {
            JAXBContext jaxbContext = JAXBContext.newInstance(Book.class);
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");
            marshaller.marshal(new Book(1L,"入门",33.45d),System.out);
        }
        private static void myUnMarshaller() throws JAXBException {
            JAXBContext jaxbContext = JAXBContext.newInstance(Book.class);
            String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
                    "<book>"+
                    "   <bookName>入门</bookName>"+
                    "   <id>1</id>"+
                    "   <price>33.45</price>"+
                    "</book>";
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Book book = (Book) unmarshaller.unmarshal(new StringReader(xmlString));
            System.out.println(book.toString());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    就可以实现 Java 对象与 XML 格式之间的转换

    JAX-WS

    JAX-WS 会将 API 的调用转换成对应的 SOAP 消息,可以完成 wsdl 到 Java 的转换,是关于 WebService 的开发标准

    客户端根据命令和 服务的提供的地址,得到一系列的 .java 文件
    在这里插入图片描述

    将其中关键的两个类打包成 jar 包,作为客户端的依赖引用,即可实现业务调用执行
    在这里插入图片描述
    客户端就可以使用这些代码得到服务端使用的业务接口

    直接生成客户端

    上面的情况还是需要自己调用方法来返回业务接口。使用以下命令可以直接生成业务接口,供调用执行

    在这里插入图片描述

    在这里插入图片描述

    Spring 整合 JAX-WS

  • 相关阅读:
    大任务拆分,让并行嗨起来!
    Vuex从了解到实际运用(二),获取vuex中的全局状态(state,getters)
    NAT如何配置地址转换
    1.3-参数化
    【C++】类和对象中的static和const
    (附源码)springboot毕业生弃置物品交易系统 毕业设计 231151
    Git 是什么(Git 使用详细说明)
    技术分享 | app自动化测试(Android)-- 特殊控件 Toast 识别
    Vue3中的常见组件通信之v-model
    2023年中国汽车座舱行业发展现状及趋势分析:高级人机交互(HMI)系统将逐步提升[图]
  • 原文地址:https://blog.csdn.net/qq_48496502/article/details/125439232