zoukankan      html  css  js  c++  java
  • WebService学习总结(二)--使用JDK开发WebService

     

     

    一、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接口
    @WebService
    public 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
     * 具体实现
     *
     */
    
    @WebService
    public 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
     * 使用监听器发布
     * 
     */
    
    @WebService
    public 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中配置:

      <listener>
        <listener-class>com.myl.ws.ulistener.WebServicePublishListener</listener-class>
      </listener>

      在此环境下报错

      解决方法:

      在@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配置

      <servlet>
          <servlet-name>webservicepublish</servlet-name>
          <servlet-class>com.myl.ws.usevlet.WebServicePublishServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>

    如果不在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:MyeclipseWorkspaceWebServletsrc  -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 生成的一样,调用方法也一样

  • 相关阅读:
    artDialog基本使用
    SQL数据类型(SQL Server六个类型使用)
    常用SQL语句大全(SQL Server)
    从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1
    从PRISM开始学WPF(番外)共享上下文 RegionContext-更新至Prism7.1
    从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1
    从PRISM开始学WPF(六)MVVM(二)Command-更新至Prism7.1
    从PRISM开始学WPF(四)Prism-Module-更新至Prism7.1
    从PRISM开始学WPF(二)认识Prism-更新至Prism7.1
    从PRISM开始学WPF(一)认识WPF-更新至Prism7.1
  • 原文地址:https://www.cnblogs.com/maoyali/p/8833499.html
Copyright © 2011-2022 走看看