java jax-ws webservice编程,入门教程,包含服务端与客户端,编码

news2024/11/23 17:02:37

java jax-ws webservice

就是服务端程序提供接口,客户端,通过服务端提供的jar包(或者打包的类文件),通过jax-ws直接调用服务端暴露的接口来进行操作.

服务端

共三个文件

接口

package com.jaxwsdemo.serveice;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style = Style.RPC)
public interface ICalculator {
    @WebMethod
    float add(@WebParam float a, @WebParam float b);
    @WebMethod
      float minus(@WebParam float a, @WebParam float b);
    @WebMethod
      float multiply(@WebParam float a, @WebParam float b);
    @WebMethod
    float divide(@WebParam float a, @WebParam float b);
}

实现类

package com.jaxwsdemo.serveice.impl;
import com.jaxwsdemo.serveice.ICalculator;
import javax.jws.WebService;

@WebService(endpointInterface = "com.jaxwsdemo.serveice.ICalculator")
public class ICalculatorimpl implements ICalculator {
    @Override
    public float add(float a, float b) {
        System.out.println("a+b="+(a+b));
        return a + b;
    }

    @Override
    public float minus(float a, float b) {
        System.out.println("a-b="+(a-b));
        return a - b;
    }

    @Override
    public float multiply(float a, float b) {
        return a * b;
    }

    @Override
    public float divide(float a, float b) {
        return a / b;
    }
}

发布main类

package com.jaxwsdemo.main;

import com.jaxwsdemo.serveice.impl.ICalculatorimpl;

import javax.xml.ws.Endpoint;

public class mainTest {
    public static void main(String[] args) {
        System.out.println("发布开始:发布地址:http://localhost:9998/hw");
        String address="http://localhost:9998/hw";
        Endpoint.publish(address, new ICalculatorimpl());
        System.out.println("发布完成");
    }
}

运行后会显示发布的地址

此时我们通过访问:http://localhost:9998/hw?wsdl

得到wsdl

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<!--  Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e.  -->
<!--  Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e.  -->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.serveice.jaxwsdemo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://impl.serveice.jaxwsdemo.com/" name="ICalculatorimplService">
<import namespace="http://serveice.jaxwsdemo.com/" location="http://localhost:9998/hw?wsdl=1"/>
<binding xmlns:ns1="http://serveice.jaxwsdemo.com/" name="ICalculatorimplPortBinding" type="ns1:ICalculator">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
<operation name="add">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</input>
<output>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</output>
</operation>
<operation name="divide">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</input>
<output>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</output>
</operation>
<operation name="multiply">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</input>
<output>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</output>
</operation>
<operation name="minus">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</input>
<output>
<soap:body use="literal" namespace="http://serveice.jaxwsdemo.com/"/>
</output>
</operation>
</binding>
<service name="ICalculatorimplService">
<port name="ICalculatorimplPort" binding="tns:ICalculatorimplPortBinding">
<soap:address location="http://localhost:9998/hw"/>
</port>
</service>
</definitions>

此时我们服务端就算是完事了,服务端主要是提供加减乘除接口, 通过Endpoint.publish(address, new ICalculatorimpl());发布别的服务就可以调用了.

在编写服务端之前我们先导出服务端类,共于客户端使用

这里我们使用使用jdk提供的wsimport命令导出

命令:wsimport -s e:/wyc/work http://localhost:9998/hw?wsdl

可以看到导出到了指定位置

小技巧:如果服务端在对方,如何生成服务端的jar包?

通过cmd命令: wsimport -keep http://localhost:9998/hw?wsdl 

可直接生成

生成路径就是cmd打开的位置!

我们放到将导出的包放到客户端

客户端编写

完整目录

导出的实现类和接口,与在客户端写的接口结构完全不一样,一定要通过命令导出!!

导出后的接口结构:


package jaxwsdemo.serveice.impl;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Action;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.9-b130926.1035
 * Generated source version: 2.2
 *
 */
@WebService(name = "ICalculator", targetNamespace = "http://serveice.jaxwsdemo.com/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface ICalculator {


    /**
     *
     * @param arg1
     * @param arg0
     * @return
     *     returns float
     */
    @WebMethod
    @WebResult(partName = "return")
    @Action(input = "http://serveice.jaxwsdemo.com/ICalculator/addRequest", output = "http://serveice.jaxwsdemo.com/ICalculator/addResponse")
    public float add(
        @WebParam(name = "arg0", partName = "arg0")
        float arg0,
        @WebParam(name = "arg1", partName = "arg1")
        float arg1);

    /**
     *
     * @param arg1
     * @param arg0
     * @return
     *     returns float
     */
    @WebMethod
    @WebResult(partName = "return")
    @Action(input = "http://serveice.jaxwsdemo.com/ICalculator/divideRequest", output = "http://serveice.jaxwsdemo.com/ICalculator/divideResponse")
    public float divide(
        @WebParam(name = "arg0", partName = "arg0")
        float arg0,
        @WebParam(name = "arg1", partName = "arg1")
        float arg1);

    /**
     *
     * @param arg1
     * @param arg0
     * @return
     *     returns float
     */
    @WebMethod
    @WebResult(partName = "return")
    @Action(input = "http://serveice.jaxwsdemo.com/ICalculator/multiplyRequest", output = "http://serveice.jaxwsdemo.com/ICalculator/multiplyResponse")
    public float multiply(
        @WebParam(name = "arg0", partName = "arg0")
        float arg0,
        @WebParam(name = "arg1", partName = "arg1")
        float arg1);

    /**
     *
     * @param arg1
     * @param arg0
     * @return
     *     returns float
     */
    @WebMethod
    @WebResult(partName = "return")
    @Action(input = "http://serveice.jaxwsdemo.com/ICalculator/minusRequest", output = "http://serveice.jaxwsdemo.com/ICalculator/minusResponse")
    public float minus(
        @WebParam(name = "arg0", partName = "arg0")
        float arg0,
        @WebParam(name = "arg1", partName = "arg1")
        float arg1);

}

导出后的实现类结构:


package jaxwsdemo.serveice.impl;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.9-b130926.1035
 * Generated source version: 2.2
 *
 */
@WebServiceClient(name = "ICalculatorimplService", targetNamespace = "http://impl.serveice.jaxwsdemo.com/", wsdlLocation = "http://localhost:9998/hw?wsdl")
public class ICalculatorimplService
    extends Service
{

    private final static URL ICALCULATORIMPLSERVICE_WSDL_LOCATION;
    private final static WebServiceException ICALCULATORIMPLSERVICE_EXCEPTION;
    private final static QName ICALCULATORIMPLSERVICE_QNAME = new QName("http://impl.serveice.jaxwsdemo.com/", "ICalculatorimplService");

    static {
        URL url = null;
        WebServiceException e = null;
        try {
            url = new URL("http://localhost:9998/hw?wsdl");
        } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
        ICALCULATORIMPLSERVICE_WSDL_LOCATION = url;
        ICALCULATORIMPLSERVICE_EXCEPTION = e;
    }

    public ICalculatorimplService() {
        super(__getWsdlLocation(), ICALCULATORIMPLSERVICE_QNAME);
    }

    public ICalculatorimplService(WebServiceFeature... features) {
        super(__getWsdlLocation(), ICALCULATORIMPLSERVICE_QNAME, features);
    }

    public ICalculatorimplService(URL wsdlLocation) {
        super(wsdlLocation, ICALCULATORIMPLSERVICE_QNAME);
    }

    public ICalculatorimplService(URL wsdlLocation, WebServiceFeature... features) {
        super(wsdlLocation, ICALCULATORIMPLSERVICE_QNAME, features);
    }

    public ICalculatorimplService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public ICalculatorimplService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
        super(wsdlLocation, serviceName, features);
    }

    /**
     *
     * @return
     *     returns ICalculator
     */
    @WebEndpoint(name = "ICalculatorimplPort")
    public ICalculator getICalculatorimplPort() {
        return super.getPort(new QName("http://impl.serveice.jaxwsdemo.com/", "ICalculatorimplPort"), ICalculator.class);
    }

    /**
     *
     * @param features
     *     A list of {@link WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns ICalculator
     */
    @WebEndpoint(name = "ICalculatorimplPort")
    public ICalculator getICalculatorimplPort(WebServiceFeature... features) {
        return super.getPort(new QName("http://impl.serveice.jaxwsdemo.com/", "ICalculatorimplPort"), ICalculator.class, features);
    }

    private static URL __getWsdlLocation() {
        if (ICALCULATORIMPLSERVICE_EXCEPTION!= null) {
            throw ICALCULATORIMPLSERVICE_EXCEPTION;
        }
        return ICALCULATORIMPLSERVICE_WSDL_LOCATION;
    }

}

注意一定要在客户端加入服务端提供的jar包(此处jar包指的是serveice包)

import jaxwsdemo.serveice.impl.ICalculator;
import java.net.URL;
import java.net.MalformedURLException;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class CelintMain {
    public static void main(String[] args) throws MalformedURLException {
        URL url=new URL("http://localhost:9998/hw?wsdl");
        QName qname = new QName("http://impl.serveice.jaxwsdemo.com/", "ICalculatorimplService");
        Service service = Service.create(url, qname);
        ICalculator cal = service.getPort(new QName("http://impl.serveice.jaxwsdemo.com/", "ICalculatorimplPort"),ICalculator.class);
       //cal.add((float)1, (float)2);
        float rusult =  cal.minus(2, 1);
        System.out.println(rusult);
    }
}

运行截图

服务端也会有相应的输出因为我们计算时打印了计算过程

服务端此时运行窗口截图

具体注解可自行百度,此文章已粘贴所有项目代码,粘贴即用!

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

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

相关文章

【java基础】Java常见的创建对象方式

背景&#xff1a; 对于好多程序员来说&#xff0c;你问他&#xff0c;如何创建对象&#xff0c;他可能就只知道new个对象不就行了&#xff0c;但是当我们需要看一些框架的源码的时候&#xff0c;经常发现他们不是这样创建对象&#xff0c;然后回过头来&#xff0c;我们就得补充…

2023.9.18 网络层 IP 协议详解

目录 IP协议 IPv4 32位 源IP 地址 / 32位 目的IP 地址 IP 地址管理 特殊 IP 路由选择 IP协议 IPv4 32位 源IP 地址 / 32位 目的IP 地址 基本知识&#xff1a; 在 IP 报头中一般表示为 32位 二进制整数日常生活中的 IP 一般将 32位 二进制整数&#xff0c;也就是 4字节 的二…

Vue的模板语法(下)

一.事件处理 事件修饰符 Vue通过由点(.)表示的指令后缀来调用修饰符&#xff0c; .stop&#xff0c; .prevent&#xff0c;.capture&#xff0c;.self&#xff0c;.once .stop&#xff1a;阻止事件冒泡。当一个元素触发了事件&#xff0c;并且该元素包含嵌套的父元素时&#…

【大虾送书第十期】从不了解用户画像,到用画像数据赋能业务看这一本书就够了

目录 &#x1f36d;写在前面 &#x1f36d;内容简介 &#x1f36d;设计图和原型图 &#x1f36d;参考目录 &#x1f36d;文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 在大数据时代&#xff0…

小程序游戏开发和app游戏开发有什么不同呢?

小程序游戏开发和App游戏开发有一些重要的区别&#xff0c;这些区别涉及到平台、技术、发布和用户体验等方面。以下是它们之间的主要不同之处&#xff1a; 平台&#xff1a; 小程序游戏开发是为特定的小程序平台设计的&#xff0c;如微信小程序、支付宝小程序等。这些小程序通常…

Android使用Chrome浏览器进行抓包

Android使用Chrome浏览器进行抓包 这里记录一个用Android真机抓包的方法。 打开Chrome浏览器&#xff0c;打开网址&#xff1a;chrome://inspect/#devices 找到对应 App 点击 inspect&#xff0c;进行网络请求&#xff0c;就能看到抓包的数据啦 数据线连上android设备&#x…

Mybatis框架学习

什么是mybatis&#xff1f; mybatis是一款用于持久层的、轻量级的半自动化ORM框架&#xff0c;封装了所有jdbc操作以及设置查询参数和获取结果集的操作&#xff0c;支持自定义sql、存储过程和高级映射 mybatis用来干什么&#xff1f; 用于处理java和数据库的交互 使用mybat…

容器中的nginx暴露一个端口部署多个功能的网站

随着容器的应用越来越多&#xff0c;将nginx部署在容器中也是常有之事。可能事先创建容器时只暴露了一个端口给浏览器连接&#xff0c;后面又想根据添加多个应用&#xff0c;根据URL的不同来访问不同的应用。比如在暴露了主机的83端口给nginx容器的80端口&#xff0c;原来只有一…

华为云云耀云服务器L实例评测|宝塔一站式安装数据库MySQL+Redis教程

