欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WebService(jdk中的wsimport解析wsdl,jdk发布webservice)

程序员文章站 2022-04-28 11:59:22
...

学习webservice预备知识
(1)XML—Extensible Markup Language 扩展性标记语言
XML,用于传输格式化的数据,是Web服务的基础。
namespace-命名空间。
xmlns=“http://www.xr.com” 使用默认命名空间。
xmlns:xr=“http://www.xr.com”使用指定名称的命名空间。

(2)WSDL—WebService Description Language Web服务描述语言。
通过XML形式说明服务在什么地方-地址。
通过XML形式说明服务提供什么样的方法 – 如何调用。

(3)SOAP—Simple Object Access Protocol(简单对象访问协议)
SOAP作为一个基于XML语言的协议用于有网上传输数据。
SOAP = 在HTTP的基础上+XML数据。
SOAP是基于HTTP的。
SOAP的组成如下:
Envelope – 必须的部分。以XML的根元素出现。
Headers – 可选的。
Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

webservice网址
Webservice服务网站:http://www.webxml.com.cn
查询手机归属地

客户端发送请求

POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: ws.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
      <mobileCode>string</mobileCode>
      <userID>string</userID>
    </getMobileCodeInfo>
  </soap12:Body>
</soap12:Envelope>

服务端响应请求

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">
      <getMobileCodeInfoResult>string</getMobileCodeInfoResult>
    </getMobileCodeInfoResponse>
  </soap12:Body>
</soap12:Envelope>

一、jdk中的wsimport解析wsdl
WSDL解析
点开webservice网站上的手机归属地查询里的
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
查看wsdl对服务器的描述
Wsdl文档从下往上读
wsdl:service—所有请求服务的站点集合
wsdl:port—定义为webservice单个服务访问点
binding—特定服务访问点与具体服务类的绑定
PortType—对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)
Operation—对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)
Types-数据类型定义的容器,它使用某种类型系统需要的输入参数和输出参数的数据类型
Message—通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(输入参和输出参)

使用jdk当中的wsimport.exe生成客户端代码
常用参数为:
-d<目录> - 将生成.class文件,默认参数。
-s<目录> - 将生成.java文件和class文件。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数

1、首先在E:盘下创建一个wsCode文件夹
2、然后打开命令窗体,跳转到这个文件夹下
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)
复制上面的内容
3、在命令窗口的文件夹下执行命令
wsimport -s . -p com.xr.mobile http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

4.执行完毕后,去你创建的文件夹下,会发现出现以下内容
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)

然后右键让这些文件按类型排序,删除所有class文件,留下java文件
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)
打开idea软件
首先创建一个java项目,然后再在这个项目下创建一个java项目wsclient
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)
将生成的java文件复制进com.xr.mobile包中
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)

写一个测试包com.xr.server
写一个用来测试的类MobileTest
MobileCodeWS:
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)
MobileCodeWSSoap:
getMobileCodeInfo:
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)

package com.xr.server;

import com.xr.mobile.MobileCodeWS;
import com.xr.mobile.MobileCodeWSSoap;

public class MobileTest {
    public static void main(String[] args) {
        //创建服务站点
        MobileCodeWS mcws=new MobileCodeWS();
        //获取服务站点下的类
        MobileCodeWSSoap mcwss=mcws.getMobileCodeWSSoap();
        //调用绑定类中的方法
        String mobile=mcwss.getMobileCodeInfo("13888888888","");
        System.out.println(mobile);
    }
}

然后运行就可以了,结果为
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)

二、jdk发布webservice

首先创建一个java项目wsserver
随便在包中com.xr.hello写一个类HelloWorld

package com.xr.hello;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService
public class HelloWorld {

  public @WebResult(name="java3server")
  String sayHello(@WebParam(name = "name") String name){
      return name+"hello";
  }

    public static void main(String[] args) {
      /*
      * Endpoint断点服务类
      * 使用静态publish方法*/
        Endpoint.publish("http://127.0.0.1:999/hello",new HelloWorld());
    }
}

然后运行,在浏览器中测试,注意浏览器中的地址要在原地址后面加?wsdl否则无法进入
WebService(jdk中的wsimport解析wsdl,jdk发布webservice)

看看自己发布的可不可被调用,则只要重复以上使用wsimport解析即可

wsdl文档名称修改

package com.xr.hello;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService(
        serviceName = "myService",//服务站点名
        portName = "myPort",//绑定端口名
        name="helloWorld",//服务对应的类名
        targetNamespace = "com.xr.hello"//服务站点所在包名
)
public class HelloWorld {

  public @WebResult(name="java3server")
  String sayHello(@WebParam(name = "name") String name){
      return name+"hello";
  }
  /*写了这个则这个方法在wsdl文件中不显示*/
@WebMethod(exclude = true)
  public@WebResult(name = "haha") String sayYou(@WebParam(name = "you") String you){

      return you+"你";
  }

    public static void main(String[] args) {
      /*
      * Endpoint断点服务类
      * 使用静态publish方法*/
        Endpoint.publish("http://127.0.0.1:999/hello",new HelloWorld());
    }
}