当前位置: 首页 > news >正文

WebService简单入门

1. JAX-WS发布WebService

创建web工程
创建simple包,和server、client两个子包。正常情况下server和client应该是两个项目,这里我们只是演示效果,所以简化写到一个项目中:

1.1 创建服务类Server

package simple.server;import javax.jws.WebService;
import javax.xml.ws.Endpoint;//这里要加上WebService注解
@WebService
public class SimpleServer {//要发布出去的方法public String sayHello() {return "hello world";}//要发布出去的方法public String speak(@WebParam(name = "word") String word) {return word + ":webservice";}//使用main方法发布出去public static void main(String[] args) {//第一个参数是地址,localhost是本机,//9001是端口,端口可以是任意一个未占用的端口//SimpleService是自己起的服务名,任意//第二个参数是要发布的这个类的对象Endpoint.publish("http://localhost:9001/SimpleService", new SimpleServer());System.out.println("Publish Success~");//看到这个输出代表发布成功了}
}

运行main方法后在浏览器中输入
http://localhost:9001/SimpleService?wsdl
可以看到服务信息:
在这里插入图片描述

Wsdl文档从下往上读
Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML
Schema中的类型系统)。(入参和出参的数据类型)
Message -通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。
Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。
PortType -对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)。
Binding - 特定服务访问点与具体服务类的绑定(不看内容,看关系)。 Port - 定义为webservice单个服务访问点。
Service-相关服务访问点的集合。
访问上面的schemaLocation="http://localhost:9001/SimpleService?xsd=1"网址,可以看到具体方法的描述信息
在这里插入图片描述

如果要使用web方式发布这个webservice,只需要写一个servlet,并在tomcat启动时就加载这个servlet,在servlet的int方法中发布webservice。
如:

