1,在JDK1.6中JAX-WS规范定义了如何发布一个WebService服务。
JAX-WS是指:Java API Base XML for WebService.
所以必须使用JDK1.6以后的版本才可以。
可以参看JAX-WS白皮书。(皮儿是白的,所以是白皮书。。。。。。 -_-#)
白皮书中的推荐开发步骤:
(1),创建一个服务端点接口SEI,包含你希望发布的服务方法。在为这个接口开发一个实现类。
(2),为这个实现类添加一个注解:@WebService。
(3),为你的service生成一个WSDL文件。
(4),发布你的service。
2,实例开发:
(1)发布一个WebService:
这里直接建立一个类,先不提供接口。
建立一个Java项目,新建一个HelloWorld类。
/**
* webservice开发步骤:
* 1,一般是先开发一个接口,并定义希望发布的方法,并为这个接口开发实现类,实现方法。这里直接定义一个类,实现方法的发布。
* 2,在这个类上添加注解 @WebService
* 3,为service生成WSDL文档。
* 4,发布。
* @author 许智敏
*/
@WebService
public class HelloWorld {
public void sayHello() {
System.out.println("hello webservice!!!");
}
public static void main(String[] args) {
//通过Endpoint发布。
Endpoint endpoint = null;
endpoint =
Endpoint.publish("http://192.168.0.104:8989/hello", new HelloWorld());
System.out.println("发布成功");
}
}
上例中的publish中的第一个参数是url,
其中,前面是服务器的ip,8989是端口号,这个端口号随便定义,后面的hello是服务名,也随便定义。
这就将HelloWorld的sayHello()方法发布到服务中,可以提供远程调用。
在浏览器中输入http://192.168.0.104:8989/hello?wsdl,可以获取生成的WSDL文档。如下:
至此服务发布成功。
(2)根据WSDL生成java代码
在浏览器中可以看到生成的WSDL文档,根据之前的获取手机号码归属地的案例,可以用同样的方法获取这个WSDL的Java文件。
本来写了一个类,但是产生了好多类。这是根据WSDL文档解析出来的。
(3)编写客户端代码,远程访问服务器提供的sayHello()方法。
新建一个Java工程,模拟两个服务器之间的调用。
将刚生成的包目录结构复制到src下。
新建立一个TestMain测试文件。
在TestMain中远程访问。
分析WSDL文档,根据WSDL文档编写客户端代码。
1).首先要知道new谁,根据文档下方的<service name="HelloWorldService">可知,我们可以new一个HelloWorldService类。
2).在根据下面的port的name,得知new的这个类中存在的一个get方法:
<port name="HelloWorldPort" binding="tns:HelloWorldPortBinding">
可知,在HelloWorldService中一定有一个getHelloWorldPort()方法。
3).调用这个get方法,获取了HelloWorld。这时返回的是HelloWorld接口。也就是根据服务器的HelloWorld类建立的接口,里面有所有的可以调用的方法。
4).通过HelloWorld就可以调用提供的服务sayHello()方法。
public class TestMain {
public static void main(String[] args) {
HelloWorldService helloWorldService = new HelloWorldService();
HelloWorld helloWorld = helloWorldService.getHelloWorldPort();
helloWorld.sayHello();
}
}
5).在控制台可以看到打印的信息:
发布成功
hellowebservice!!!
至此客户端访问成功。
注意:如果服务器的代码发生了改动,客户端需要重新根据WSDL生成Java代码,并覆盖之前工程中的代码,并实现。