文档章节

使用JDK自带的WebService

摆渡者
 摆渡者
发布于 2015/08/24 18:22
字数 1137
阅读 928
收藏 21
点赞 1
评论 0

WebService是个好东西,话不多说,干净利落

服务器端

来看下服务器端的结构:

先定义一个接口,用于暴露:

package com.abc.webservice;
/**
 * 对外暴露的接口。
 */
public interface IWebService {
    public String hello(String who);
}

再定义这个接口的实现类:

package com.abc.webservice.impl;

import javax.jws.WebService;
import com.abc.webservice.IWebService;

/**
 * wsdl:portType: MyService
 * wsdl:service: MyWebService
 */
@WebService(name="MyService",
            serviceName="MyWebService",
            targetNamespace="http://www.abc.com")
public class WebServiceImpl implements IWebService {
    @Override
    public String hello(String who) {
        return "Hello " + who + "!";
    }
}

注意这里的name,它表示

The name of the Web Service. Used as the name of the wsdl:portType when mapped to WSDL 1.1.

serviceName,它表示

The service name of the Web Service. Used as the name of the wsdl:service when mapped to WSDL 1.1. 

targetNamespace,就是你为Java客户端生成的代码的包名啦,生成的包名会自动反过来写,比如上面的是www.abc.com,生成的包名则会为package com.abc.* 。

最后将WebService发布出去:

package com.abc.webservice;

import javax.xml.ws.Endpoint;
import com.abc.webservice.impl.WebServiceImpl;

/**
 * 发布WebService
 */
public class Publisher {
    public static void main(String[] args) {
        System.out.println("Start publish service");
        Endpoint.publish("http://localhost:8080/MyService", new WebServiceImpl());
        System.out.println("End publish service");
    }
}

这之后,可以打开浏览器,输入刚刚发布的URL:http://localhost:8080/MyService,去看看效果了:

点击上图中的超链接,可以看到生成的wsdl,以下是生成的wsdl:

<?xml version="1.0" encoding="UTF-8"?>
<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://www.abc.com" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns="http://schemas.xmlsoap.org/wsdl/" 
	targetNamespace="http://www.abc.com"
	name="MyWebService">
	<types>
		<xsd:schema>
			<xsd:import namespace="http://www.abc.com"
				schemaLocation="http://localhost:8080/MyService?xsd=1" />
		</xsd:schema>
	</types>
	<message name="hello">
		<part name="parameters" element="tns:hello" />
	</message>
	<message name="helloResponse">
		<part name="parameters" element="tns:helloResponse" />
	</message>
	<portType name="MyService">
		<operation name="hello">
			<input wsam:Action="http://www.abc.com/MyService/helloRequest"
				message="tns:hello" />
			<output wsam:Action="http://www.abc.com/MyService/helloResponse"
				message="tns:helloResponse" />
		</operation>
	</portType>
	<binding name="MyServicePortBinding" type="tns:MyService">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
			style="document" />
		<operation name="hello">
			<soap:operation soapAction="" />
			<input>
				<soap:body use="literal" />
			</input>
			<output>
				<soap:body use="literal" />
			</output>
		</operation>
	</binding>
	<service name="MyWebService">
		<port name="MyServicePort" binding="tns:MyServicePortBinding">
			<soap:address location="http://localhost:8080/MyService" />
		</port>
	</service>
</definitions>

看不懂没关系啦,这是WSDL,属于另一个范畴了,需要了解的朋友可以去搜一搜相关的资料。这里只是想说明如何使用JDK自带的WebService啦。

Java客户端

当然,WebServices可以被Java客户端调用,也可以被非Java语言的程序调用,这里我们只看Java客户端是如何调用的。

新建一个Poject,用于模拟在另一台机器上的客户端,并打开命令行:

>cd D:\Workspace\WebServiceClient\src

使用JDK自带的wsimport命令,生成Java客户端(注意中间有个点,表示当前目录):

>wsimport -keep . http://localhost:8080/MyService?wsdl

这句话表示生成客户端代码,保存在当前文件夹下。

会生成以下结构的客户端代码(图中选中的部分,那个webservice包是自己建的),刚刚有提到生成的Java客户端代码会放在com.abc包下

至于生成的这些类里面是什么东西,你们自己去看啦。

然后编写客户端代码(com.abc.webservice.WebServiceClient.java):

package com.abc.webservice;

import com.abc.MyWebService;

public class WebServiceClient {
    public static void main(String[] args) {
        MyWebService myWebService = new MyWebService();
        // 注意下面这句
        MyService myService = myWebService.getMyServiePort();
        System.out.println(myService.hello("Alvis"));
    }
}

这里的MyWebService类就是wsimport命令根据WebService的WSDL生成的类啦。下面是WSDL中的一段:

<service name="MyWebService">
	<port name="MyServicePort" binding="tns:MyServicePortBinding">
		<soap:address location="http://localhost:8080/MyService" />
	</port>
</service>

从WSDL中可以看出,有个<service>的name为MyWebService,里面包含了一个<port>,因此代码中的

myWebService.getMyServicePort();

这句话得到的实际上是得到了MyService这个类的实例了,这个类其实是远端WebService实现类的代理对象。可以看看这个生成的MyWebService类中这个方法的定义:

@WebEndpoint(name = "MyServicePort")
public MyService getMyServicePort() {
    return super.getPort(new QName("http://www.abc.com", "MyServicePort"), MyService.class);
}

得到这个MyService的实例后,就可以使用该实例调用远程端的方法啦:

myService.hello("Alvis")

咱们再来看看MyService类中都有哪些东东:

package com.abc;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.Action;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2.4-b01
 * Generated source version: 2.2
 */
@WebService(name = "MyService", targetNamespace = "http://www.abc.com")
@XmlSeeAlso({
    ObjectFactory.class
})
public interface MyService {
    /**
     * @param arg0
     * @return
     *     returns java.lang.String
     */
    @WebMethod
    @WebResult(targetNamespace = "")
    @RequestWrapper(localName = "hello", 
        targetNamespace = "http://www.abc.com", className = "com.abc.Hello")
    @ResponseWrapper(localName = "helloResponse", 
        targetNamespace = "http://www.abc.com", className = "com.abc.HelloResponse")
    @Action(input = "http://www.abc.com/MyService/helloRequest", 
        output = "http://www.abc.com/MyService/helloResponse")
    public String hello(
        @WebParam(name = "arg0", targetNamespace = "")
        String arg0);
}

可以看到,MyService是一个接口,因为真正的实现在远端。其实里面就一个方法,就是我们在远端定义的hello啦。

运行客户端代码即可:


这里是项目源代码,供需要的朋友参考。

© 著作权归作者所有

共有 人打赏支持
摆渡者
粉丝 318
博文 171
码字总数 205794
作品 0
浦东
程序员
传统webService服务端和客户端开发(第一种方法)

服务端:(作为服务端,怎么将自己的应用程序发布成一个webservice,让别人调用) 发布服务: //java jdk 提供一个自带的类可以将java 应用程序发布成webservice /** * 1,提供服务对外的访问地...

chenruibing
2015/06/09
0
0
Webservice服务器端怎么在Maven项目中发布?

我用JDK开发了一个服务,需要在Maven项目上发布,由于我没有使用其他的第三方开发,而是使用的JDK自带的类开发的,现在都是用CXF框架或者axis2进行集成,我想了解下有没有的方式可以集成,然...

Mr_Grizzly
2016/12/21
276
1
使用idea和wsdl生成java代码

创建一个简单的java helloworld项目 选择next: 选择java helloworld project next 填写project name finish 2. 创建好项目后 选择项目 右键->webservice->Generate 生成代码配置,填写wsdl路...

Simeone
2015/07/22
0
1
WebService教程详解(一)

Web Services 可以将应用程序转换为网络应用程序。 通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。 Web Services 可以被其他应用程序使用。 通过 Web Services...

snowing1990
2016/06/29
13
0
webservice之通过wsdl文件生成客户端

通过前面我们了解的内容,我们来简单的编写一个webservice的实例 环境:eclipse+jdk1.6 那么,我们如何用java发布一个webservice服务呢? 1)用jdk1.6以后的版本发布; (2)与Web服务相关的类,...

monster_nian
2016/01/14
2.4K
0
使用jdk6.0自带的webservice

最近使用jdk6.0自带的webservice,就不用载入第三方jar包了,部署方式都是在main方法中使用endpoint.publish来发布的,web服务器都不用。现在我想部署在Tomcat下,网上资料都是需要引入http:...

hyanqing
2012/07/11
569
2
使用jdk6.0自带的webservice

最近使用jdk6.0自带的webservice,就不用载入第三方jar包了,部署方式都是在main方法中使用endpoint.publish来发布的,web服务器都不用。现在我想部署在Tomcat下,网上资料都是需要引入http:...

hyanqing
2012/07/11
246
0
认识一下WebService应用的简单开发

在开发中,不免遇到两个不同系统交互的问题,比如数据信息同步、数据信息获取等,解决问题的途径有多种,今天带大家认识一下 WebService,看看它在实际应用中的处理。 一、什么是WebService ...

海岸线的曙光
07/09
0
0
webService简单开发步骤

----------------------------服务端---------cxf框架------------------------------------------------ 导入jar包 写一个webservice接口 @WebService public interface WebService01 { } ......

李永china
2016/04/27
86
0
关于两个jar包中存在包名和类名都完全相同的jar包冲突问题

关于两个jar包中存在包名和类名都完全相同的jar包冲突问题 标签: jar包包名和类名全相同冲突 最近弄webservice,我使用的jdk自带的wsimport工具来生成客户端代码,发现生成的代码具有编译错...

writeademo
2016/11/28
160
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
4
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
165
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部