精华内容
下载资源
问答
  • JAVA Webservice

    2015-05-11 09:48:43
    Java 实现调用WebService的几种方式 使用wsimport根据WSDL自动生成客户端代码 java 调用webservice的各种方法总结 cmd->wsimport -keep -d 存放class文件的路径 -s 存放Java文件的路径 -p 类的包名 具体的WSDL地址...

    简介

    1. WebService学习笔记

    2. Java 实现调用WebService的几种方式

    3. 使用wsimport根据WSDL自动生成客户端代码

    4. java 调用webservice的各种方法总结

    cmd->wsimport -keep -d 存放class文件的路径 -s 存放Java文件的路径 -p 类的包名 具体的WSDL地址


    发布WebService

    注解的方式

    package com.webservice;
    
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    import javax.xml.ws.Endpoint;
    
    /**
     * WebService
     * 将 Java 类标记为实现 Web Service,或者将 Java 接口标记为定义 Web Service 接口
     */
    @WebService(serviceName="MyService",targetNamespace="http://www.baidu.com")
    public class HelloService implements IHelloService{
    
        @WebMethod(operationName="AliassayHello")//默认为SayHello
        @WebResult(name="myReturn")//默认为 return
        //@WebParam 默认为 arg0,arg1
        public String sayHello(@WebParam(name="myname") String name){
            return  "hello: " + name;
        }
    
        public String sayGoodbye(String name){
    
            return  "goodbye: " + name;
        }
    
        @WebMethod(exclude=true)//当前方法不被发布出去, 默认为 false
        public String sayHello2(String name){
            return "hello " + name;
        }
    
        public static void main(String[] args) {
            /**
             * 参数1:服务的发布地址
             * 参数2:服务的实现者
             *  Endpoint  会重新启动一个线程
             */
            Endpoint.publish("http://localhost:8088/test", new HelloService());
            System.out.println("Server ready...");
        }
    
    }

    用wsdd(Web Services Deployment Descriptor)发布 Webservice

    wsdd+Axis发布Webservice


    客户端访问

    1.wsimport 自动生成客户端代码,通过代理的模式实现访问

    2.通过URL直接发送SOAP报文访问(Java 应用程序,jsp+ajax)


    示例源码

    基于注解方式发布的Webservice的具体实现

    download

    WSDD形式的Webservice的具体实现

    download


    常见问题

    1.Eclipse 的Webservice Explorer 打不开,报500错误的原因,把jre8改成jre7就可以解决了。

    2.Java应用程序通过 HttpURLConnection访问网址,因为服务器的安全设置不接受Java程序作为客户端访问,解决方案是设置客户端的User Agent,要手工设置安全性

      conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

    3.项目要设置WEB.XM中的的servlet,否则会报错;

    展开全文
  • java webservice

    千次阅读 2017-08-30 08:57:36
    1.1 【什么是webservice】 1.1.1 什么是webservice? l Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。 l 采用标准SOAP(Simple Object Access Protocol) 协议...
    1.1 【什么是webservice
    

    1.1.1 什么是webservice

    l Web service web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。

    l 采用标准SOAP(Simple Object Access Protocol)  协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。

    l 采用wsdl作为描述语言即webservice使用说明书,wsdlw3c标准。

    l xmlwebservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。

    l XSDW3Cwebservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。

    l 当前非SOAP协议的webService以轻量为首要目标,比如http rest方式也是webservice的一种方式,或者直接使用http自定义数据协议,比如http传输json数据,http传输xml数据等。

     

     

    1.1.2 webService三要素

     

    1.1.2.1 soap

    SOAP即简单对象访问协议(Simple Object Access Protocal) 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息,简单理解为soap=http+xml

    Soap协议版本主要使用soap1.1soap1.2

    SOAP不是webservice的专有协议,其他应用协议也使用soap传输数据。例如,SMTPtr069等。

     

     

    1.1.2.2 wsdl

    WSDL 是基于 XML 的用于描述Web Service及其函数、参数和返回值。通俗理解Wsdlwebservice的使用说明书。

     

    1.1.2.3 UDDI

    UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。

     

     

     

    UDDI现状:

    目前大部分企业使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice

     

     

    1.1.3 webservice开发规范

    JAVA 中共有三种WebService 规范,分别是JAX-WSJAX-RPC)、JAXM&SAAJJAX-RS

    下面来分别简要的介绍一下这三个规范。

     

    1.1.3.1 JAX-WS介绍

    JAX-WS  的全称为 Java API for XML-Based Webservices ,早期的基于SOAP JAVA Web 服务规范JAX-RPCJava API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。

     

    1.1.3.2 JAXM&SAAJ

    JAXMJAVA API For XML Message)主要定义了包含了发送和接收消息所需的APISAAJSOAP With Attachment API For JavaJSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输等,JAXM&SAAJ JAX-WS 都是基于SOAP Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节

     

    1.1.3.3 JAX-RS

    JAX-RS JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。

     

    1.2 Jax-ws第一个例子】

    1.2.1 第一步:服务端开发

     

    1. 编写SEI(Service Endpoint Interface)SEIwebservice中称为portType,在java中称为接口。

     

    代码如下:

    /**

     * 天气查询服务接口

     * @author 传智播客 Java学院

     * @version V1.0

     */

    public interface WeatherInterface {

    //天气查询

    public String queryWeather(String cityName);

     

    }

     

    2. 编写SEI实现类,此类作为webservice提供服务类

     

    代码如下:

     

    /**

     * 天气查询服务接口实现类

     * @author 传智播客 Java学院

     * @version V1.0

     */

    @WebService

    public class WeatherInterfaceImpl implements WeatherInterface {

     

    @Override

    public String queryWeather(String cityName) {

    System.out.println("from client.."+cityName);

    String result = "晴朗";

    System.out.println("to client..."+result);

    return result;

    }

     

    public static void main(String[] args) {

    //发送webservice服务

    Endpoint.publish("http://192.168.1.100:1234/weather", new WeatherInterfaceImpl());

    }

     

    }

    注意:

    SEI实现类中至少要有一个非静态的公开方法需要作为webservice服务方法。

    public class 上边要加上@WebService 

     

    3. endpoint发布服务

     

    //发送webservice服务

    Endpoint.publish("http://192.168.1.100:1234/weather", new WeatherInterfaceImpl());

     

     

    1.2.2 第二步:查看wsdl

    Webservice发布成功,通过wsdl查看webservice发布的正确性

     

    1. 在地址栏输入(注意后面的参数?wsdl)

    http://192.168.1.100:1234/weather?wsdl

    2. Wsdl不是webService,只是获取一个用于描述WebService的说明文件

    3. wsdl- WebServiceDescriptionLanguage,是以XML文件形式来描述WebService说明”,有了说明书,我们才可以知道如何使用或是调用这个服务.

     

     

    1.2.3 第三步:Wsimport生成客户端调用类

     

    1.2.3.1 Wsimport介绍

    wsimportjdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice

    wsimport.exe位于JAVA_HOME\bin目录下.

    常用参数为:

    -d<目录>  - 将生成.class文件。默认参数。

    -s<目录> - 将生成.java文件。

    -p<生成的新包名> -将生成的类,放于指定的包下。

    (wsdlurl) - http://server:port/service?wsdl,必须的参数。

    示例:

    C:/> wsimport –s . http://127.0.0.1:1234/weather?wsdl

    注意:-s不能分开,-s后面有个小点

     

     

    1.2.3.2 客户端生成注意事项:

     

    1. 可以通过java version检查你当前的版本号保存是jdk1.6以上。Jdk1.6.0_13以后的版本支持jaxws2.1

     

    2. Eclipse中创建一个空的java工程为wsimport,此工程作为存放客户端代码。

    3. cmd命令行进入此wsimport 工程的src目录,

    输入以下命令:

      

    参数说明:-s是指编译出源代码文件,后面的.()指將代码放到当前目录下.

       最后面的http.是指获取wsdl说明书的地址.

     

    4. 生成完成,刷新Eclipsewsimport工程,将src下生成.java文件代码Copywebservice客户端工程(见下)中。

     

     

    1.2.4 第四步:客户端编写

     

    代码如下:

    /**

     * 天气查询客户端

     * @author 传智播客 Java学院

     * @version V1.0

     */

    public class WeatherClient {

    public static void main(String[] args) {

    //创建服务视图

    WeatherInterfaceImplService weatherInterfaceImplService =new WeatherInterfaceImplService();

    //通过服务视图得到服务端点

    WeatherInterfaceImpl weatherInterfaceImpl= weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class);

    //调用webservice服务方法

    String result = weatherInterfaceImpl.queryWeather("郑州");

    System.out.println(result);

    }

    }

     

     

    1.2.5 webservice优点

    1、采用xml支持跨平台远程调用。

    2、基于httpsoap协议,可跨越防火墙。

    3、支持面向对象开发。

    4、有利于软件和数据重用,实现松耦合。

     

    1.2.6 webservice缺点

    由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议进行数据传输的效率不高。

     

    1.3 webService应用场景】

    1.3.1 宏观

    用于软件集成和复用

    1.3.2 微观

    适用

    l 用于接口服务,不考虑客户端类型,不考虑性能,建议使用

    Ø 用于公开接口服务

    面向互联网公开的接口,例如:某公司产品促销介绍、股票信息查询等,因为webservice使用的soap协议是一个标准协议,其它公司使用标准协议通信,方便系统开发和维护。比如:便民网站的天气查询接口、火车时刻查询接口等。

     

    Ø 用于内部接口服务

    一个大的系统平台是由若干个系统组成,系统与系统之间存在数据访问需求,为了减少系统与系统之间的耦合性可以将接口抽取出来提供单独的接口服务供它系统调用,如下图是企业ERP系统的接口服务图:

     

    l 服务端已经确定使用webservice,客户端无法选择,只能使用webservice

     

    不适用

    l 性能要求很高的应用,不建议使用webservice

    比如银行交易系统、股票交易系统等,任何延迟都可能造成无法估量的损失。

    l 同构程序之间通信不建议使用webservice

    比如JavaRMI同样可以实现远程调用,而且性能比webservice好很多

    2 Wsdl

     

    2.1 Wsdl是什么?

    WSDL 指网络服务描述语言(Web Services Description Language)

    WSDL是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。

    WSDL 是一种 XML 文档

    WSDL 用于描述网络服务

    WSDL 也可用于定位网络服务

     

     

    2.2 wsdl 说明书结构

    <service>    服务视图,webservice的服务结点,它包括了服务端点

    <binding>     为每个服务端点定义消息格式和协议细节

    <portType>   服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType

    <message>   定义一个操作(方法)的数据参数(可有多个参数)

    <types>        定义 web service 使用的全部数据类型

     

    2.3 wsdl 说明书阅读方式

     

    从下往上读

    先找到服务视图,通过binging找到protType,找到了protType就找到了我们要调用的webservice方法。

     

     

    查看wsdl说明要从下往上看:

     

    1服务视图()

     

     

     

     

    2通过服务视图,bingdingporttype

     

     

     

    3、调用portType的方法

     

     

    3 wsdl应用--公网天气查询】

    3.1 wsdl使用方法

    第一步:阅读wsdl,搞清楚服务视图 service、 协议格式binding   服务端点porttype

    第二步:创建服务视图

    第三步:创建服务端点

    第四步:通过服务端点调用服务方法

     

    3.2 操作步骤

    第一步:找到天气查询的webservice WSDL文件拷贝到D盘根目录

    第二步:根据WSDL生成客户端调用类,使用wsimport生成

    Wsimport s . file:///d:\WeatherWebService.wsdl

    第三步:将生成的代码拷贝至工程中

    第四步:编写客户端调用代码

     

    3.3 客户端代码如下:

     

    /**

     * 互联网天气查询客户端

     * @author 传智播客 Java学院

     * @version V1.0

     */

    public class WebWeatherClient {

    public static void main(String[] args) {

    //创建服务视图

    WeatherWebService weatherWebService  = new WeatherWebService();

    //通过服务视图得到服务端点

    WeatherWebServiceSoap weatherWebServiceSoap =weatherWebService.getWeatherWebServiceSoap();

    //调用webservice服务方法

    ArrayOfString arrayOfString = weatherWebServiceSoap.getWeatherbyCityName("郑州");

    List<String> resultlist = arrayOfString.getString();

    //查询天气查询结果

    for(String result:resultlist){

    System.out.println(result);

    }

    }

    }

     

    3.4 webservice客户端编程-使用service类】

     

    3.4.1 步骤

    第一步:创建URL,指定资源地址即wsdl地址

    第二步:创建Qname,指定命名空间和视图名称

    第三步:创建服务视图对象service

    第四步:从服务视图中得到服务端点即服务接口(这里需要服务接口类型,可使用wsimport生成后只留下porttype

    第五步:通过服务端点调用服务方法

     

    3.4.2 天气查询客户端代码

     

    /**

     * 使用javax.xml.ws.Service调用webservice服务

     * @author 传智播客 Java学院

     * @version V1.0

     */

    public class WeatherClient2 {

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

    //定义url,参数为wsdl地址

    URL url = new URL("http://192.168.1.100:1234/weather?wsdl");

    //定义qname,第一个参数是命名空间,第二个参数名称是wsdl里边的服务名

    QName qName = new QName("http://impl.sei.jaxws.ws.itcast.cn/", "WeatherInterfaceImplService");

    //创建服务视图

    Service service = Service.create(url, qName);

    //通过服务视图得到服务端点

    WeatherInterfaceImpl weatherInterfaceImpl =service.getPort(WeatherInterfaceImpl.class);

    //调用webservice

    System.out.println(weatherInterfaceImpl.queryWeather("郑州"));

    }

    }

     

     

    3.4.3 公网天气查询客户端代码:

     

    /**

     * 使用javax.xml.ws.Service调用公网webservice服务

     * @author 传智播客 Java学院

     * @version V1.0

     */

    public class WebWeatherClient2 {

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

    //定义url,参数为wsdl地址

    URL url = new URL("file:/D:/WeatherWebService.wsdl");

    //定义qname,第一个参数是命名空间,第二个参数名称是wsdl里边的服务名

    QName qName = new QName("http://WebXml.com.cn/", "WeatherWebService");

    //创建服务视图

    Service service = Service.create(url, qName);

    //通过服务视图得到服务端点

    WeatherWebServiceSoap weatherWebServiceSoap =service.getPort(WeatherWebServiceSoap.class);

    //调用webservice

    ArrayOfString arrayOfString = weatherWebServiceSoap.getWeatherbyCityName("郑州");

    List<String> resultlist = arrayOfString.getString();

    //查询天气查询结果

    for(String result:resultlist){

    System.out.println(result);

    }

    }

    }

     

    3.4.4 公网手机号归属地查询客户端代码:

    /**

     * 使用service类调用公网手机号归属地查询服务

     */

    public class MobileClient_Service {

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

    //wsdlurl

    URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");

    //定义servicename

    QName serviceName = new QName("http://WebXml.com.cn/", "MobileCodeWS");

     

    //得到 服务视图

    Service service = Service.create(url, serviceName);

     

    //得到portType

    MobileCodeWSSoap mobileCodeWSSoap = service.getPort(MobileCodeWSSoap.class);

    //设备portType的方法

    String resultString = mobileCodeWSSoap.getMobileCodeInfo("1863819", "");

     

    //查询数据

    System.out.println(resultString);

     

    }

    }

     

     

    3.5 使用Service调用和Wsimport代码调用方式区别:

    Wsimport生成代码调用webservice无法指定webservice的地址,使用生成的服务视图类获取服务端点(postType)实例。

    Service调用Webservice可以指定webservice的地址,只需要服务端点的接口即可获取服务端点实例。

     

     

    4 Soap

    4.1 soap是什么

    SOAP 是一种网络通信协议

    SOAPSimple Object Access Protocol简易对象访问协议

    SOAP 用于跨平台应用程序之间的通信

    SOAP 被设计用来通过因特网(http)进行通信

    SOAP HTTP+XML,其实就是通过HTTPxml数据

    SOAP 很简单并可扩展支持面向对象

    SOAP 允许您跨越防火墙

    SOAP 将被作为 W3C 标准来发展

     

    4.2 使用TCP/IP Monitor监视Soap协议

    使用TCP/IP Monitor可以监视tcp/ip协议的报文内容,由于http是基于Tcp的应用协议,而webservice是基于http实现,所以通过tcp/ip monitor可以监视webservice请求及响应的内容。

     

    4.3 Soap1.1

     

    4.3.1 客户端代码:

     

    //定义url,参数为wsdl地址

    URL url = new URL("http://127.0.0.1:54321/weather?wsdl");

    //定义qname,第一个参数是命名空间,第二个参数名称是wsdl里边的服务名

    QName qName = new QName("http://server.jaxws.webservice.itcast.cn/", "WeatherInterfaceImplService");

    //创建服务视图

    Service service = Service.create(url, qName);

    //通过服务视图得到服务端点

    WeatherInterfaceImpl weatherInterfaceImpl =service.getPort(WeatherInterfaceImpl.class);

    //调用webservice

    System.out.println(weatherInterfaceImpl.queryWeather("郑州"));

     

    4.3.2 请求:

    注意红色标注:

     

    POST /weather HTTP/1.1

    Accept: text/xml, multipart/related

    Content-Type: text/xml; charset=utf-8

    SOAPAction: "http://server.jaxws.ws.itcast.cn/WeatherServer/queryWeatherRequest"

    User-Agent: JAX-WS RI 2.2.8 svn-revision#13980

    Host: 127.0.0.1:4321

    Connection: keep-alive

    Content-Length: 232

     

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

    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">

    <S:Body>

    <ns2:queryWeather xmlns:ns2="http://server.jaxws.ws.itcast.cn/">

    <arg0>郑州</arg0>

    </ns2:queryWeather>

    </S:Body>

    </S:Envelope>

    4.3.3 响应:

    注意红色标注:

     

    HTTP/1.1 200 OK

    Transfer-encoding: chunked

    Content-type: text/xml; charset=utf-8

     

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

    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">

    <S:Body>

    <ns2:queryWeatherResponse xmlns:ns2="http://server.jaxws.ws.itcast.cn/">

    <return>天气晴朗</return>

    </ns2:queryWeatherResponse>

    </S:Body>

    </S:Envelope>

    4.4 soap协议体包含下列元素

     

    必需有 Envelope 元素,此元素将整个 XML 文档标识为一条 SOAP 消息

    可选的 Header 元素,包含头部信息

    必需有Body 元素,包含所有的调用和响应信息

    可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

     

    4.5 soap消息基本结构

    <?xml version="1.0"?>

    <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

    <soap:Header>

     ... ...

    </soap:Header>

    <soap:Body>

     ... ...

     <soap:Fault>

     ... ...

    </soap:Fault>

    </soap:Body>

     </soap:Envelope>

     

    4.6 http发送soap协议测试

    webservice使用soap协议传输数据,soap是基于http的应用协议,可以使用http发送soap协议数据完成webservice的请求。

     

    本例子解析响应的xml数据使用dom4j

     

     

    /**

     * 通过http发送soap协议请求webservice

     * @author 传智播客 Java学院

     * @version V1.0

     */

    public class HttpRequestSoap {

     

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

    //webservice地址

    String webservice_url = "http://127.0.0.1:1234/weather";

    //发送的soap协议内容

    String soap_xml = soap_xml("郑州");

    System.out.println(soap_xml);

    //创建url

    URL url = new URL(webservice_url);

    //创建http链接对象

    HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();

    //设置请求方法

    httpURLConnection.setRequestMethod("POST");

    //设置Content-type

    httpURLConnection.setRequestProperty("Content-type", "text/xml;charset=\"utf-8\"");

    //使用http进行输出

    httpURLConnection.setDoOutput(true);

    //使用http进行输入

    httpURLConnection.setDoInput(true);

     

    //通过输出流发送数据

    OutputStream outputStream = httpURLConnection.getOutputStream();

    outputStream.write(soap_xml.getBytes());

    outputStream.close();

     

    //接收服务端响应数据

    InputStream inputStream =  httpURLConnection.getInputStream();

     

    //使用buffer存在读取的数据

    byte[] buffer = new byte[1024];

     

    //使用字节输出流存储读取的数据

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    while(true){

    int len = inputStream.read(buffer);

    //如果流水读取完则退出循环

    if(len == -1){

    break;

    }

    byteArrayOutputStream.write(buffer,0,len);

    }

     

    //得到响应数据

    String response_string = byteArrayOutputStream.toString();

     

    System.out.println(response_string);

     

    parseXml(response_string);

    }

    //soap协议内容

    public static String soap_xml(String cityName){

    String soap_xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"

    + "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">"

    + "<S:Body>"

    + "<ns2:queryWeather xmlns:ns2=\"http://impl.sei.jaxws.ws.itcast.cn/\">"

    + "<arg0>"+ cityName  + "</arg0>"

    + "</ns2:queryWeather>"

    + "</S:Body>"

    + "</S:Envelope>";

     

    return soap_xml;

    }

     

     

    //解析响应的xml

    public static String parseXml(String xmlString){

    String result = null;

     

    try {

    Document document = DocumentHelper.parseText(xmlString);

    //创建xpath解析对象

    DefaultXPath defaultXPath = new DefaultXPath("//ns2:queryWeatherResponse");

    //指定命名空间

    defaultXPath.setNamespaceURIs(Collections.singletonMap("ns2", "http:// impl.sei.jaxws.ws.itcast.cn/"));

     

    List<Element> elements= defaultXPath.selectNodes(document);

     

    Element response = elements.get(0);

     

    List<Element> results = response.selectNodes("return");

     

    System.out.println(results.get(0).getText());

     

    } catch (DocumentException e) {

    e.printStackTrace();

    }

     

    return result;

    }

     

    }

     

     

     

    4.7 Soap1.2

    4.7.1 下载 jaxws-ri-2.2.8

    Jaxws实现soap1.2需要加入jaxws扩展包,从sun下载jaxws-ri-2.2.8,解压jaxws-ri-2.2.8并将lib下的jar包加载到java工程中。

     

    4.7.2 添加BindingType

    SEI实现类上添加如下注解

    @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

     

    4.7.3 请求:

    注意红色标注:

     

    POST /weather HTTP/1.1

    Accept: application/soap+xml, multipart/related

    Content-Type: application/soap+xml; charset=utf-8;action="http://server.jaxws.ws.itcast.cn/WeatherServer/queryWeatherRequest"

    User-Agent: JAX-WS RI 2.2.8 svn-revision#13980

    Host: 127.0.0.1:4321

    Connection: keep-alive

    Content-Length: 230

     

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

    <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">

    <S:Body>

    <ns2:queryWeather xmlns:ns2="http://server.jaxws.ws.itcast.cn/">

    <arg0>郑州</arg0>

    </ns2:queryWeather>

    </S:Body>

    </S:Envelope>

     

    4.7.4 响应:

    注意红色标注:

     

    HTTP/1.1 200 OK

    Transfer-encoding: chunked

    Content-type: application/soap+xml; charset=utf-8

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

    <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">

    <S:Body>

    <ns2:queryWeatherResponse xmlns:ns2="http://server.jaxws.ws.itcast.cn/">

    <return>天气晴朗</return>

    </ns2:queryWeatherResponse>

    </S:Body>

    </S:Envelope>

     

    4.8 Soap1.1soap1.2异同

    相同之处:

    soap1.1soap1.2都是使用post方法

    都包括Envelopebody

     

    内容类型context-type不同:

    soap1.1使用text/xml

    soap1.2使用application/soap+xml

     

    命名空间Envelope xmlns不同:

    soap1.1使用http://schemas.xmlsoap.org/soap/envelope/

    soap1.2使用http://www.w3.org/2003/05/soap-envelope

     

     

    5 jax-ws开发深入

    5.1 JAX-WS注解

    5.1.1 注解说明

    WebService的注解都位于javax.jws包下:

    @WebService-定义服务,在public class上边

    targetNamespace:指定命名空间

    nameportType的名称

    portNameport的名称

    serviceName:服务名称

    endpointInterfaceSEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。

    @WebMethod-定义方法,在公开方法上边

    operationName:方法名

    exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法

    @WebResult-定义返回值,在方法返回值前边

    name:返回结果值的名称

    @WebParam-定义参数,在方法参数前边

    name:指定参数的名称

    作用:

    通过注解,可以更加形像的描述Web服务。对自动生成的wsdl文档进行修改,为使用者提供一个更加清晰的wsdl文档。

    当修改了WebService注解之后,会影响客户端生成的代码。调用的方法名和参数名也发生了变化

     

    5.1.2 注解示例:

     

    /**

     * 天气查询服务接口实现类

     * @author 传智播客 Java学院

     * @version V1.0

     */

    @WebService(targetNamespace="http:// webservice.itcast.cn",

    serviceName="weatherService",

    portName="weatherServicePort",

    name="weatherServiceInterface"

    )

    public class WeatherInterfaceImpl implements WeatherInterface {

     

    @WebMethod(operationName="queryWeather")

    public @WebResult(name="weatherResult")String queryWeather(

    @WebParam(name="cityName")String cityName) {

    System.out.println("from client.."+cityName);

    String result = "晴朗";

    System.out.println("to client..."+result);

    return result;

    }

     

    public static void main(String[] args) {

    //发送webservice服务

    Endpoint.publish("http://192.168.1.100:1234/weather", new WeatherInterfaceImpl());

    }

     

    }

     

    5.1.3 使用注解注意

    @WebMethod对所有非静态的公共方法对外暴露为服务.

    对于静态方法或非public方法是不可以使用@WebMethod注解的.

    public方法可以使用@WebMethod(exclude=true)定义为非对外暴露的服务。

     

     

    5.2 使用复杂数据类型发布webservice

    5.2.1 需求

    SOAP协议支持对象格式数据,我们可以将天气查询的结果封装在一个查询结果对象中,字段包括:城市、日期、天气、温度等信息。

           

    服务端编写webservice的方法和前边一样,最后使用endpoint发布服务。

    wsimport生成客户端代码。

     

    5.2.2 代码:

     

    5.2.2.1 服务端:

     

    @WebService(targetNamespace="http:// webservice.itcast.cn",

    serviceName="weatherService",

    portName="weatherServicePort",

    name="weatherServiceInterface"

    )

    public class WeatherInterfaceImpl implements WeatherInterface {

     

    @Override

    public @WebResult(name="weatherResult")List<WeatherModel> queryWeather(

    @WebParam(name="cityName")String cityName) throws Exception {

     

    //构造三天的天气结果

    Calendar calendar = Calendar.getInstance();

    int day = calendar.get(Calendar.DATE);

    //第一天的天气

    WeatherModel weatherModel_1 = new WeatherModel();

    weatherModel_1.setDate(new Date());

    weatherModel_1.setDetail("晴朗");

    weatherModel_1.setTemperature_max(30);

    weatherModel_1.setTemperature_min(23);

    //第二天的天气

    WeatherModel weatherModel_2 = new WeatherModel();

    calendar.set(Calendar.DATE, day+1);

    weatherModel_2.setDate(calendar.getTime());

    weatherModel_2.setDetail("晴转多云");

    weatherModel_2.setTemperature_max(28);

    weatherModel_2.setTemperature_min(21);

    //第三天的天气

    WeatherModel weatherModel_3 = new WeatherModel();

    calendar.set(Calendar.DATE, day+2);

    weatherModel_3.setDate(calendar.getTime());

    weatherModel_3.setDetail("多云转小雨");

    weatherModel_3.setTemperature_max(25);

    weatherModel_3.setTemperature_min(18);

     

    List<WeatherModel> list = new ArrayList<WeatherModel>();

    list.add(weatherModel_1);

    list.add(weatherModel_2);

    list.add(weatherModel_3);

    //返回三天的天气

    return list;

    }

     

    }

     

    5.2.2.2 客户端:

     

    public class WeatherClient {

    public static void main(String[] args) throws MalformedURLException, Exception_Exception {

    //wsdlurl

    URL url = new URL("http://127.0.0.1:12345/weather?wsdl");

    //serviceName

    //第一参数是命名空间地址,第二个参数是service名称

    QName serviceName = new QName("http://server.jaxws.webservice.itcast.cn/", "WeatherInterfaceImplService");

    //创建服务视图

    Service service = Service.create(url, serviceName);

    //通过服务视图得到portType

     

    WeatherInterfaceImpl weatherInterfaceImpl = service.getPort(WeatherInterfaceImpl.class);

    //调用porttype方法

    List<WeatherModel> list = weatherInterfaceImpl.queryWeather("北京");

     

    for(WeatherModel weatherModel:list){

    Date date = weatherModel.getDate().toGregorianCalendar().getTime();

     

    System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));

    }

    }

    }

     

     

     

    6 CXF基础

     

    6.1 什么是CXF

    Apache CXF = Celtix + Xfire开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXFApache CXF 是一个开源的web Services 框架,CXF 帮助您构建和开发 web Services 支持多种协议,比如:SOAP1.1,1,2XML/HTTPRESTful HTTP 或者 CORBA

    CORBACommon Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WSC,c++,C#

    Cxf是基于SOA总线结构,依靠spring完成模块的集成,实现SOA方式。

    灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),weblogic上面。

     

    6.2 CXF的安装及配置

    从官网下载2.7.11

     

     

     

    6.3 环境变量配置:

    JAVA_HOME,

    CXF_HOME=cxf的目录

    Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;

    CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar

     

    6.4 CXF例子

    6.4.1 第一步:创建java工程

     

    6.4.2 第二步:将cxfjar 包加入工程

     

    6.4.3 第三步:创建服务接口和服务实现类

    创建服务接口和服务类的方法同上边章节描述,编写SEISEI的实现。

     

    注意:与jaxws编程不同的是将@WebService注解加在接口上边。

     

    6.4.3.1 服务接口:

    使用cxf开发webservice这里只需要在接口上加@webservice注解即可,和jaxws开发不同。

     

     

    @WebService

    @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

    public interface WeatherInterface {

    //根据城市名称查询未来三天的天气

    public List<WeatherModel> queryWeather(String cityName) throws Exception;

    }

    6.4.3.2 服务接口实现类:

    使用cxf开发不用在接口实现类上加@webservice注解,因为cxf发布服务时可以指定接口。

     

    public class WeatherInterfaceImpl implements WeatherInterface {

     

    @Override

    public List<WeatherModel> queryWeather(String cityName) throws Exception {

     

    //构造三天的天气结果

    Calendar calendar = Calendar.getInstance();

    int day = calendar.get(Calendar.DATE);

     

    WeatherModel weatherModel_1 = new WeatherModel();

    weatherModel_1.setDate(new Date());

    weatherModel_1.setDetail("晴朗");

    weatherModel_1.setTemperature_max(30);

    weatherModel_1.setTemperature_min(23);

     

    WeatherModel weatherModel_2 = new WeatherModel();

    calendar.set(Calendar.DATE, day+1);

    weatherModel_2.setDate(calendar.getTime());

    weatherModel_2.setDetail("晴转多云");

    weatherModel_2.setTemperature_max(28);

    weatherModel_2.setTemperature_min(21);

     

    WeatherModel weatherModel_3 = new WeatherModel();

    calendar.set(Calendar.DATE, day+2);

    weatherModel_3.setDate(calendar.getTime());

    weatherModel_3.setDetail("多云转小雨");

    weatherModel_3.setTemperature_max(25);

    weatherModel_3.setTemperature_min(18);

     

    List<WeatherModel> list = new ArrayList<WeatherModel>();

    list.add(weatherModel_1);

    list.add(weatherModel_2);

    list.add(weatherModel_3);

     

    return list;

    }

    }

     

     

    6.4.3.3 发布服务类:

    package cn.itcast.ws.jaxws.server;

     

    import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

     

    /**

     * CXF发布jaxws服务类

     * @author Thinkpad

     *

     */

    public class Server {

     

    /**

     * @param args

     */

    public static void main(String[] args) {

    //创建服务工厂bean

    JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();

    //指定服务接口

    jaxWsServerFactoryBean.setServiceClass(WeatherServerInterface.class);

    //指定服务实现对象

    jaxWsServerFactoryBean.setServiceBean(new WeatherInterfaceImpl());

    //指定webservice的地址

    jaxWsServerFactoryBean.setAddress("http://192.168.1.100:1234/weather");

    //创建webservice服务

    jaxWsServerFactoryBean.create();

    }

     

    }

     

     

     

    6.4.4 第四步:根据wsdl地址生成客户端代码

    我们分别使用wsimportwsdl2java生成客户端代码,都可以正常使用。

    **wsdl2java可以生成soap1.1soap1.2

     

    6.4.4.1 wsdl2java生成客户代码

     

    先让我们了解一下cxfwsdl2java工具,它的功能就如同wsimport一样,可以生成一堆客户端调用的代码。

    在命令行执行:

    wsdl2java –d . http://192.168.1.100:1234/weather?wsdl

     

    注意:

    生成后WeatherService报错:

    原因是cxf需要JAX-WS API 2.2jdk6jax-ws2.1 版本,需要

    wsdl2java 使用“-frontend jaxws21

    即如下:

    wsdl2java –d . –frontend jaxws21 http://localhost:1234/weather?wsdl

     

     

    6.4.5 第五步:编写客户端:

     

    6.4.5.1 方式1、使用javax.xml.ws.Service调用客户端

     

    package cn.itcast.ws.jaxws.client;

     

    import java.net.MalformedURLException;

    import java.net.URL;

     

    import javax.xml.namespace.QName;

    import javax.xml.ws.Service;

     

    import cn.itcast.ws.jaxws.server.WeatherServerInterface;

     

    public class Client3 {

     

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

     

    //创建URL,资源定位

    URL url = new URL("http://192.168.1.100:1234/weather?wsdl"); 

    //Qname,确定命名空间地址,和服务视图名称

    QName qName = new QName("http://service.itcast.cn/", "WeatherInterfaceService");

    //创建service

    Service service = Service.create(url, qName);

    //创建porttype(服务端点)

    WeatherInterface weatherInterface = service.getPort(WeatherInterface.class);

     

    //通过服务端点调用服务方法

         weatherServerInterface.queryWather("郑州");

    }

     

    }

     

    6.4.5.2 方式2JaxwsProxyFactoryBean调用服务端:

     

     

    //创建代码工厂bean

    JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();

    //设置接口类型(portType)jaxWsProxyFactoryBean.setServiceClass(WeatherInterface.class);

    //设置webservice地址jaxWsProxyFactoryBean.setAddress("http://192.168.1.100:1234/weather");

    //创建portType调用实例

    WeatherInterface weatherInterface =(WeatherInterface) jaxWsProxyFactoryBean.create();

    //调用webservice

    weatherServerInterface.queryWather("郑州");

     

     

     

    6.4.6 SOAP1.2生成

     

    在服务接口的上面都添加

    @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

    如下:

    @WebService

    @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

    public interface WeatherServerInterface

     

    @WebService(endpointInterface = "cn.itcast.ws.jaxws.server.WeatherServerInterface")

    @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

    public class WeatherServer implements WeatherServerInterface

     

     

     

     

     

    7 Cxfspring集成

     

     

    7.0.1 第一步建立一个web项目

     

    7.0.2 第二步填充CXF JAR包。

     

    7.0.3 第三步创建服务接口及服务类

    编写方法同上面章节描述。

     

     

    7.0.3.1 服务接口:

     

    @WebService(targetNamespace="http://service.itcast.cn/",

    name="WeatherInterface",//porttype的名称

    portName="WeatherInterfacePort",

    serviceName="WeatherInterfaceService"

    )

    @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)

    public interface WeatherInterface {

    //根据城市名称查询公网天气服务接口

    public List<String> queryWeather(String cityName) throws Exception;

    }

     

    7.0.3.2 服务实现类:

     

    需求:服务类需要调用公网天气查询客户端。

     

     

    public class WeatherInterfaceImpl implements WeatherInterface {

     

    //此为公网查询客户端需要通过spring配置并注入

    private WeatherWebServiceSoap weatherWebServiceSoap;

     

    @Override

    public List<String> queryWeather(String cityName) throws Exception {

     

    ArrayOfString arrayOfString = weatherWebServiceSoap.getWeatherbyCityName("郑州");

    List<String> results = arrayOfString.getString();

    for(String result:results){

    System.out.println(result);

    }

     

    return results;

    }

     

    public WeatherWebServiceSoap getWeatherWebServiceSoap() {

    return weatherWebServiceSoap;

    }

     

    public void setWeatherWebServiceSoap(WeatherWebServiceSoap weatherWebServiceSoap) {

    this.weatherWebServiceSoap = weatherWebServiceSoap;

    }

     

    }

     

    7.0.3.3 公网天气查询代码生成

    将上边章节生成的公网天气查询客户端调用代码考入本工程。

    生成方法在此不再赘述。

    7.0.4 第四步创建applicationContext.xml

     

    applicationContext.xml放在WEB-INF

     

    内容如下:

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

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"

    xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

                http://www.springframework.org/schema/beans/spring-beans.xsd

                http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd

                http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd

                http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">

    <!-- 配置发布webservice服务 -->

    <jaxws:server address="/weather" serviceClass="cn.itcast.webservice.jaxws.server.WeatherInterface">

          <jaxws:serviceBean>

          <ref bean="weatherInterface"/>

          </jaxws:serviceBean>

    </jaxws:server>

     

    <!-- 公网天气查询客户端 -->

    <jaxws:client id="weatherClient" serviceClass="cn.com.webxml.WeatherWebServiceSoap" address="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx" />

     

     

    <!-- 本系统对外服务的天气查询service -->

    <bean id="weatherInterface" class="cn.itcast.webservice.jaxws.server.WeatherInterfaceImpl" >

    <property name="weatherWebServiceSoap" ref="weatherClient" />

    </bean>

     

    </beans>

    7.0.5 第五步在web.xml配置Spring环境

     

      <context-param>

           <param-name>contextConfigLocation</param-name>

           <param-value>/WEB-INF/applicationContext.xml</param-value>

        </context-param>

        <listener>

          <listener-class> org.springframework.web.context.ContextLoaderListener</listener-class>

        </listener>

     

    7.0.6 第六步在web.xml配置CXFservlet

    <servlet>

            <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

            <load-on-startup>1</load-on-startup>

        </servlet>

        <servlet-mapping>

            <servlet-name>cxf</servlet-name>

            <url-pattern>/ws/*</url-pattern>

        </servlet-mapping>

     

     

    7.0.7 第七步:启动web容器

    访问:http://192.168.1.100:8080/.../ws/weather?wsdl

     

    7.0.8 第八步:编写客户端工程

    客户端创建同前边章节,此处不再赘述。

     

    8 CXF 发布rest服务

    8.1 什么是rest服务

    REST 是一种软件架构模式,只是一种风格,rest服务采用HTTP 做传输协议,REST 对于HTTP 的利用实现精确的资源定位。

    Rest要求对资源定位更加准确,如下:

    rest方式:http://ip:port/queryUser.action?userType=student&id=001

    Rest方式:http://ip:port/user/student/query/001

    Rest方式表示互联网上的资源更加准确,但是也有缺点,可能目录的层级较多不容易理解。

     

    REST 是一种软件架构理念,现在被移植到Web 服务上,那么在开发Web 服务上,偏于面向资源的服务适用于RESTREST 简单易用,效率高,SOAP 成熟度较高,安全性较好。

    注意:REST 不等于WebServiceJAX-RS 只是将REST 设计风格应用到Web 服务开发上。

     

     

    8.2 发布rest服务

    8.2.1 需求:

    发布查询学生信息的服务,以jsonxml数据格式返回。

     

    8.2.2 pojo

    @XmlRootElement(name="student")

    public class Student {

     

    private long id;

    private String name;

    private Date birthday;

     

     

    8.2.3 SEI

     

    @WebService

    @Path("/student")

    public interface StudentService {

     

    @GET

    @Produces(MediaType.APPLICATION_XML)

    @Path("/query/{id}")

    public Student queryStudent(@PathParam("id")long id)throws Exception;

     

    @GET

    @Produces({"application/json;charset=utf-8",MediaType.APPLICATION_XML})

    @Path("/querylist/{id}")

    public List<Student> queryStudentList(@PathParam("id")long id)throws Exception;

    }

     

    上边代码中:

    queryStudent方法以xml格式发布

    queryStudentList方法以jsonxml两种格式发布。

     

    8.2.4 SEI实现类

     

    public class StudentServiceImpl implements StudentService {

     

    @Override

    public Student queryStudent(long id) throws Exception {

    Student student = new Student();

    student.setId(100000l);

    student.setName("张三");

    student.setBirthday(new Date());

    return student;

    }

     

    @Override

    public List<Student> queryStudentList(long id) throws Exception {

    Student student1 = new Student();

    student1.setId(100000l);

    student1.setName("李四");

    student1.setBirthday(new Date());

     

    Student student2 = new Student();

    student2.setId(100000l);

    student2.setName("张三");

    student2.setBirthday(new Date());

     

    List<Student> list = new ArrayList<Student>();

    list.add(student1);

    list.add(student2);

    return list;

    }

     

    }

     

    8.2.5 程序代码发布

     

    public class RestServer {

    public static void main(String[] args) {

     

    JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();

    //rest地址

    jaxrsServerFactoryBean.setAddress("http://127.0.0.1:12345/rest");

    //设置SEI实现类

    jaxrsServerFactoryBean.setResourceClasses(StudentServiceImpl.class);

    jaxrsServerFactoryBean.create();

    }

    }

     

    8.2.6 Spring配置文件发布

     

    <!-- rest服务发布 -->

    <jaxrs:server address="/rest">

    <jaxrs:serviceBeans>

    <ref bean="studentService"/>

    </jaxrs:serviceBeans>

     

    </jaxrs:server>

    <!-- 学生查询,rest方式 -->

    <bean id="studentService" class="cn.itcast.ws.cxf.rest.server.StudentServiceImpl">

    </bean>

     

     

    8.2.7 测试

     

    queryStudent方法测试:

    http://127.0.0.1:8080/工程名/ws/rest/student/query/1

     

     

    queryStudentList方法测试:

    返回json

    http://127.0.0.1:8080/工程名/ws/rest/student/querylist/1?_type=json 

     

     

     

    返回xml

    http://127.0.0.1:8080/工程名/ws/rest/student/querylist/1?_type=xml

     

     

     

     

     

    9 便民网站

    9.1 需求:

    使用springmvc+CXF实现便民网站,同时对外提供webservice服务。

     

    调用公网webservice

    将自己的服务发布成webservice

     

    9.2 步骤

     

    9.2.1 第一步:创建web项目工程

     

    9.2.2 第二步:导入jar

     

    9.2.2.1 导入cxf的全部jar

    参考cxf下的lib目录

    9.2.2.2 更换cxf中原始springjar

    Cxf2.7.11默认和spring3.0.7整合,这里我们使用spring3.1.4,将cxf中的spring开头的jar去掉,拷贝springspringmvc的所有jar包。

     

     

     

     

    9.2.3 第三步:天气查询服务接口开发

     

    9.2.3.1 服务接口

    @WebService(targetNamespace="http://service.itcast.cn/",

    name="WeatherInterface",//porttype的名称

    portName="WeatherInterfacePort",

    serviceName="WeatherInterfaceService"

    )

    public interface WeatherService {

    //根据城市名称查询三天的天气

    public List<WeatherModel> queryWeather(String cityName) throws Exception;

    }

    9.2.3.2 服务实现

    public class WeatherServiceImpl implements WeatherService {

     

    @Resource

    private WeatherWebServiceSoap weatherWebServiceSoap;

     

    @Override

    public List<WeatherModel> queryWeather(String cityName) throws Exception {

    //调用dao获取天气信息

    ArrayOfString arrayOfString = weatherWebServiceSoap.getWeatherbyCityName(cityName);

    List<String> list = arrayOfString.getString();

    for(String result:list){

    System.out.println(result);

    }

     

    //解析获取的天气信息

    WeatherModel weatherModel_1 = new WeatherModel();

    weatherModel_1.setDetail(list.get(6));//天气概况

    weatherModel_1.setImg(list.get(8));//图标

     

    WeatherModel weatherModel_2 = new WeatherModel();

    weatherModel_2.setDetail(list.get(13));//天气概况

    weatherModel_2.setImg(list.get(15));//图标

     

    WeatherModel weatherModel_3 = new WeatherModel();

    weatherModel_3.setDetail(list.get(18));//天气概况

    weatherModel_3.setImg(list.get(20));//图标

    //返回的结果集

    List<WeatherModel> list_l = new ArrayList<WeatherModel>();

     

    list_l.add(weatherModel_1);

    list_l.add(weatherModel_2);

    list_l.add(weatherModel_3);

     

    return list_l;

    }

     

     

    }

    9.2.3.3 公网查询客户端代码

    将上边章节生成的公网天气查询客户端调用代码考入本工程。

    生成方法在此不再赘述。

     

    9.2.4 第四步:spring环境

    将上边编写的天气查询服务接口在spring环境配置。

     

    Classpath 下添加applicationContext.xml

     

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

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"

    xmlns:jaxrs="http://cxf.apache.org/jaxrs"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://cxf.apache.org/jaxws

    http://cxf.apache.org/schemas/jaxws.xsd

    http://cxf.apache.org/jaxrs

    http://cxf.apache.org/schemas/jaxrs.xsd">

     

    <!-- 导入资源文件 -->

    <beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="locations">

    <list>

    <value>classpath:config.properties</value>

    </list>

    </property>

    </bean>

     

    <!-- 配置发布webservice服务 -->

    <jaxws:server address="/weather"

    serviceClass="cn.itcast.weather.service.WeatherService">

    <jaxws:serviceBean>

    <ref bean="weatherService" />

    </jaxws:serviceBean>

    </jaxws:server>

     

    <!-- 天气查询的bean -->

    <bean id="weatherService" class="cn.itcast.weather.service.impl.WeatherServiceImpl">

    </bean>

     

    <!-- 公网天气查询客户端 -->

    <jaxws:client id="weatherWebServiceSoap" serviceClass="cn.com.webxml.WeatherWebServiceSoap"

    address="${webservice_url_weather}" />

     

    </beans>

     

    9.2.5 第五步:系统参数配置文件 

    config.properties

    //公网天气查询地址

    webservice_url_weather=http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

     

     

    9.2.6 第六步:控制层开发

    实现用户进入天气查询页面,输入城市查询天气。

     

    控制层调用天气查询服务接口。

     

    package cn.itcast.ws.cxf.servlet;

     

    import java.io.IOException;

     

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    import org.springframework.context.ApplicationContext;

    import org.springframework.web.context.support.WebApplicationContextUtils;

     

    import cn.itcast.ws.cxf.mobile.service.MobileService;

     

    public class MobileServlet extends HttpServlet {

     

    private MobileService mobileService;

     

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{

    String code = request.getParameter("code");

    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());

    mobileService = (MobileService) context.getBean("mobileService");

    if(null != code && !"".equals(code)){

    String result = mobileService.queryMobile(code);

    request.setAttribute("result", result);

    }

    request.getRequestDispatcher("WEB-INF/jsp/queryMobile.jsp").forward(request, response);

    }

     

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{

    String code = request.getParameter("code");

    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());

    mobileService = (MobileService) context.getBean("mobileService");

    if(null != code && !"".equals(code)){

    String result = mobileService.queryMobile(code);

    request.setAttribute("result", result);

    }

    request.getRequestDispatcher("WEB-INF/jsp/queryMobile.jsp").forward(request, response);

    }

    }

     

     

     

    9.2.7 第七步:web.xml

    Web.xml中做以下配置:

     

    启动系统加载spring环境

     

    springmvcservlet

     

    CXFservlet

     

     

    <!-- spring配置文件 -->

    <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/classes/applicationContext.xml</param-value>

    </context-param>

    <!-- 启动加载spring -->

    <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <!-- CXFservlet -->

    <servlet>

    <description>Apache CXF Endpoint</description>

    <display-name>cxf</display-name>

    <servlet-name>cxf</servlet-name>

    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

    <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

    <servlet-name>cxf</servlet-name>

    <url-pattern>/ws/*</url-pattern>

    </servlet-mapping>

    <!-- mobileServlet配置 -->

    <servlet>

    <servlet-name>mobileServlet</servlet-name>

    <servlet-class> cn.itcast.ws.cxf.servlet.MobileServlet</servlet-class>

     

    </servlet>

    <servlet-mapping>

    <servlet-name> mobileServlet</servlet-name>

    <url-pattern>*.action</url-pattern>

    </servlet-mapping>

     

    <!-- post提交乱码处理 -->

     

    <filter>

    <filter-name>CharacterEncodingFilter</filter-name>

    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

    <param-name>encoding</param-name>

    <param-value>utf-8</param-value>

    </init-param>

    </filter>

    <filter-mapping>

    <filter-name>CharacterEncodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

     

     

     

    展开全文
  • Java webservice

    2015-08-10 09:16:40
    Webservice :查询天气预报
    Webservice :查询天气预报
    展开全文
  • Java webservice详解

    千次阅读 2019-07-08 00:45:19
    Java webservice详解1 webservice概述2 webservice核心要素2.1 SOAP2.2 WSDL3 webservice的使用场景4 webservice的结构5 Java中的webservice5.1 webservice服务端5.2 webservice客户端6 WDSL文件说明7 webservice ...

    1 webservice概述

      webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice服务,获取这些信息;

      webservice 是一种系统之间进行调用的技术,系统之间调用的技术有:httpClient、hessian、dubbo、webservice 等;WebService 是一种跨越编程语言,跨越操作系统,跨越终端的远程调用技术,比如一个系统是 Java 语言开发的,另一个系统是 PHP 语言开发的,他们之间要实现信息交互,则可以使用 webservice 进行数据交互;

      所以 webservice 实现了异构系统之间的通信,不管是采用什么语言编写的,不管部署在什么操作系统平台上,使用 webservice 都可以实现信息的交换;

    2 webservice核心要素

    2.1 SOAP

      SOAP 英文全称为:Simple Object Access Protocol,即简单对象访问协议,它是基于 xml 格式的消息交换协议;

      OAP 定义了信息交换的格式,它包含一个重要的信封 envelope,使用信封envelope 来包装要传递的信息,使用命名空间 namespace 来区分传递的信息;简单来说,在 WebService 中传递的信息就是一封信,SOAP 就是信的通用格式,它定义了一封信应该有信封,信封里装着信的内容;

      信封(envlope)的格式是固定的,而信的内容(要传递的数据)可以自己定义;SOAP 协议传输的数据采用 xml 格式进行封装,采用 http 协议进行传输,即soap=xml+http;

    2.2 WSDL

      WSDL 英文全称为 Web Service Description Language,即 Web Service 描述语言;它使用 xml 对 Web Service 进行描述,比如提供服务的方法、参数、返回值、数据类型等信息进行描述;简单来说,wsdl 就是 webservice 服务的使用说明书;

    3 webservice的使用场景

      1、应用系统集成
      多个应用系统集成在一起,则需要信息交换或通信,那么可以采用 webservice进行通信;

      2、异构系统之间通信
      异构系统,主要是指编程语言不同的系统;不同系统之间,特别是开发语言不同的系统之间,可以通过 webservice 进行信息交换;

      3、软件复用
      webservice 可以作为一个公共的服务,供客户端调用,避免软件重复开发工作;

    4 webservice的结构

      服务端:提供服务,供客户端调用;
      客户端:调用服务,获得服务的数据;
             在这里插入图片描述

    5 Java中的webservice

      各种编程语言下都有 webservice 技术,比如 php、c#、Java 等;由于 webservice 定义交互的格式,所以不同编程语言之间可以实现相互调用,数据交换和通信;
      Java 中的 webservice,即 Java API for XML-Based Webservices,简称JAX-WS 规范;

      JAX-WS 是 sun 公司随 Java 5 发布的一项 webservice 规范,在此之前是JAX-RPC,JAX-RPC 不是很完善;由于 JAX-RPC 并不是很完善,所以在 Java 5 发布后,随即发布了 JAX-RPC2.0,该版本已经比较成熟和完善,后来为了和之前的规范进行区分,又将其改名为JAX-WS 2.0;

      Java 5 对应 JAX-WS 2.0 版本;
      Java 6 对应 JAX-WS 2.1 版本;
      Java 7 对应 JAX-WS 2.2 版本;
      目前 JAX-WS 是 2.2.9

    5.1 webservice服务端

      1、定义一个服务接口及实现,并将实现类注解为@WebService,标注了该注解的类的方法就变为 webservice 方法;

    public interface UserService {
    
        public String sayHi (String name);
    
        public String work (String work);
    
        public User getUser (User user);
    
    }
    
    /**
     * 标注了该@WebService注解的类的方法就变为webservice方法
     */
    @WebService
    public class UserServiceImpl implements UserService {
    
        @Override
        public String sayHi(String name) {
            return "Hi, " + name;
        }
    
        @Override
        public String work (String work) {
            return "He is working " + work;
        }
    
        @Override
        public User getUser (User user) {
            user.setName(user.getName() + "-service");
            return user;
        }
    }
    
    public class User {
    
        private int id;
    
        private String name;
    
        private Date birthday;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }
    

      2、通过 Endpoint 的 publish 方法,将上一步定义的服务发布出去;

    public class Server {
    
        public static void main(String[] args) {
            //发布webservice
            String wsAddress = "http://localhost:6868/01-ws-java-server/ws";
            Endpoint endpoint = Endpoint.publish(wsAddress, new UserServiceImpl());
            System.out.println("webservice发布成功:" + endpoint.isPublished());
        }
    }
    

      3、运行 main 方法;

      4、 在 浏 览 器 里 输入 http://localhost:6868/01-ws-java-server/ws?wsdl 将 会 看 到webservice 的 wsdl 信息;有了服务端的 webservice 描述文件 wsdl,就可以根据这个描述文件开发客户端调用程序
    在这里插入图片描述

    5.2 webservice客户端

      1、根据服务端的 wsdl 文件生成客户端调用代码:
       在命令行输入命令(需要配置了 Java 环境变量):
      wsimport -encoding [编码] -keep -p [包名] [发布的服务地址?wsdl]
    比如:

    wsimport -encoding utf8 -keep -p com.ws.stub -Xnocompile http://localhost:6868/01-ws-java-server/ws?wsdl
    

      其中:
      wsimport 命令
      -encoding 指定生成代码的编码格式
      -keep 保存生成的代码
      -p 指定包名
      -Xnocompile 表示生成的代码不编译

          
    在这里插入图片描述
    在这里插入图片描述
      2、使用生成的代码调用服务端提供的服务;

    public class Client {
    
        public static void main(String[] args) {
    
            //1.创建一个webservice的客户端
            UserServiceImplService userServiceImplService = new UserServiceImplService();
    
            //2.获取远程服务接口对象
            UserServiceImpl userService = userServiceImplService.getUserServiceImplPort();
    
            //3.直接调用远程服务接口对象的方法
            String hi= userService.sayHi("张三丰");
            System.out.println(hi);
    
            String work = userService.work("Java");
            System.out.println(work);
    
            User user = new User();
            user.setId(100);
            user.setName("张无忌");
            user.setBirthday(DateUtils.dateToXmlDate(new Date()));
            User userServer = userService.getUser(user);
            System.out.println(userServer.getId() + "--" + userServer.getName() + "--" + userServer.getBirthday());
        }
    }
    

      注意Date类型要使用工具类特殊处理

    public class DateUtils {
    
        /**
         * 将Date类转换为XMLGregorianCalendar
         *
         * @param date
         * @return
         */
        public static XMLGregorianCalendar dateToXmlDate(Date date){
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            DatatypeFactory dtf = null;
            try {
                dtf = DatatypeFactory.newInstance();
                XMLGregorianCalendar dateType = dtf.newXMLGregorianCalendar();
                dateType.setYear(cal.get(Calendar.YEAR));
                //由于Calendar.MONTH取值范围为0~11,需要加1
                dateType.setMonth(cal.get(Calendar.MONTH)+1);
                dateType.setDay(cal.get(Calendar.DAY_OF_MONTH));
                dateType.setHour(cal.get(Calendar.HOUR_OF_DAY));
                dateType.setMinute(cal.get(Calendar.MINUTE));
                dateType.setSecond(cal.get(Calendar.SECOND));
    
                return dateType;
            } catch (DatatypeConfigurationException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 将XMLGregorianCalendar转换为Date
         *
         * @param cal
         * @return
         */
        public static Date xmlDate2Date(XMLGregorianCalendar cal){
            return cal.toGregorianCalendar().getTime();
        }
    }
    

    6 WDSL文件说明

      service
        整个 webservice 的服务信息,比如服务名,包括所有的服务;
      binding
        定义每个服务接口的消息格式和协议细节;
      portType
        描述整个 webservice 可以被执行的操作及相关信息;
      message
        定义操作的一个或多个数据参数;
      types
        定义 webservice 使用的全部数据类型;

    7 webservice 请求与响应监控

      webservice 的请求和响应是 soap 格式的 xml,可以采用一个端口监听工具 TCPMon,通过这个工具,我们可以非常方便地监听目标端口请求与响应的数据;

      TCPMon 相当于一个“ 拦截器”,所有我们向目标服务器发送的数据包和服务器返回的数据包都要经过这个拦截器(也可以叫作代理服务器),进而拦截到请求和响应的数据包;
    在这里插入图片描述
      如上图,如果不使用监控工具,我们是通过 http://xxx.xxx.xxx:8080 访问服务端的服务;如果使用监控工具,则通过访问监控工具,由监控工具请求服务端的,服务,然后再把结果返回给我们,则访问请求变为:http://xxx.xxx.xxx:9000
      需要访问9000重新生成WDSL,并替换掉之前的WDSL,然后重新发起请求。

    8 webservice 在Tomcat中发布

      1、添加相关依赖

    <?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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.ws</groupId>
        <artifactId>03-ws-web-server</artifactId>
        <version>1.0.0</version>
    
        <dependencies>
            <dependency>
                <groupId>com.sun.xml.ws</groupId>
                <artifactId>jaxws-rt</artifactId>
                <version>2.2.10</version>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    2、编写服务接口

    public interface UserService {
    
        public String sayHi(String name);
    
        public String work(String work);
    
        public User getUser(User user);
    
    }
    

    3、添加服务实现类,并标注@webservice注解

    /**
     * 标注了该@WebService注解的类的方法就变为webservice方法
     */
    @WebService
    public class UserServiceImpl implements UserService {
    
        @Override
        public String sayHi(String name) {
            return "Hi, " + name;
        }
    
        @Override
        public String work (String work) {
            return "He is working " + work;
        }
    
        @Override
        public User getUser (User user) {
            user.setName(user.getName() + "-service");
            return user;
        }
    }
    

    4、在WEB-INF文件夹下创建webservice配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
    
        <!-- 服务路径http://网站路径/ws/userService -->
        <endpoint name="userService"
                  implementation="com.ws.service.impl.UserServiceImpl"
                  url-pattern="/ws/userService" />
    
    </endpoints>
    

    5、在web,xml中添加WSServlet,servlet3.0也可以不添加如下配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             id="WebApp_ID" version="3.0">
    
        <!-- Servlet 3.0或者以上不需要配置 -->
        <servlet>
            <servlet-name>jaxws</servlet-name>
            <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>jaxws</servlet-name>
            <url-pattern>/ws/*</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    调用和之前一样

    9 在Spring中使用webservice

      1、导入依赖

    <?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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.ws</groupId>
        <artifactId>05-ws-spring-web-server</artifactId>
        <version>1.0.0</version>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>4.3.13.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.jvnet.jax-ws-commons.spring</groupId>
                <artifactId>jaxws-spring</artifactId>
                <version>1.9</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

      2、编写服务接口
      3、编写接口的实现类,并添加@webservice注解,需要让spring将该类加载为一个bean,所以需要加上@servcice或者@Component注解

    /**
     * 标注了该@WebService注解的类的方法就变为webservice方法
     */
    @Component
    @WebService
    public class UserServiceImpl implements UserService {
    
        @Override
        public String sayHi(String name) {
            return "Hi, " + name;
        }
    
        @Override
        public String work (String work) {
            return "He is working " + work;
        }
    
        @Override
        public User getUser (User user) {
            user.setName(user.getName() + "-service");
            return user;
        }
    }
    

    4、添加spring配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <import resource="applicationContext-jaxws.xml"/>
    
    </beans>
    

      5、配置spring的jax-ws配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:ws="http://jax-ws.dev.java.net/spring/core"
           xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    		http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd
    		http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd">
    
        <context:component-scan base-package="com.ws.service.impl" />
    
        <!-- 绑定webservice地址,需要与web.xml的地址对应 -->
     	<!-- 访问:http://localhost:8080/webservice-server-spring-web//ws/userService"?wsdl -->
        <!--alt + enter-->
        <wss:binding url="/ws/userService">
            <wss:service>
                <ws:service bean="#userServiceImpl" />
            </wss:service>
        </wss:binding>
    
    </beans>
    

      6、配置web.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             id="WebApp_ID" version="3.0">
    
        <!-- needed for ContextLoaderListener -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    
        <!-- Bootstraps the root web application context before servlet initialization -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!-- 用于配置地址栏请求路径 -->
        <servlet>
            <servlet-name>JaxWsServlet</servlet-name>
            <servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>JaxWsServlet</servlet-name>
            <url-pattern>/ws/*</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

      调用和之前一样

    展开全文
  • JAVA WebService服务jar包

    2019-04-10 14:51:39
    JAVA WebService服务jar包,完全可用 ,真是有效,欢迎下载
  • 自己总结的java webService接口开发案例,希望能够帮助我需要的朋友。
  • Java WebService介绍

    千次阅读 2013-11-05 11:26:12
    Java WebService介绍
  • C#调用JavaWebService

    热门讨论 2013-10-28 10:25:04
    调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
  • C#调用 javawebservice

    2019-07-18 21:30:35
    原来 java 也能开发 webservice ,我一直以为是.net 独有的 是我孤陋寡闻了 java开发WebService 碰到一个问题 C#调用 java 开发的webservice ,不知道如果调用 , 这样可以解决 C#调用 java webservice ...
  • 这几天帮朋友弄一个dotnet 的webservice调用java webservice程序,java这方为服务器端,提供服务,使用XFire写的,客户端用的是dotnet,我们都知道,webservice是用soap协议传输的,不同语言都支持这个协议dotnet更...
  • PB调用JAVA WEBSERVICE实例

    热门讨论 2013-09-13 08:30:24
    JAVA WEBSERVICE 建的实例工程,给PB调用, 因VS建的 WEBSERVICE PB很难调用,所以用JAVA的axis做了个小实例 共大家参考
  • java开发webService完整例子2010-07-27 15:48:17| 分类:JAVA | 标签:java开发webservice完整例子 webservice web service |字号大中小订阅java 调用webservice的各种方法总结现在webservice加xml技术已经逐渐成熟...
  • Java webservice服务动态配置 包含有oracle数据库备份文件和后台配置界面 管理员登陆 admin/admin
  • Java WebService获取request对象 WebService获取HttpServletRequest对象 一、问题描述 在使用WebService时候,遇到需要传递图片的需求,思路是返回服务端的主机名,尝试过静态获取request对象,但在客户端调用时...
  • Java Webservice指定超时时间

    万次阅读 2017-09-25 23:32:35
    Java Webservice指定超时时间使用JDK对Webservice的支持进行Webservice调用时通常的操作步骤如下://1、创建一个javax.xml.ws.Service实例 javax.xml.ws.Service service = javax.xml.ws.Service.create(wsdl, ...
  • 使用 Axis2 调用 Java WebService 接口

    千次阅读 2018-05-18 15:46:30
    使用 Axis2 调用 Java WebService 接口
  • java webservice服务器端获取request对象的三种方式
  • java WebService soa

    2012-01-10 13:52:30
    java WebService soa 详解 看附件 pdf
  • java webservice简单实现

    2015-08-02 20:20:59
    java webservice简单实现 接口(SayHello.java) import javax.jws.WebMethod; import javax.jws.WebService;@WebService public interface SayHello { @WebMethod public String sayHello(String name); } 接口...
  • c#调用java webservice xml "被转译了<>
  • C++ 调用javaWebService接口代码

    热门讨论 2011-12-30 23:58:19
    C++ 调用Java webservice接口的函数,内有个使用说明文档,很详细的
  • java webservice实例教程

    千次阅读 2015-08-02 10:07:04
    java webservice实例教程 源代码下载地址:http://www.zuidaima.com/share/1590350954564608.htm
  • 本人net程序员一枚,最近偶然间接到一个写接口的任务,仔细看了接口文档才发现,该...###JQ调用java webservice 由于这方面资料百度是在太少,于是只能慢慢研究,最终都是通过零星的方法综合起来,达到我要的目的。 ...
  • Java WebService 简单实例 方式一(生成类文件方式)
  • 本文介绍一个通用的通过Java程序调用C#和Java WebService的方法。
  • Java WebService 简单实例 方式二(axis1直接调用方式)
  • Java Webservice Axis2 Client(含soapheader验证)
  • Java WebService接口生成和调用 图文详解

    万次阅读 多人点赞 2017-04-22 10:48:24
    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,846
精华内容 7,138
热门标签
关键字:

javawebservice

java 订阅