文档章节

【WebService 系列二 使用JAX-WS开发示例程序】

HansonReal
 HansonReal
发布于 10/23 14:57
字数 1202
阅读 12
收藏 0

1、服务端代码

1.1、编写SEI

SEI即(Service Endpoint Interface)SEI在ws中称为portType,在java中称为接口

package jaxws.server;
/**
 * @className: HelloService
 * @description: jaxws服务端口
 * @author: hanson
 * @version: V1.0
*/
public interface HelloService {
/**
  * 问候
  * @param name 名称
  * @return 问候语
  */
 String sayHello(String name);
}

1.2、编写SEI实现类

package jaxws.server.impl;
import jaxws.server.HelloService;
import javax.jws.WebService;
/**
  * @className: HelloServiceImpl
  * @description: SEI实现类
  * @author: HanSon.Q
  * @version: V1.0
  */
@WebService
public class HelloServiceImpl implements HelloService {
/**
 * 问候
 * @param name 名称
 * @return 问候语
 */
 @Override
 public String sayHello(String name) {
      return "你好哇! " + name;
 }
}

使用了一个类级别的注解@Webservice,使用了这个注解的类、接口、枚举、注解的所有方法都将会公开为Web服务,如果想屏蔽SEI中的某个方法,可以使用方法注解@WebMethod(exclude=true).

1.3、使用Endpoint发布服务

package jaxws.server;
import jaxws.server.impl.HelloServiceImpl;
import jaxws.server.impl.HelloServiceSoap12Impl;
import javax.xml.ws.Endpoint;

/**
 * @className: JaxwsServerApp
 * @description: 主程序, 用于发布服务
 * @author: HanSon.Q
 * @date: 2018/2/6 11:33
 * @version:V1.0
 */
public class JaxwsServerApp {
    public static void main(String[] args) {
        HelloService helloService = new HelloServiceImpl();
        Endpoint.publish("http://127.0.0.1:1234/hello", helloService);
    }
}

点击运行,没有发生错误说明服务发布成功

2、查看WSDL

发布程序启动成功之后,通过浏览器访问 http://127.0.0.1:1234/hello?wsdl 来验证web服务的正确性。 通过WSDL可以知道如何调用web服务!

2.1、WSDL明细

<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.server.jaxws/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://impl.server.jaxws/"
name="HelloServiceImplService">
	<types>
		<xsd:schema>
			<xsd:import namespace="http://impl.server.jaxws/" schemaLocation="http://127.0.0.1:1234/hello?xsd=1"/>
		</xsd:schema>
	</types>
	<message name="sayHello">
		<part name="parameters" element="tns:sayHello"/>
	</message>
	<message name="sayHelloResponse">
		<part name="parameters" element="tns:sayHelloResponse"/>
	</message>
	<portType name="HelloServiceImpl">
		<operation name="sayHello">
		<input wsam:Action="http://impl.server.jaxws/HelloServiceImpl/sayHelloRequest" message="tns:sayHello"/>
		<output wsam:Action="http://impl.server.jaxws/HelloServiceImpl/sayHelloResponse" message="tns:sayHelloResponse"/>
	</operation>
</portType>
	<binding name="HelloServiceImplPortBinding" type="tns:HelloServiceImpl">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
		<operation name="sayHello">
			<soap:operation soapAction=""/>
			<input>
				<soap:body use="literal"/>
			</input>
			<output>
				<soap:body use="literal"/>
			</output>
		</operation>
	</binding>
	<service name="HelloServiceImplService">
		<port name="HelloServiceImplPort" binding="tns:HelloServiceImplPortBinding">
			<soap:address location="http://127.0.0.1:1234/hello"/>
		</port>
	</service>
</definitions>

3、利用wsimport.exe生成客户端代码

wsimport是JDK自带的ws客户端工具,它可以根据wsdl生成客户端调用代码(java),不用考虑服务端开发语言。

3.1、常用使用参数介绍

  • -keep:是否生成java源文件
  • -d:指定.class文件的输出目录
  • -s:指定.java文件的输出目录
  • -p:定义生成类的包名,不定义的话有默认包名
  • -verbose:在控制台显示输出信息
  • -b:指定jaxws/jaxb绑定文件或额外的schemas
  • -extension:使用扩展来支持SOAP1.2

wsimport.exe 在%JAVA_HOME%\bin目录下面

3.2、使用示例

首先在d盘下创建temp目录并在此目录下创建s文件夹和d文件夹分别用来存储.java文件和.class文件。 然后使用下面的命令回车执行

E:\>wsimport -keep -d D:\temp\d -s D:\temp\s -p jaxws.client -verbose http://127.0.0.1:1234/hello?wsdl

3.3、将生成的客户端代码拷贝到工程中

3.4、编写客户端代码

3.4.1、基于wsimport生成客户端代码方式
package jaxws.client.app;