目录 前言 一、传统服务器安装数据库 1.安装MySQL 2.安装Redis 二、云耀云服务器L安装MySQL 1.云耀云服务器L实例购买 2.远程登录并重置密码 3.云耀云服务器L初始化宝塔面板 4.宝塔面板安装数据库 5.MySQL第三方登录 三、云耀云服务器L安装Redis 1.宝塔面板安装Redis 2.Redis密…

JumpServer未授权访问漏洞 CVE-2023-42442

JumpServer未授权访问漏洞 CVE-2023-42442 一、漏洞描述二、漏洞影响三、网络测绘四、漏洞复现poc通过burp发送请求包小龙POC检测 五、修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接…

【正则表达式】

正则表达式 1 本节目标2 正则表达式概述2.1 什么是正则表达式2.2 正则表达式的特点 3 正则表达式在JavaScript中的使用3.1 创建正则表达式3.2 测试正则表达式test 4 正则表达式中的特殊字符4.1 正则表达式的组成4.2 边界符4.3 字符类4.4 量词符4.5 括号总结4.6 预定义类 5 正则…

如何分清PMP和NPDP?一篇文足以

先简单介绍一下两个证书&#xff1a; PMP&#xff1a;项目管理证书&#xff0c;项目经理 英文全称是Project Management Professional&#xff0c;中文全称叫做项目管理专业人士资格认证。 它是由美国项目管理协会&#xff08;PMI&#xff09;在全球范围内推出的针对项目经理…

mojo安装

docker安装mojo 官网 https://developer.modular.com/login 很奇怪登录页面不显示 类似于网站劫持 docker 安装mojo带jupyterlab的方式 https://hub.docker.com/r/lmq886/mojojupyterlab 拉取镜像 docker pull lmq886/mojojupyterlab docker pull lmq886/mojojupyterlab:1.2 启…

没有任何销售经验怎么管理销售团队?

本文将为大家讲解&#xff1a;1、什么是销售管理&#xff1f;2、销售管理的流程是什么&#xff1f;3、如何进行销售管理&#xff1f;4、crm客户管理系统对于销售管理有什么样的作用&#xff1f;5、2023年最全crm客户管理系统推荐。 一、什么是销售管理&#xff1f; 根据美国营…

【数据结构与算法】一文带你学透——算法概述

前言 本期我们所要学习的内容是数据结构与算法中的算法的相关内容&#xff0c;通过上期我们学的数据结构想必大家都会了吧&#xff0c;在学习完毕之后算法&#xff0c;我想你已经可以编写出比较优秀的代码了&#xff0c;著名计算机科学家沃思曾提出一个公式 程序数据结构算法。…

18.备忘录模式(Memento)

意图&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;这样就可以在以后将该对象恢复到原先保存的状态。 上下文&#xff1a;某些对象的状态在转换过程中&#xff0c;可能由于某种需要&#xff0c;要求…

Python的电机控制模拟程序

一个带有EPICS支持的虚拟电机控制器。 1&#xff09;Status类&#xff1a;其实例化对象代表一个电机轴的状态。 #!/usr/bin/env python Status类代表一个电机处于的状态&#xff1a;1、DIRECTION状态位&#xff1a;设置运动方向2、DONE_MOVING状态字&#xff1a;置位表示结束…

数据结构与算法的力量:编写更高效的代码

文章目录 为什么数据结构和算法重要&#xff1f;1. 提高性能2. 节省资源3. 解决复杂问题4. 改进代码质量 常见数据结构和算法数据结构1. 数组&#xff08;Array&#xff09;2. 链表&#xff08;Linked List&#xff09;3. 栈&#xff08;Stack&#xff09;4. 队列&#xff08;Q…

哈希(hash)——【C++实现】

本章gitee代码仓库&#xff1a;Hash 文章目录 &#x1f490;1. 哈希概念&#x1f33b;2. 哈希冲突&#x1f33c;3. 哈希函数&#x1f338;3.1 哈希函数设计原则&#x1f338;3.2 常见哈希函数 &#x1fab4;4. 哈希冲突解决方案&#x1f331;4.1 闭散列——开放定址法&#x1f…

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求&#xff0c;需要下载图片到本地&#xff0c;我的三个测试机&#xff08;荣耀Android10&#xff0c;红米 11 和小米Android 13都没有问题&#xff09;。 然后&#xff0c;主角登场了&#xff0c;测试的三星Android 13 死活拉不起存储权限弹窗。 …