webService-jdk开发(2)

 注:内容基本来自网络,例子一抓一片。

2  示例一:使用JDK开发

2.1.JDK开发服务端

2.1.1. 定义接口

package com.zhong.ws;

import javax.jws.WebMethod;

import javax.jws.WebService;

/**

 * WebService接口

 *   接口可以不用任何注解,但实现类必须有注解,

 *    接口用注解的话可以规范实现类,使实现类可读性更高(自己* 理解,可能有误!),

 * @author zhonghai

 */

@WebService

publicinterface IWebService {

   @WebMethod

   String sayHello(String name);

   /**

    * 设置了exclude=true,该方法不会成为服务方法,即客户端*访问不到!

    * @param name

    */

   @WebMethod(exclude=true)

   String byeBye(String name);

}

2.1.2. 实现接口

package com.zhong.ws;

import javax.jws.WebMethod;

import javax.jws.WebParam;

import javax.jws.WebParam.Mode;

import javax.jws.WebResult;

import javax.jws.WebService;

/**

 * WebService 实现类

 * @WebService: 定义服务,在public class上边。

 *      targetNamespace:指定命名空间,默认为倒置的包名。

 *      name:portType的名称(接口名称),默认为实现类+Port

 *      portName:port的名称,默认为实现类+Port

 *     serviceName:服务名称,公开的Web服务接口,默认为实现*+Service

 *@WebResult:定义返回值。

 *      name:返回结果值的名称。

 *@WebParam:定义参数。

 *      name:指定参数的名称。

 *@WebMethod

 *   exclude:排除指定的方法。

 *默认情况下,实现类中所有的public方法会发布成服务方法。

 *如果不想把public方法发布成服务方法,需要使用@WebMethod*解。把此方法排除。在实现类中至少有一个方法发布为服务方法。

 * @author zhonghai

 */

@WebService(serviceName="sayHello",

            name="sayInter",

            portName="sayPort",

         targetNamespace="http://client.ws.zhong.com")

publicclass WebServiceImpl implements IWebService{

   //发布的服务方法

   @Override

   @WebMethod

   public String sayHello(String name) {

      System.out.println("I am "+name);

      return"I am "+name;

   }

  

   /**

    * 发布的服务方法

    * 此方法是实现类独有方法,同样可用

    */

   @WebMethod

   public@WebResult(name="mySayHiResult")String

         StringsayHi(@WebParam(name="myParaName",

//将参数放到头信息中,用于保护参数,默认在body

 

                             header=true,

                              mode=Mode.IN)String name) {

System.out.println("mySayHiResult :my name is "+name);

      return"my name is "+name;

   }

 

   //发布时会排除此方法

   @Override

   @WebMethod(exclude = true)

   public String byeBye(String name) {

     

      return"byeBye "+name;

   }

 

}

 

2.1.3. 发布

package com.zhong.ws;

import javax.xml.ws.Endpoint;

/**

 * 使用Endpoint(终端)类发布webservice

 * @author zhonghai

 */

publicclass HelloServer {

    publicstaticvoid main(String[] args) {

        //定义WebService的发布地址,这个地址就是提供给外界访问WeberviceURL地址,URL地址格式为:http://ip:端口号/xxxx

        //String address ="http://192.168.1.100:8989/";这个WebService发布地址的写法是合法的

        String address = "http://127.0.0.1:12345/sayHello";

        //使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用

        Endpoint.publish(address , new WebServiceImpl());

        System.out.println("发布webservice成功!");

     }

}

结果显示:

 

WebService主要就是通过javax.xml.ws.Endpoint类提供的静态方法publish进行发布,如果是普通的java项目,可以写一个类用于发布WebService,如果是Web项目,可以用ServletContextListener或Servlet(通常在init方法里发布)发布。

地址http://localhost:12345/sayHello?wsdl是一个xml文件,内容如下(说明是自己加的):




2.2. 开发客户端

2.2.1. jdk的wsimort.exe工具生成客户端代码

wsimort.exe工具位于Jdk的bin目录下,执行命令:wsimport -keep url(url为wsdl文件的路径)生成客户端代码。

建一个客户端项目(普通的java项目):


在项目src下,运行wsimport -keep http://localhost:12345/sayHello?wsdl

常用参数为:

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

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

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

注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。

如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。

 

生成的客户端代码:


2.2.2. 服务端方法调用

生成的客户端代码中,主要使用的是SayHello_Service类和SayInter接口,至于这两者的名称主要取决于服务端的注解

 

package com.zhong.ws.main;

importcom.zhong.ws.client.SayHello_Service;

import com.zhong.ws.client.SayInter;

import com.zhong.ws.client.StringsayHi;

importcom.zhong.ws.client.StringsayHiResponse;

/**

 * 调用WebService的客户端

 * @author zhonghai

 */

publicclass WsCilent {

     publicstaticvoid main(String[] args) {

       //创建一个用于产生WebServiceImpl实例的工厂,WebServiceImplService类是wsimport工具生成的

       SayHello_Service factory = new SayHello_Service();

       //通过工厂生成一个WebServiceImpl实例,WebServiceImplwsimport工具生成的

       SayInter wsImpl = factory.getSayPort();

       //调用WebServicesayHello方法

       String resResult = wsImpl.sayHello("zhong");

       System.out.println("调用WebServicesayHello方法返回的结果是:"+resResult);

       System.out.println("---------------------------------------------------");

       StringsayHiResponse stringsayHiResponse = wsImpl.stringsayHi(new StringsayHi(),"zhong");

       System.out.println("调用WebServicestringsayHi方法返回的结果是:"+

                            stringsayHiResponse.getMySayHiResult());

       System.out.println("---------------------------------------------------");

      //调用WebServicebyeBye方法因为设置了@WebMethod(exclude = true) ,所以客户端不能用byeBye方法

//    resResult = wsImpl.byeBye("zhong");

    }

}

结果:

 

 

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值