发布一个Webservice服务,并调用【使用wsimport命令生成客户端代码】
要求JDK1.6以上,才能发布Webservice服务
新建一个Java项目,项目结构:

package com.lvshitech.webservice;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/* WebService服务端:发布一个WebService服务,并调用 */
@WebService // 标记类或接口,表示此类或接口可以实现(发布)WebService服务
public class WebServer {
public static void main(String[] args) {
/*
* Endpoint:终端
* publish:创建一个终端
* 第一个参数:服务地址
* 第二个参数:终端的实现者,即当前类对象
*/
Endpoint.publish("http://192.168.1.5:6789/hello", new WebServer());
}
}
运行报错:说没有一个有效的方法,即该类没有提供Webservice服务的方法,其中main方法不能被外面调用,因为是static的,所以这个类声明的方法不能被static或final关键字修饰
Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException: The web service defined by the class com.lvshitech.webservice.WebServer does not contain any valid WebMethods.
at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:233)
at com.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:328)
at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:190)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:498)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:246)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:170)
at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:113)
at javax.xml.ws.Endpoint.publish(Endpoint.java:240)
at com.lvshitech.webservice.WebServer.main(WebServer.java:17)
声明一个普通的方法,这个方法将来是被外界调用的,是本Webservice服务提供的方法
package com.lvshitech.webservice;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/* WebService服务端:发布一个WebService服务,并调用 */
@WebService // 标记类或接口,表示此类或接口可以实现(发布)WebService服务
public class WebServer {
// 服务方法
public String sayHello(String name) {
return "Hello " + name;
}
public static void main(String[] args) {
/*
* Endpoint:终端
* publish:创建一个终端
* 第一个参数:服务地址
* 第二个参数:终端的实现者,即当前类对象
*/
Endpoint.publish("http://192.168.1.5:6789/hello", new WebServer());
}
}
运行没有报错,怎么查看已经发布的服务?Webservice服务的信息使用xml文件来表示,这个文件相当于Webservice服务的使用说明书,包含了服务地址,服务名称,服务方法等信息
打开浏览器,输入服务地址:http://192.168.1.5:6789/hello?wsdl,得到xml文件:

只要看到这个信息,说明Webservice服务发布成功,已经可以被外界调用了,下面再添加一个服务方法,sayHello2,再发布看看结果:
package com.lvshitech.webservice;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/* WebService服务端:发布一个WebService服务,并调用 */
@WebService // 标记类或接口,表示此类或接口可以实现(发布)WebService服务
public class WebServer {
// 服务方法
public String sayHello(String name) {
return "Hello " + name;
}
public String sayHello2(String name) {
return "Hello " + name;
}
public static void main(String[] args) {
/*
* Endpoint:终端
* publish:创建一个终端
* 第一个参数:服务地址
* 第二个参数:终端的实现者,即当前类对象
*/
Endpoint.publish("http://192.168.1.5:6789/hello", new WebServer());
}
}

可以发现,有两个可以调用的服务方法。
注意:以上的服务地址的192.168.1.5必须是自己的电脑IP地址
// 如果不想此方法被外界访问,可以添加注解
@WebMethod(exclude=true)
public String sayHello2(String name) {
return "Hello " + name;
}
执行:发现没有了sayHello2方法了
怎么调用以上的方法呢?
再创建一个Java工程(这个相当于客户端,用来调用上面服务器端的服务的)

首先做个测试,打开cmd命令行窗口,输入:wsimport,回车,可以看到打印下面的信息

说明这个命令是在JDK的bin目录下存在的,打开JDK的安装目录,发现了这个命令:

上面的信息中有一项是生成源码的命令选项:

在要生成源码的目录下打开命令行,执行:wsimport -s . http://192.168.1.5:6789/hello?wsdl,回车

去G:\WebServiceSource目录下,生成了一些文件,这些文件就是Webservice服务的源码,可以直接调用的:

把以上的.class文件全部删掉,把所有的.java文件拷贝到客户端工程中的一个package下:

怎么调用sayHello方法呢?
在客户端工程中新建一个方法,用来调用服务端的webservice服务:

package com.lvshitech.client;
import com.lvshitech.webservice.WebServer;
import com.lvshitech.webservice.WebServerService;
/* 调用Webservice服务,以下全部根据WSDL(就是在浏览器中生成的xml文件) */
public class Client {
public static void main(String[] args) {
/**
* 获取服务:<service name="WebServerService">
*/
WebServerService wss = new WebServerService();
/**
* 获取终端Endpoint:<port name="WebServerPort" binding="tns:WebServerPortBinding">
*/
WebServer ws = wss.getWebServerPort();
// 调用方法
String serverMsg = ws.sayHello("Peter");
System.out.println(serverMsg);
}
}
启动服务端,再执行客户端代码进行调用服务端Webservice服务,客户端输出:

验证是不是调用服务端代码:修改服务端代码:
package com.lvshitech.webservice;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/* WebService服务端:发布一个WebService服务,并调用 */
@WebService // 标记类或接口,表示此类或接口可以实现(发布)WebService服务
public class WebServer {
// 服务方法
public String sayHello(String name) {
System.out.println("Webserver_client:sayHello()...");
return "Hello " + name;
}
// 如果不想此方法被外界访问,可以添加注解
@WebMethod(exclude=true)
public String sayHello2(String name) {
return "Hello " + name;
}
public static void main(String[] args) {
/*
* Endpoint:终端
* publish:创建一个终端
* 第一个参数:服务地址
* 第二个参数:终端的实现者,即当前类对象
*/
Endpoint.publish("http://192.168.1.5:6789/hello", new WebServer());
System.out.println("WebServer is Ready...");
}
}
启动服务端:

启动客户端:

服务端信息:可以显示客户端调用服务端代码的情况

另外:
使用 -p 命令选项可以生产其他的package名称:wsimport -p 自定义package -s . http://192.168.1.5:6789/hello?wsdl,这样生产的源码就在自定义的package中了


浙公网安备 33010602011771号