Java WebService记

Web Services开发

==============

常用的 Web Services 框架有 Apache Axis1 、 Apache Axis2 、 Apache CXF ,而 Apache Axis1 已经逐渐被淘汰所以本文不会讨论,重点关注 Apache Axis2 及 Apache CXF 。

Apache Axis2

============

在IDEA中新建 Axis2Demo 项目后右键选择 添加框架的支持 并选中 Web Application 。

Java WebService记

Java WebService记

从Apache Axis2官网处下载 war包 进行部署,将 axis2.war 解压后把 WEB-INF 和 axis2-web目录复制到项目的 web 目录下(如下图所示)并启动Tomcat Server。

Java WebService记

Java WebService记

访问

http://localhost:8080/Axis2Demo_war_exploded/axis2-web/index.jsp 出现下图的页面表示部署成功。

Java WebService记

Java WebService记

Axis2配置

=======

在 Axis1 中的全局配置和 Servcies 的配置均在 server-config.wsdd 中进行配置,而 Axis2则将全局配置单独存放于 WEB-INF/conf/axis2.xml 中, services 的配置文件则位于 servcies。

发布服务(Publish Service)

=====================

新建一个 HelloService 类并编译为 HelloService.class 复制至 WEB-INF/pojo 目录下并重启服务。

// 不能声明package

public class HelloService {

public HelloService(){}

public String sayHello() {

return “hello”;

}

public String sayHelloToPerson(String name) {

if (name == null) {

name = “nobody”;

}

return "hello, " + name;

}

}

重启服务后再次访问

http://localhost:8080/Axis2Demo_war_exploded/services/HelloService?wsdl 即可发现新发布的服务,点击 HelloService 即可查看Axis自动为该服务生成的WSDL,其描述了如何调用服务的方法及返回内容:

Java WebService记

Java WebService记

Java WebService记

使用 SoapUI 客户端调用 HelloService 服务方法:

Java WebService记

Java WebService记

而之所以 WEB-INF/pojo 目录下的 .class 文件会自动发布为服务是因为在 axis2.xml 配置文件中的 deployer 标签中所配置的该选项。

上述的方式发布服务需要将编译后的类放置在某个具体的目录中,且不能包含 package ,而使用 *.aar 的方式则可以解决此问题。首先在Project的根目录下新建 META-INF/services.xml ,文件内容可以参考官方示例 version.aar 。

<?xml version="1.0" encoding="UTF-8"?>

一个简单的WebService

com.ws.test.services.HelloService

<messageReceiver mep=“http://www.w3.org/ns/wsdl/in-only”

class=“org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver” />

<messageReceiver mep=“http://www.w3.org/2004/08/wsdl/in-out”

class=“org.apache.axis2.rpc.receivers.RPCMessageReceiver” />

最终结构为如下所示,在项目根目录中执行 jar cvf HelloService.aar . 进行打包。

Java WebService记

Java WebService记

将打包后的文件复制至 WEB-INF/services 目录下,即可在服务列表中看到新注册的服务,或者在 Axis 后台中也可以上传包部署(因此如果应用程序的Axis后台可访问且为默认凭据即可部署恶意Service获取权限)。

Java WebService记

Java WebService记

客户端服务调用

=======

调用 Web Service 可通过代码的方式实现也可以通过WSDL构造SOAP协议调用方法,最简便的方法则是使用SoapUI,其会根据 Web Service 的WSDL生成对应方法的SOAP协议请求。

// 代码实现Web Service调用

import javax.xml.namespace.QName;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.rpc.client.RPCServiceClient;

public class WebServiceClient {

public static void main(String[] args) throws Exception {

RPCServiceClient serviceClient = new RPCServiceClient();

Options options = serviceClient.getOptions();

EndpointReference targetEPR = new EndpointReference(“http://192.168.0.105:8080/Axis2Demo_war_exploded/services/HelloService”);

options.setTo(targetEPR);

Object[] entryArgs = new Object[]{4, 2};

QName qName = new QName(“http://ws.apache.org/axis2”, “add”);

Object result = serviceClient.invokeBlocking(qName, entryArgs, new Class[]{int.class})[0];

qName = new QName(“http://ws.apache.org/axis2”, “send”);

serviceClient.invokeRobust(qName, new Object[]{“hello world!”});

}

}

Soap UI

Java WebService记

Java WebService记

Apache CXF

==========

Apache CXF是一个开源的、全功能的,容易使用的Web服务框架。CXF是两个项目的结合:由IONA技术公司开发的Celtix和由Codehaus主持的团队开发的XFire。

CXF支持的特性非常广泛,但特性主要在以下一些方面:

  • 支持的Web服务标准包括: SOAP WS-Addressing WS-Policy WS-ReliableMessaging WS-Security WS-SecurityPolicy WS-SecureConversation

  • JAS-WS API,用于Web服务开发 WSDL优先支持工具 Java优先支持

  • JAX-RS(JSR 311 1.0)API,用于RESTful Web服务开发

⬆️内容摘自Wiki百科。

发布服务

====

使用 Maven 构建项目,POM文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.example

CXFDemo

1.0-SNAPSHOT

org.apache.cxf

cxf-rt-frontend-jaxws

3.4.0

org.apache.cxf

cxf-rt-transports-http

3.4.0

org.apache.cxf

cxf-rt-transports-http-jetty

3.4.0

org.apache.cxf

cxf-rt-transports-http-jetty

3.4.0

编写一个服务接口,定义 sayHi 方法:

package org.example.services;

import javax.jws.WebService;

// 声明这是一个Ws服务接口

@WebService

public interface HelloWorld {

// 定义服务方法

String sayHi(String name);

}

编写一个服务接口的实现类:

package org.example.services;

import javax.jws.WebService;

@WebService(endpointInterface = “org.example.services.HelloWorld”, serviceName = “HelloWorld”)

public class HelloWorldImpl implements HelloWorld {

public String sayHi(String name) {

return "hi, " + name;

}

}

再编写一个发布服务的主类 Main :

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import org.example.services.HelloWorld;

import org.example.services.HelloWorldImpl;

public class Main {

最后

总的来说,面试官要是考察思路就会从你实际做过的项目入手,考察你实际编码能力,就会让你在电脑敲代码,看你用什么编辑器、插件、编码习惯等。所以我们在回答面试官问题时,有一个清晰的逻辑思路,清楚知道自己在和面试官说项目说技术时的话就好了

pl implements HelloWorld {

public String sayHi(String name) {

return "hi, " + name;

}

}

再编写一个发布服务的主类 Main :

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import org.example.services.HelloWorld;

import org.example.services.HelloWorldImpl;

public class Main {

最后

总的来说,面试官要是考察思路就会从你实际做过的项目入手,考察你实际编码能力,就会让你在电脑敲代码,看你用什么编辑器、插件、编码习惯等。所以我们在回答面试官问题时,有一个清晰的逻辑思路,清楚知道自己在和面试官说项目说技术时的话就好了

[外链图片转存中…(img-YIdcWISY-1720090990881)]

[外链图片转存中…(img-ScyT4msQ-1720090990882)]

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

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

相关文章

每天10个js面试题(一)

1.js基本数据类型&#xff1f; JavaScript 共有八种数据类型&#xff0c;分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。其中 Symbol 和 BigInt 是 ES6 中新增的数据类型 2.let、const、var的区别&#xff1f; let和const有暂时性死区&#xff0…

开源模型应用落地-LangChain高阶-智能体探究-agent类型(一)

一、前言 大模型具有非常强大的功能,可以解答疑问、撰写报告和文档、总结内容、进行翻译等各种日常工作任务。然而,大模型还可以应用于更多的场景,发挥出更强大的作用。 通过智能体,我们可以实现许多有价值的事情,比如:在日常生活中,我们能借助智能体实现智能家居的自动化…

【渗透入门】SQL注入

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 什么是sql注入sql注入举例防御方式练习靶场 什么是sql注入 SQL注入是一种网络安全漏洞&#xff0c;攻…

【Android源码】Gerrit安装

前言 如果你打开 https://android.googlesource.com/platform/manifest&#xff0c;就会发现&#xff0c;google官方管理Android源码&#xff0c;使用的是Gerrit。Android系统源码是非常大的&#xff0c;用Git肯定是不适合。对于大型项目&#xff0c;得用Gerrit&#xff0c;今…

NoSQL之Redis高可用与优化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…

二叉树的链式访问 与 二叉树专题

目录 二叉树的前、中、后序遍历求二叉树第K层节点的个数二叉树查找值为x的节点leetcode相同的树对称二叉树二叉树的前序遍历另一棵子树牛客 二叉树的遍历 二叉树的前、中、后序遍历 1.前序遍历&#xff1a;先访问根节点&#xff0c;再访问左子树&#xff0c;最后访问右子树 根…

【备忘】fastadmin 如何获取列表选中行的pk

去官方搜没搜出来&#xff0c;还得是万能的网友厉害。 //获取选中项 $(document).on("click", ".btn-selected", function () {// 获取选中项idsconsole.log(JSON.stringify(Table.api.selectedids(table)));// 获取选中项所有数据console.log(JSON.strin…

输入一个整数n,输出n的约数为质数的数?两个问题n的约数问题和n的质数问题

输入一个整数n&#xff0c;输出n的约数为质数的数&#xff1f; 一.首先解决n的质数的问题&#xff08;1&#xff09;枚举法&#xff08;2&#xff09;埃氏筛 二.解决n的质数约数问题 一.首先解决n的质数的问题 &#xff08;1&#xff09;枚举法 考虑质数的定义&#xff1a;在大…

conda中创建环境并安装tensorflow1版本

conda中创建环境并安装tensorflow1版本 一、背景二、命令三、验证一下 一、背景 最近需要使用tensorflow1版本的&#xff0c;发个记录&#xff01; 二、命令 conda create -n tf python3.6 #创建tensorflow虚拟环境 activate tf #激活环境&#xff0c;每次使用的时候都…

理解策略梯度方法:从REINFORCE到PPO

今年2月的时候&#xff0c;导师突然告诉我Ron William离世了。他算是我导师的 a life time friend&#xff0c;关系很好&#xff0c;我做毕业论文的时候&#xff0c;他还来参与了论文的答辩。Ron是一个很友善的老头&#xff0c;和他在强化学习领域的影响力比起来&#xff0c;本…

汽车信息安全--数据安全:图像脱敏

General 随着车联网的发展&#xff0c;汽车越来越智能化&#xff0c;就像是一部“装着四个轮子的手机”。 有人说&#xff0c;智能手机就如同一部窃听器&#xff0c;无论你开机或者关机&#xff0c;它都会无时不刻地监听着用户的一举一动。 可想而知&#xff0c;智能车辆上…

马工程刑法期末复习笔记重点2

马工程刑法期末复习笔记重点2

SpringBoot 参数校验

参数校验 引入springvalidation依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>参数前添加Pattern public Result registry(Pattern(regexp &qu…

Java面向对象练习(2.商品类)(2024.7.4)

商品类 package Supermarket20240704;public class Commodity {private String name;private double price;private int inventory;public Commodity(){};public Commodity(String name, double price, int inventory){this.name name;this.price price;this.inventory inv…

Java核心技术【十九】Iterator与增强for循环

Java中的Iterator与增强for循环 在Java编程中&#xff0c;迭代是处理集合元素的一种常见操作。Java提供了多种迭代集合元素的方式&#xff0c;其中最常用的两种是Iterator和增强for循环&#xff08;也称为“for-each”循环&#xff09;。本文将深入探讨这两种迭代方式的特性和…

CLAM用于弱监督WSI分析

计算病理学&#xff08;computational pathology&#xff09;下的深度学习方法需要手动注释大型 WSI 数据集&#xff0c;并且通常存在领域适应性和可解释性较差的问题。作者报告了一种可解释的弱监督深度学习方法&#xff0c;只需要WSI级标签。将该方法命名为聚类约束注意力多实…

Perl 格式化输出:提升代码可读性的技巧

引言 Perl 是一种功能强大的脚本语言&#xff0c;广泛用于文本处理、系统管理、网络编程等多个领域。在 Perl 编程中&#xff0c;代码的格式化输出不仅有助于提升代码的可读性&#xff0c;还能增强程序的用户体验。本文将详细介绍如何在 Perl 中实现代码的格式化输出。 Perl …

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 31 节&#xff09; P31《30.数据持久化-关系型数据库》 上一节中学习了使用用户首选项的方式实现数据持久化&#xff0c;但用户首…

微机原理 选择题

D C MOV、PUSH、POP、XLAT&#xff08;查表&#xff09;、IN、OUT不影响标志位 D B D C D C D B 1. (单选题, 5分)8位无符号数(字节)表示的数值范围是( ), 16位无符号数(字)表示的数值范围是( )。 A. 0~128 0~32768B. 0~255 0~655…

为什么 npm run serve 正常,npm run build 就报错:digital envelope routines::unsupported

这个错误通常与 Node.js 版本和使用的加密算法有关。让我解释一下原因和可能的解决方案&#xff1a; 错误原因 这个错误&#xff08;“error:0308010C:digital envelope routines::unsupported”&#xff09;通常发生在以下情况&#xff1a; 使用较新版本的 Node.js&#xf…