发布一个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中了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

posted @ 2018-03-13 13:50  半生戎马,共话桑麻、  阅读(821)  评论(0)    收藏  举报
levels of contents