Webservice使用教程

Webservice使用教程(jax-ws)

Webservice的交互模式是一个类似于CS结构的模式,因此它需要一个Server端与一个Client端。在Client端访问Server端的接口来实现Webservice的功能。

Server端

打开IDEA创建gradle模块

webservice-01-server1

然后再build.gradle.kts文件中添加以下内容:


dependencies {// 测试依赖配置testImplementation(platform("org.junit:junit-bom:5.9.1")) // JUnit依赖testImplementation("org.junit.jupiter:junit-jupiter") // JUnit Jupiter测试框架// 主要依赖配置implementation("com.sun.xml.bind:jaxb-impl:4.0.5") // JAXB实现库implementation("javax.xml.bind:jaxb-api:2.3.1") // JAXB API库implementation("jakarta.activation:jakarta.activation-api:2.1.3") // Jakarta Activation API库implementation("jakarta.jws:jakarta.jws-api:3.0.0") // Jakarta JWS API库implementation("jakarta.xml.ws:jakarta.xml.ws-api:4.0.1") // Jakarta XML Web Services API库implementation("jakarta.xml.bind:jakarta.xml.bind-api:4.0.1") // Jakarta XML Binding API库// Apache CXF相关依赖implementation("org.apache.cxf:cxf-rt-transports-http-jetty:4.0.4") // CXF Jetty HTTP传输实现implementation("org.apache.cxf:cxf-rt-frontend-jaxws:4.0.4") // CXF JAX-WS前端支持implementation("org.slf4j:slf4j-reload4j:2.1.0-alpha1") // 使用Reload4J作为SLF4J的后端日志实现}// 输出字符集为UTF-8
tasks.withType<JavaExec> {jvmArgs = listOf("-Dfile.encoding=UTF-8","-Dsun.stdout.encoding=UTF-8","-Dsun.stderr.encoding=UTF-8")
}// 编译时使用UTF-8字符集
tasks.withType<JavaCompile> {options.encoding = "UTF-8"
}

在完成依赖配置后,我们来编写服务端的实现代码。
我们需要三个类来完成最基本的服务端的搭建

  1. 接口定义类:定义服务端的接口,用于客户端调用。
  2. 实现类:实现接口定义的服务端功能。
  3. 服务端启动类:启动服务端,并发布服务。
import jakarta.jws.WebService;@WebService // Webservice注解表明是一个Webservice的服务类
public interface HelloService {String sayHello(String name); // 方法定义
}
// 实现类
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return name + ", Hello!";}
}
import org.apache.cxf.feature.LoggingFeature;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;/*** 服务器启动类,负责发布基于CXF的HelloService Web服务。*/
public class Server {/*** 程序主入口** @param args 命令行参数*/public static void main(String[] args) {// 创建发布服务的工厂对象JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();// 设置服务地址factoryBean.setAddress("http://localhost:8899/ws/hello");// 设置服务实现类factoryBean.setServiceBean(new HelloServiceImpl());// 添加日志记录特性,以便记录服务交互过程中的请求与响应信息,虽然过时了,但是不影响使用factoryBean.getFeatures().add(new LoggingFeature());// 使用工厂对象发布服务factoryBean.create();}
}

还需要一个log4j的配置文件(放在resource目录下)这样不会报警

 # Root logger configurationlog4j.rootLogger=INFO, stdout# Console appenderlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n# Jetty logger specific configurationlog4j.logger.org.eclipse.jetty.util.component.ContainerLifeCycle=DEBUG, jettyLoglog4j.additivity.org.eclipse.jetty.util.component.ContainerLifeCycle=false# Jetty file appenderlog4j.appender.jettyLog=org.apache.log4j.FileAppenderlog4j.appender.jettyLog.File=log/jetty.loglog4j.appender.jettyLog.layout=org.apache.log4j.PatternLayoutlog4j.appender.jettyLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

然后启动一下Server的main方法,没有报错,服务端就启动了。
现在可以浏览器打开http://localhost:8899/ws/hello 查看是否运行中,也可以打开http://localhost:8899/ws/hello?wsdl 查看自动生成的wsdl文件。

Client端

客户端的实现代码也比较简单,只需要调用服务端的接口,并处理返回结果即可。

  1. 接口定义类:定义客户端的接口,用于调用服务端的接口。
  2. 客户端启动类:启动客户端,并调用服务端的接口。
import jakarta.jws.WebService;@WebService // Webservice注解表明是一个Webservice的服务类
public interface HelloService { // 接口名一样String sayHello(String name); // 方法定义名一样
}
/*** 客户端调用类,用于通过JAX-WS代理方式访问HelloService Web服务。*/
public class Client {/*** 程序主入口方法。** @param args 命令行参数*/public static void main(String[] args) {// 创建JAX-WS代理工厂对象JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();// 设置要访问的服务地址jaxWsProxyFactoryBean.setAddress("http://localhost:8899/ws/hello");// 设置服务接口类,即HelloServicejaxWsProxyFactoryBean.setServiceClass(HelloService.class);// 使用工厂对象创建HelloService接口的代理实例HelloService helloService = jaxWsProxyFactoryBean.create(HelloService.class);// 调用代理实例的方法,向服务端发送请求,并打印返回结果System.out.println(helloService.sayHello("hacoj"));}
}

启动一下Client的main方法,就可以调用服务端的接口了。
结果如下

Task :Client.main()
hacoj, Hello!

SOAP文件与WSDL文件

SOAP (Simple Object Access Protocol) 文件

SOAP (Simple Object Access Protocol) 文件,即简单对象访问协议(Simple Object Access Protocol)文件,是一种基于XML的协议,用于在Web服务中封装和传输请求与响应数据。

内容与格式
一个完整的SOAP文件通常包含以下组成部分:

SOAP Envelope

soap:Envelope 标签:表示整个SOAP消息的容器,是消息的根元素。
xmlns:soap 属性:定义SOAP命名空间(例如,http://www.w3.org/2003/05/soap-envelope),确保消息被正确解析。

SOAP Header

soap:Header 标签(可选):包含与消息正文(Body)内容相关的附加信息,如认证凭证、事务上下文、错误处理指示、路由信息等。

SOAP Body

soap:Body 标签:包含实际的请求或响应数据,即调用Web服务方法时传递的参数或返回的结果。
元素(或其对应的命名空间限定形式):表示正在调用的Web服务方法,通常对应于WSDL文件中定义的操作名。
参数或结果数据:作为子元素嵌套在操作名元素下,遵循WSDL定义的数据类型和结构。

SOAP Fault

soap:Fault 标签(可选):当发生错误时,在SOAP Body中包含错误信息,包括故障代码(fault code)、故障字符串(fault string)、故障详情(detail)等。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>No binding operation info while invoking unknown method with params unknown.</faultstring></soap:Fault></soap:Body>
</soap:Envelope>

WSDL (Web Services Description Language) 文件

WSDL (Web Services Description Language) 文件,即Web服务描述语言文件,是一种基于XML的语言,用于描述Web服务的接口、操作、消息等。

内容与格式

Definitions

wsdl:definitions 标签:作为WSDL文档的根元素,包含所有其他元素。
targetNamespace 属性:定义WSDL文档所使用的命名空间,确保元素名称的唯一性。

Types

wsdl:types 标签:声明服务所使用的数据类型,通常采用XML Schema(XSD)定义复杂的结构化数据。

Message

wsdl:message 标签:定义Web服务交互中交换的消息结构,包括消息名称和消息部分(part)。

PortType

wsdl:portType 标签:定义Web服务接口(也称作契约),包括一组抽象操作(operation),每个操作描述了输入消息、输出消息和可能的故障消息。

Binding

wsdl:binding 标签:指定如何将抽象接口(PortType)绑定到具体的传输协议和数据格式,如SOAP、HTTP、MIME等。

Service

wsdl:service 标签:定义一个或多个服务端点(endpoint),每个端点关联一个或多个具体绑定(binding)和网络地址(location),以便客户端定位和访问服务。

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:tns="http://impl.service.hacoj.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://service.hacoj.com/"name="HelloServiceImplService" targetNamespace="http://impl.service.hacoj.com/">
<wsdl:import location="http://localhost:8899/ws/hello?wsdl=HelloService.wsdl"namespace="http://service.hacoj.com/"></wsdl:import>
<wsdl:binding name="HelloServiceImplServiceSoapBinding" type="ns1:HelloService"><soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="sayHello"><soap:operation soapAction="" style="document"/><wsdl:input name="sayHello"><soap:body use="literal"/></wsdl:input><wsdl:output name="sayHelloResponse"><soap:body use="literal"/></wsdl:output></wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloServiceImplService"><wsdl:port binding="tns:HelloServiceImplServiceSoapBinding" name="HelloServiceImplPort"><soap:address location="http://localhost:8899/ws/hello"/></wsdl:port>
</wsdl:service>
</wsdl:definitions>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VI/VIM】基本操作备忘录

简介 新建/打开文件 工作模式 常用命令 移动命令 文本选中 撤销、删除 复制粘贴 替换 缩排 查找 替换 插入 分屏 练习

【动态规划】C++简单多状态dp问题(打家劫舍、粉刷房子、买卖股票的最佳时机...)

文章目录 前言1. 前言 - 理解动态规划算法2. 关于 简单多状态的dp问题2.5 例题按摩师/打家劫舍 3. 算法题3.1_打家劫舍II3.2_删除并获得点数3.3_粉刷房子3.4_买卖股票的最佳时机含冷冻期3.5_买卖股票的最佳时机含手续费3.6_买卖股票的最佳时机III3.7_买卖股票的最佳时机IV 前言…

交换机的种类有哪些?主要都具有哪些作用?

在当今数字化时代&#xff0c;网络已经成为我们生活和工作中不可或缺的一部分。无论是家庭网络还是企业网络&#xff0c;都需要有效的网络设备来实现数据通信和资源共享。而网络交换机作为一种重要的网络设备&#xff0c;扮演着连接和管理网络设备的关键角色。本文将探讨交换机…

开源贡献代码之​探索一下CPython

探索一下Cython 本篇文章将会围绕最近给Apache提的一个feature为背景&#xff0c;展开讲讲CPython遇到的问题&#xff0c;以及尝试自己从0写一个库出来&#xff0c;代码也已经放星球了&#xff0c;感兴趣的同学可以去下载学习。 0.背景 最近在给apache arrow提的一个feature因为…

《TinyLlama: An Open-Source Small Language Model》全文翻译

【Title】 TinyLlama&#xff1a;开源小语言模型 【Abstract】 我们推出了 TinyLlama&#xff0c;这是一个紧凑的 1.1B 语言模型&#xff0c;在大约 1 万亿个令牌上进行了大约 3 个时期的预训练。 TinyLlama 基于 Llama 2&#xff08;Touvron 等人&#xff0c;2023b&#xff…

VUE项目使用.env配置多种环境以及如何加载环境

第一步&#xff0c;创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量&#xff0c;例如&#xff1a; .env —— 所有模式共用.env.local —— 所有模式共用&#xff0c;但不会被 git 提交&…

C语言 三目运算符

C语言 逻辑分支语句中 还有一种 三目运算符 我们编写代码如下 #include <stdio.h>int main() {const char* a 1 1 ? "表达式1" : "表达式2";printf("%s", a);return 0; }这里 我们根据逻辑 先定义一个a 然后 它的值 等于一个 三目运算…

【CodeGeeX】国产的免费AI编程助手

CodeGeeX&#xff08;官网&#xff1a;https://codegeex.cn/&#xff09;是一款基于大模型的全能的智能编程助手。它可以实现代码的生成与补全、自动添加注释、代码翻译以及智能问答等功能&#xff0c;能够帮助开发者显著提高工作效率。CodeGeeX支持主流的编程语言&#xff0c;…

C++练级之路——类和对象(下)

目录 1、构造函数初始化列表 2、类型转换 3、explicit关键字 4、static成员 5、友元 友元函数 友元类 6、内部类 7、匿名对象 8、拷贝构造时的一些编译器优化 差不多结束了&#xff0c;类和对象&#xff01; 1、构造函数初始化列表 初始化列表&#xff1a;以一个冒号…

python:元组,字符串,切片

一、元组# 列表可以修改内容&#xff0c;元组可以不被修改 # 在程序内封装数据&#xff0c;不希望数据被篡改&#xff0c;所以使用元组 # 语法&#xff1a; 不限制类型 # 定于元组的字面量&#xff1a; &#xff08;元素&#xff0c;元素&#xff0c;元素.....&#xff09; # 定…

萌新_1 环境安装(基于QQNT框架 Python Flask)

遇到问题加QQ群聊 群主在线解答 点击加入群聊【星辰开发】 一&#xff1a;安装QQ 目前为开发&#xff0c;推荐都安装到一台电脑上 直接安装到本地windows电脑&#xff0c; 优点方便开发 一键安装 Windows 用户一键安装方案 https://github.com/super1207/install_llob/rel…

LLMs——扩展数据受限的语言模型解决方案

概述 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大型语言模型的发展一直是研究的热点。这些模型通过增加参数数量和训练数据量来提升性能&#xff0c;但这种增长趋势是否会有一个极限&#xff1f;实际上&#xff0c;研究者们已经注意到&#xff0c;为了有效地…

大话设计模式-依赖倒转原则

依赖倒转原则 在大话设计模式这本书中&#xff0c;作者通过电话修电脑这个例子引入了面向对象设计的基本原则之一&#xff1a;依赖倒转原则。 概念 依赖倒转原则是面向对象设计的基本原则之一&#xff0c;它用于减少类之间的耦合&#xff0c;提高系统的灵活性和可维护性。在…

QT C++ sqlite 对多个数据库的操作

//本文描述&#xff0c;QT 对多数据库的操作。 //你可能会想&#xff0c;多数据库的操作时&#xff0c;查询语句怎么知道是哪个数据库。 //QT提供了这样一种构造函数 QSqlQuery(const QSqlDatabase &db) //指定数据库 //在QT6.2.4 MSVC2019调试通过。 //效果见下图&am…

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

prompt问题【中间不好】

问题1:longchain 关键词在中间容易被忽略掉 Found in the Middle: How Language Models Use Long Contexts Better via Plug-and-Play Positional Encoding 论文对大模型在长文本情况下的性能做了一系列实验研究&#xff0c;发现了一个有趣的“Lost in the middle”现象&#x…

贴片 AMC1200BDWVR 封装 SOIC-8 隔离放大器IC芯片

AMC1200BDWVR的应用领域相当广泛&#xff0c;主要涵盖以下几个方面&#xff1a; 工业控制&#xff1a;在工业自动化系统中&#xff0c;AMC1200BDWVR可用于精确地检测和控制电流&#xff0c;例如在电机驱动和电力转换系统中。 电源管理&#xff1a;该器件适用于各种电源系统&a…

【昇腾产品应用】英码科技EA500I基于昇腾Mind SDK实现实时人体关键点检测

在教育、体育、安防、交通、医疗等领域中&#xff0c;实时人体关键点检测应用发挥着至关重要的作用&#xff0c;比如在体育训练时&#xff0c;实时人体关键点检测可以精确、实时地捕捉运动员的动作&#xff0c;从而进行动作分析和优化&#xff1b;在安防应用场景中&#xff0c;…

Vue3:响应式数据的基本使用(ref、reactive)

一、前言 在Vue3中&#xff0c;如果数据不是响应式数据&#xff0c;当数据的值发生改变时&#xff0c;页面上的数据是不会发生改变的。因此本文主要介绍Vue3中响应式数据的使用&#xff0c;包括ref和reactive的基本使用。 二、ref 1、ref —— 创建基本类型的响应式数据 re…

Python-VBA函数之旅-globals函数

目录 一、globals函数的常见应用场景&#xff1a; 二、globals函数与locals函数对比分析&#xff1a; 1、globals函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm101…