博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebService学习总结(二)--使用JDK开发WebService
阅读量:5359 次
发布时间:2019-06-15

本文共 6089 字,大约阅读时间需要 20 分钟。

 

 

一、WebService的开发方法

  使用java的WebService时可以使用一下两种开发手段

    使用jdk开发(1.6及以上版本)

    使用CXF框架开发(工作中)

二、使用JDK开发WebService

2.1、开发WebService服务器端

    1、定义一个interface,使用@WebService注解标注接口,使用@WebMethod注解标注接口中定义的所有方法,如下所示:

package com.myl.ws;import javax.jws.WebMethod;import javax.jws.WebService;/** *  * @author maoyl * @version 2018.4.14 * 定义SEI(WebService EndPoint Interface(终端)) *  *///使用@WebService注解标注WebServiceI接口@WebServicepublic interface WebServiceInf {        @WebMethod    public String sayHello(String name);        @WebMethod    public String save(String name, String pwd);    }

  2、编写interface的实现类,使用@WebService注解标注实现类,实现接口中定义的所有方法,如下所示:

package com.myl.ws.impl;import javax.jws.WebService;import com.myl.ws.WebServiceInf;/** *  * @author myl * 具体实现 * */@WebServicepublic class WebServiceInfImpl implements WebServiceInf {    @Override    public String sayHello(String name) {        System.out.println("WebService :" + name + ", 欢迎您");        return name + "欢迎您";    }    @Override    public String save(String name, String pwd) {        System.out.println("name:" + name + ",password:" + pwd + "登录成功");        return name + "登录成功";    }}

 

  3、使用Endpoint(终端)类发布webservice,代码如下:

package com.myl.ws;import javax.xml.ws.Endpoint;import com.myl.ws.impl.WebServiceInfImpl;/** *  * @author maoyl * @version 2018.4.14 * 测试 *  */public class WebServicePublish {  public static void main(String[] args) {    String address = "http://192.168.1.2:5555/WS_Server/Webservice";    Endpoint.publish(address, new WebServiceInfImpl());     System.out.println("发布成功");   } }

 

  运行WebServicePublish类,就可以将编写好的WebService发布好了,WebService的访问URL是:http://192.168.1.2:5555/WS_Server/Webservice?wsdl

  ,如下图所示

 

 

  这里我们编写了一个WebServicePublish类来发布WebService,如果是Web项目,那么我们可以使用监听器或者Servlet来发布WebService,如下:

   1.使用监听器发布