import jaxws.client.HelloServiceImpl;
import jaxws.client.HelloServiceImplService;

/**
 * @className: JaxwsClientApp
 * @description: 客户端
 * @author: HanSon.Q
 * @version: V1.0
 */
public class JaxwsClientApp {
    public static void main(String[] args) {
        //1、创建服务视图
        HelloServiceImplService helloServiceImplService = new HelloServiceImplService();
        //2、通过服务视图得到服务端点(SEI)
        HelloServiceImpl helloServiceImplPort = helloServiceImplService.getPort(HelloServiceImpl.class);
        //3、调用服务方法
        String result = helloServiceImplPort.sayHello("程序猿");
        System.out.println(result);
    }
}

运行结果

你好哇! 程序猿
3.4.2、基于Service类
package jaxws.client.app;

import jaxws.client.HelloServiceImpl;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @className: SimpleObjectAccessProtocolClientApp
 * @description: SOAP客户端
 * @author: HanSon.Q
 * @date: 2018/2/6 14:23
 * @version: V1.0
 */
public class SimpleObjectAccessProtocolClientApp {
    public static void main(String[] args) throws MalformedURLException {
        //1、定义url,参数为wsdl地址
        URL url = new URL("http://127.0.0.1:1234/hello?wsdl");
        //2、定义qname,第一个参数是命名空间,第二个参数名称是wsdl里边的服务名
        QName qName = new QName("http://impl.server.jaxws/", "HelloServiceImplService");
        //3、创建服务视图
        Service service = Service.create(url,qName);
        //4、通过服务视图得到服务端点
        HelloServiceImpl helloService = service.getPort(HelloServiceImpl.class);
        //5、调用web服务
        String result = helloService.sayHello("Python");
        System.out.println(result);
    }
}

运行结果

你好哇! Python
3.4.3、对比两种客户端方式
  • wsimport工具生成的客户端代码无法指定服务地址,使用生成的服务视图类获取服务端点实例
  • service调用Webservice可以指定webservice的地址,只需要服务端点的接口即可获取服务端点实例

4、WebService小结

  • 优点
    • 采用xml支持跨平台远程调用
    • 基于http的soap协议,可跨越防火墙
    • 支持面向对象开发
    • 有利于软件和数据重用,实现松耦合
  • 缺点
    • 由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高

© 著作权归作者所有

共有 人打赏支持
HansonReal

HansonReal

粉丝 19
博文 15
码字总数 11876
作品 0
无锡
程序员
私信 提问
【WebService 系列一 WebService概述】

以下部分内容来自于互联网 1、什么是WebService WebService即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。 采用标准的SOAP(Simple Object Access Pr...

HansonReal
10/08
0
0
使用cxf发布webservice总结

一、概念 1、什么是webservice Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分...

漂泊者及其影子
2014/08/21
0
0
基于SOA 思想下的WebService实战资料分享

跟大家分享基于SOA 思想下的WebService实战(电子商务需求,分析,架构全涉及,百万数据优化) 课程讲解内容涵盖: 第1章 CXF框架快速起步(2课时) Webservice技术规则 Java-WebService技术规范...

abcfhl
2013/06/24
1K
7
jaxws-webservice编程(第一个记录)

随着近几年来,SOA,EAI等架构体系的日渐成熟,Webservice越来越炽手可热,尤其是在企业做异质平台整合时成为了首选的技术。 Java的Webservice技术更是层出不穷,比较流行的有:Axis2,Sprin...

heroShane
2014/02/28
0
0
使用 Apache CXF 实现 Web Service 详解

1.Web service的概念 什么是WebService呢?从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web调用来实现某个功...

核桃白果
2013/08/08
0
10

没有更多内容

加载失败,请刷新页面

加载更多

day150-2018-11-17-英语流利阅读-待学习

歪果仁也疯狂:海外版抖音的征途 毛西 2018-11-17 1.今日导读 海外版抖音 TikTok 于 2017 年 5 月上线海外,至今覆盖全球 150 多个国家和地区,月活跃用户数已突破 5 亿。然而,“出海”的抖...

飞鱼说编程
今天
4
0
分布式学习最佳实践:从分布式系统的特征开始(附思维导图)

什么是分布式系统 回到顶部   分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法...

dragon_tech
今天
4
0
TOKEN设计

TOKEN设计 Api_Token 首先需要知道API是什么? API(Application Programming Interface)即应用程序接口。你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接口。而我们在...

DrChenXX
今天
3
0
浅谈“李氏代换”——从纪念金庸和斯坦李说起

李氏代换(LSP)简介 李氏代换是软件设计的一个原则,又名依赖倒转原则或依赖倒置原则,其衍生原则有接口分离原则等。该原则由Barbara Liskov于1988年提出。 该原则指出,程序中高级别的元素...

SamYjy
今天
33
0
JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部