package simple.server;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.xml.ws.Endpoint;public class PublishServlet extends HttpServlet{@Overridepublic void init(ServletConfig servletConfig) throws ServletException {super.init(servletConfig);//发布webserviceEndpoint.publish("http://localhost:9001/SimpleService", new SimpleServer());System.out.println("Publish Success~");//看到这个输出代表发布成功了}
}

web.xml中配置:

<servlet><servlet-name>PublishServlet</servlet-name><servlet-class>simple.server.PublishServlet</servlet-class><load-on-startup>1</load-on-startup><!--启动就加载-->
</servlet>
<servlet-mapping><servlet-name>PublishServlet</servlet-name><url-pattern>/servlet/publish</url-pattern>
</servlet-mapping>

需要servlet的jar包

<!--servlet依赖jar包-->
<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version>
</dependency>

1.2 创建客户端

使用jdk自带命令调用WebService

在这里插入图片描述

请求webservice会在本地生成类
wsimport 是请求webservice
-encoding utf-8 指定生成的java文件编码格式为utf-8
-s 后面是文件存放的工程路径
-p 是生成的java文件存放的包名
-keep 后面接的是1.1中发布出去的服务地址
运行成功后,工程中会多出几个类:
在这里插入图片描述

创建测试客户端类MySimpleClient

package simple.client;import org.junit.Test;import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class MySimpleClient {@Testpublic void testJdkMethod() {//<service name="SimpleServerService">//   <port name="SimpleServerPort" binding="tns:SimpleServerPortBinding">//     <soap:address location="http://localhost:9001/SimpleService"/>//   </port>// </service>//这个是xml文件中的service-name// <service name="SimpleServerService">SimpleServerService simpleServerService = new SimpleServerService();//这个是<port name="SimpleServerPort"SimpleServer simpleServer = simpleServerService.getSimpleServerPort();System.out.println(simpleServer.sayHello());}
}

通过jdk生成的SimpleServer,可以调用相应的方法,实际上返回响应的是服务器,但执行的时候就像调用自己写的类一样。可以清楚的看到方法和参数。
另一种调用的方式,直接使用java方法,不生成类:
新建一个other包,存放如下代码:

package simple.other;import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;//对应xml文件
//<definitions targetNamespace="http://server.simple/" name="SimpleServerService">
@WebService(name = "SimpleServerService", targetNamespace = "http://server.simple/")
@XmlSeeAlso({})
public interface MySimpleClient {@WebMethod@RequestWrapper(localName = "sayHello")@ResponseWrapper(localName = "sayHelloResponse")public String sayHello();@WebMethod@RequestWrapper(localName = "speak")@ResponseWrapper(localName = "speakResponse")public String speak(@WebParam(name = "word")String word);
}

测试代码:

package simple.other;import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;public class OtherTest {public static void main(String[] args) throws Exception {URL wsdlUrl = new URL("http://localhost:9001/SimpleService?wsdl");// targetNamespace="http://server.simple/" name="SimpleServerService"Service s = Service.create(wsdlUrl,new QName("http://server.simple/","SimpleServerService"));MySimpleClient client = s.getPort(new QName("http://server.simple/","SimpleServerPort"), MySimpleClient.class);System.out.println(client.sayHello());System.out.println(client.speak("123"));}
}

2. cxf发布WebService

JAX-WS是一种规范,CXF是他的实现。CXF可以不必关心服务端的实现方式。
为了简化代码,我们把服务端和客户端写在一个工程里,正常应该写在两个工程

2.1 发布服务

新建web工程,导入jar包:

<dependencies><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http-jetty</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.apache.cxf.karaf</groupId><artifactId>apache-cxf</artifactId><version>3.2.0</version></dependency><!--日志文件--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.1</version></dependency>
</dependencies>

CXF发布服务需要一个接口和一个实现类:

package server;import javax.jws.WebParam;
import javax.jws.WebService;@WebService(name = "CXF", targetNamespace = "http://server.cxf/")
public interface CxfServer {String sayHello();String speak(@WebParam(name = "word") String world);
}

实现类:

package server;public class CxfServerImpl implements CxfServer {@Overridepublic String sayHello() {return "Hello CXF";}@Overridepublic String speak(String word) {return word + "CXF";}
}

发布服务:

package server;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class CXFServerTest {public static void main(String[] args) {// 创建JaxWsServerFactoryBean对象JaxWsServerFactoryBean serverFactoryBean = new JaxWsServerFactoryBean();// 设置服务端地址serverFactoryBean.setAddress("http://127.0.0.1:9999/cxf");// 设置服务接口serverFactoryBean.setServiceClass(CxfServer.class);// 设置实现类对象serverFactoryBean.setServiceBean(new CxfServerImpl());// 发布服务serverFactoryBean.create();System.out.println("发布成功");}
}

浏览器中访问:http://127.0.0.1:9999/cxf?wsdl
在这里插入图片描述

2.2 调用服务

package client;import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;public class CxfClientTest {public static void main(String[] args) throws Exception {JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();Client client = clientFactory.createClient("http://127.0.0.1:9999/cxf?wsdl");//直接调用方法,不用关心服务端是怎么实现的Object[] result = client.invoke("sayHello");System.out.println(result[0]);Object[] result2 = client.invoke("speak", "123");System.out.println(result2[0]);}
}

2.3 Spring与CXF集成

引入spring的jar

<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.11.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.11.RELEASE</version>
</dependency>

spring-cxf.xml配置

<?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:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--发布服务implementor是接口实现类,address在访问的时候加载路径里--><jaxws:endpoint id="cxfDemo" implementor="server.CxfServerImpl" address="/cxf"/>
</beans>

web.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>CXFServlet</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-cxf.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

使用spring发布的时候,在接口实现类上加上注解,保证发布出去的targetNamespace一致:

@WebService(name = "CXF", targetNamespace = "http://server.cxf/")
public class CxfServerImpl implements CxfServer {

浏览器中访问:http://127.0.0.1:8080/services/cxf?wsdl
在这里插入图片描述

测试方法与2.2中相同,更换访问地址即可。

相关文章:

WebService简单入门

1. JAX-WS发布WebService 创建web工程 创建simple包&#xff0c;和server、client两个子包。正常情况下server和client应该是两个项目&#xff0c;这里我们只是演示效果&#xff0c;所以简化写到一个项目中&#xff1a; 1.1 创建服务类Server package simple.server;import ja…...

「Vue面试题」vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

文章目录一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结参考文章一、是什么 权限是对特定资源的访问许可&#xff0c;所谓权限控制&#xff0c;也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权&#xff0c;…...

Docker部署springcloud项目(清晰明了)

概述 最近在想做个cloud项目,gitee上找了个模板项目&#xff0c;后端使用到 Nacos、Gateway、Security等技术&#xff0c;需要到 Docker 容器部署&#xff0c;在此总结一下&#xff0c;若有不足之处&#xff0c;望大佬们可以指出。 什么是 Docker Docker 使用 Google 公司推…...

搭建SFTP服务安全共享文件,实现在外远程访问「内网穿透」

文章目录1.前言2.本地SFTP服务器搭建2.1.SFTP软件的下载和安装2.2.配置SFTP站点2.3.Cpolar下载和安装3.SFTP服务器的发布3.1.Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言 现在的网络发达&#xff0c;个人电脑容量快速上升&#xff0c;想要保存的数据资料也越…...

ChatGPT优化Python代码的小技巧

使用 chatGPT 优化代码并降低运行时的云成本 许多开发人员说“过早的优化是万恶之源”。 这句话的来源归功于Donald Knuth。在他的书《计算机编程的艺术》中&#xff0c;他写道&#xff1a; “真正的问题是&#xff0c;程序员在错误的时间和错误的地方花费了太多时间来担心效率…...

Stm32-使用TB6612驱动电机及编码器测速

这里写目录标题起因一、电机及编码器的参数二、硬件三、接线四、驱动电机1、TB6612电机驱动2、定时器的PWM模式驱动电机五、编码器测速1、定时器的编码器接口模式2、定时器编码器模式测速的原理3、编码器模式的配置4、编码器模式相关代码5、测速方法六、相关问题以及解答1、编码…...

【JS】常用js方法

1、判断是否是数组、字符串等方法a instanceof ba是你需要判断的数据b是判断的类型//直接判断原型 var a [1,5,8] var b 123456console.log(a instanceof Array)//true console.log(a instanceof String)//falseconsole.log(b instanceof String)//true2、分割字符串a.split(…...

Android---动态权限申请

目录 权限分类 动态权限核心函数 简易实现案例 完整代码 Google 在 Android 6.0 开始引入了权限申请机制&#xff0c;将所有权限分成了正常权限和危险权限。App 每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。 权限分类 系统权限分为两类&#xff1a;正常…...

【Linux】环境变量(基本概念 常见环境变量 测试PATH 环境变量相关命令)

文章目录环境变量基本概念常见环境变量测试PATH别的环境变量通过系统调用获取或设置环境变量环境变量相关命令export: 设置一个新的环境变量set: 显示本地定义的shell变量和环境变量unset: 清除环境变量通过代码如何获取环境变量环境变量 基本概念 环境变量(environment vari…...

安全牛+瑞数信息:《数据安全管控平台应用指南》报告共同发布

随着《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》和《关键信息基础设施安全保护条例》“三法一条例”的陆续发布&#xff0c;从国家、社会与个人已经逐步形成了加强数据安全保护的态势。 2023年1月中旬&#xff0c;工业和信息化…...

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(6)

目录 写在前面&#xff1a; 题目&#xff1a;P1683 入门 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; AC &a…...

论文解读TCPN

一、简要介绍视觉信息提取&#xff08;VIE&#xff09;近年来受到了越来越多的关注。现有的方法通常首先将光学字符识别&#xff08;OCR&#xff09;结果组织成纯文本&#xff0c;然后利用标记级实体注释作为监督来训练序列标记模型。但是&#xff0c;它花费大量的注释成本&…...

性能优化之防抖与节流

&#xff08;一&#xff09;防抖 &#xff08;1&#xff09;定义&#xff1a;单位事件内&#xff0c;频繁触发&#xff0c;只执行最后一次&#xff08;像王者荣耀的回城操作&#xff09; &#xff08;2&#xff09;使用场景&#xff1a;搜索输入框、手机号邮箱输入检测 &…...

数组模拟单链表

实现一个单链表&#xff0c;链表初始为空&#xff0c;支持三种操作&#xff1a; 向链表头插入一个数&#xff1b; 删除第 k个插入的数后面的数&#xff1b; 在第 k个插入的数后插入一个数。 现在要对该链表进行 M次操作&#xff0c;进行完所有操作后&#xff0c;从头到尾输出整…...

蓝桥杯刷题第十四天

第二题&#xff1a;不同子串题目描述本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成的串。例如&#xff0c;字符串aaab 有非空子串 a, b, aa, ab, aaa, aa…...

面试了8家软件公司测试岗位,面试题大盘点,我真的尽力了

包含的模块&#xff1a;本文分为十九个模块&#xff0c;分别是&#xff1a;软件测试 基础、liunx、MySQL、web测试、接口测试、APP测试 、管理工具、Python、性能测试、selenium、lordrunner、计算机网络、组成原理、数据结构与算法、逻辑题、人力资源需要的可以看文末获取方式…...

Activiti 工作流简介

1、什么是工作流 工作流(Workflow)&#xff0c;就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目标的实现”。 1.2、工作…...

【华为机试真题详解 Python实现】统计差异值大于相似值二元组个数【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优)…...

【C++】Google编码风格学习

Google规范线上地址&#xff1a;https://zh-google-styleguide.readthedocs.io/en/latest/ 文章目录1. 头文件2. 作用域3. 类4. 函数5. 其他C特性6. 命名约定7. 注释8. 格式1. 头文件 每个cpp/cc文件都对应一个h头文件&#xff0c;除单元测试代码和只包含main()的文件外。 所…...

JavaScript 中的Promise 函数

JavaScript 中的Promise 函数 目录JavaScript 中的Promise 函数1 创建Promise2 Promise的方法3 Promises的状态4 Promise的使用5 返回 Promise 类型6 Promise级联使用在现在的前端开发中我们常常会使用到 JavaScript Promise 函数&#xff0c;但是很多人都不能正确理解Promise …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...