package com.myl.ws.ulistener;import javax.jws.WebService;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.xml.ws.Endpoint;import com.myl.ws.impl.WebServiceInfImpl;/** *  * @author maoyl * @version 2018.4.14 * 使用监听器发布 *  */@WebServicepublic class WebServicePublishListener implements ServletContextListener {    @Override    public void contextDestroyed(ServletContextEvent arg0) {        // TODO Auto-generated method stub    }    @Override    public void contextInitialized(ServletContextEvent arg0) {        String address = "http://192.168.1.2:5555/WS_Server/Webservice";        Endpoint.publish(address, new WebServiceInfImpl());        System.out.println("使用ServletContextListener发布成功---------");    }}

 

  监听器在web.xml中配置:

com.myl.ws.ulistener.WebServicePublishListener

  在此环境下报错

  解决方法:

  在@WebService标注的类上加上 @SOAPBinding(style = Style.RPC)即可解决

 

import javax.jws.soap.SOAPBinding;

import javax.jws.soap.SOAPBinding.Style;

@WebService@SOAPBinding(style = Style.RPC)public interface WebServiceInf {...}//---------------

import javax.jws.soap.SOAPBinding;

import javax.jws.soap.SOAPBinding.Style;

@WebService@SOAPBinding(style = Style.RPC)public class WebServiceInfImpl implements WebServiceInf {...}

  查看资料:将jdk升级到jdk 1.6u17以上版本不加@SOAPBinding(style = Style.RPC)也不会有错了,(貌似试了一下jdk1.7也要加,ps:如果报上面的错误就加上就好了)

 

  2.使用Servlet发布WebService

 

package com.myl.ws.usevlet;import javax.servlet.http.HttpServlet;import javax.xml.ws.Endpoint;import com.myl.ws.impl.WebServiceInfImpl;/** *  * @author myl * 用于发布WebService的Servlet */public class WebServicePublishServlet extends HttpServlet {    public void init (){        String address = "http://192.168.1.2:5555/WS_Server/Webservice";        Endpoint.publish(address, new WebServiceInfImpl());        System.out.println(address + "-------------------");    }        }

 

servlet在web.xml配置

webservicepublish
com.myl.ws.usevlet.WebServicePublishServlet
1

 

如果不在web.xml配置,则需要在servlet实现类中加上 @WebServlet(value="",loadOnStartup=0) 

/** *  * @author myl * 用于发布WebService的Servlet *///将value属性设置为空字符串,这样WebServicePublishServlet就不提供对外访问的路径//loadOnStartup属性设置WebServicePublishServlet的初始化时机@WebServlet(value="",loadOnStartup=0)public class WebServicePublishServlet extends HttpServlet {...}

将Web应用部署到服务器运行时,在初始化WebServicePublishServlet时,就会发布WebService了。如下图所示:

同时用listener和servlet则显示

关于发布WebService主要就是通过javax.xml.ws.Endpoint类提供的静态方法publish进行发布,如果是普通的java项目,那么可以专门写一个类用于发布WebService,如果是Web项目,那么可以使用ServletContextListener或者Servlet进行发布。

 

2.2、开发WebService客户端

  1、借助jdk的wsimort.exe工具生成客户端代码,wsimort.exe工具位于Jdk的bin目录下,如下图所示:

  执行命令:wsimport -keep url(url为wsdl文件的路径)生成客户端代码。

  注:-s 选择生成文件的位置    

    -p 在该位置创建生成的文件夹作为生成位置

    如果不用-s  -p 则在当前文件夹下生成生成客户端代码

    如: wsimport -s F:\MyeclipseWorkspace\WebServlet\src  -p com.myl.webservice.service -keep http://192.168.1.2:5555/WS_Server/Webservice?wsdl

显示如上 则表示生成成功

 

 

2、 借助生成的代码编写调用WebService对外提供的方法

  wsimport工具帮我们生成了好几个java类,但我们只需要关心 WebServiceInfImplService 类和 WebServiceInfImpl 接口的使用即可,如下所示:

package com.myl.webservice.client;import com.myl.webservice.service.WebServiceInfImpl;import com.myl.webservice.service.WebServiceInfImplService;/** *  * @author myl * @version 2018.4.14 * 调用WebService的客户端 */public class Test {        public static void main(String[] args) {        //创建一个用于产生WebServiceInfImpl实例的工厂,WebServiceInfImplService类是wsimport工具生成的        WebServiceInfImplService factory = new WebServiceInfImplService();         //通过工厂生成一个WebServiceInfImpl实例,WebServiceInfImpl是wsimport工具生成的        WebServiceInfImpl wsImpl = factory.getWebServiceInfImplPort();        //调用WebService的sayHello方法        String resResult = wsImpl.sayHello("maoyl");        System.out.println("调用WebService的sayHello方法返回的结果是:"+resResult);        //调用WebService的save方法        resResult = wsImpl.save("maoyal", "123");         System.out.println("调用WebService的save方法返回的结果是:"+resResult);            }}

 

 

客户端返回结果

 

服务器端接收到结果

 

 

  从调用返回的结果显示,借助wsimport工具生成的客户端代码已经成功调用到了WebService中的方法。以上就是使用JDK开发WebService的相关内容。

 

  2.生成客户端代码也可以通过Myeclipse编辑器生成

    创建客户端项目,右击项目 new -Other.. 选择 Web Service Client

Next

Next

Next --   Finish

 

 此方法生成的客户端代码和 wsimport -keep url 生成的一样,调用方法也一样

 

转载于:https://www.cnblogs.com/maoyali/p/8833499.html

你可能感兴趣的文章
利用bootstrap和webform的异步CRUD及分页
查看>>
HDUOJ 1879继续畅通工程(并查集)
查看>>
OC12_自动释放池
查看>>
Saiku资源帖
查看>>
解决手机页面中点击文本框,网页放大问题
查看>>
2-5
查看>>
牛客多校3 A-PACM Team(状压降维+路径背包)
查看>>
HDU - 4284 Travel(floyd+状压dp)
查看>>
1027 制作表格
查看>>
Android之Socket通信、List加载更多、Spinner下拉列表
查看>>
面向对象的介绍与特性
查看>>
typing-python用于类型注解的库
查看>>
20189215 2018-2019-2 《密码与安全新技术专题》第13周作业
查看>>
第四周作业
查看>>
一、HTML基础
查看>>
蓝牙进阶之路 (002) - HC-05与HC-06的AT指令的区别(转)
查看>>
mysql的limit经典用法及优化
查看>>
C#后台程序与HTML页面中JS方法互调
查看>>
mysql 同一个表中 字段a 的值赋值到字段b
查看>>
linux系统可执行文件添加环境变量使其跨终端和目录执行
查看>>