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的发布地址,这个地址就是提供给外界访问Webervice的URL地址,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实例,WebServiceImpl是wsimport工具生成的
SayInter wsImpl = factory.getSayPort();
//调用WebService的sayHello方法
String resResult = wsImpl.sayHello("zhong");
System.out.println("调用WebService的sayHello方法返回的结果是:"+resResult);
System.out.println("---------------------------------------------------");
StringsayHiResponse stringsayHiResponse = wsImpl.stringsayHi(new StringsayHi(),"zhong");
System.out.println("调用WebService的stringsayHi方法返回的结果是:"+
stringsayHiResponse.getMySayHiResult());
System.out.println("---------------------------------------------------");
//调用WebService的byeBye方法因为设置了@WebMethod(exclude = true) ,所以客户端不能用byeBye方法
// resResult = wsImpl.byeBye("zhong");
}
}
结果: