JAX-WS(java api xml webservice)

创建服务器端

1.创建一个接口

IMyService.java

package com.test.service;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

// SEI(Service Endpoint Interface)
@WebService
public interface IMyService {
	@WebResult(name = "addResult")
	public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b);
}

 

2.创建实现接口的类

MyServiceImpl.java

package com.test.service;

import javax.jws.WebService;

// SIB(Service Implemention Bean)
@WebService(endpointInterface = "com.test.service.IMyService")
public class MyServiceImpl implements IMyService {
	@Override
	public int add(int a, int b) {
		return a + b;
	}
}

 

3.开启服务

MyServer.java

package com.test.service;

import javax.xml.ws.Endpoint;

public class MyServer {
	public static void main(String[] args) {
		String address = "http://localhost:9999/server";
		// 发布服务的实现类
		Endpoint.publish(address, new MyServiceImpl());
	}
}

 

在浏览器中输入:http://localhost:9999/server?wsdl就可以访问webservice所提供的服务

客户端访问

MyClient.java

package com.test.service;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class MyClient {
	public static void main(String[] args) {
		try {
			// 创建访问wsdl服务地址的url
			URL url = new URL("http://localhost:9999/server?wsdl");
			// 通过QName指明服务的具体信息
			QName qName = new QName("http://service.test.com/", "MyServiceImplService");
			// 创建服务
			Service service = Service.create(url, qName);
			// 实现接口
			IMyService ms = service.getPort(IMyService.class);
			System.out.println(ms.add(12, 13));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
}

 

这里有个问题:service获取实现接口的类时,要依赖于IMyService接口

这里,通过java提供的wsimport命令把wsdl导成.java.class,就不需要依赖于IMyService接口了,如下图:
JAX-WS(java api xml webservice)
 

-d:指定生成的目录;

-keep:指定是否生成java的源代码,如果没有-keep,只能生成.class二进制文件;

-verbose:显示生成的详细过程;其后跟着网络中wsdl的文件;

-p:指定生成的包;(很少用到)

生成文件如下图:


JAX-WS(java api xml webservice)
 

接着创建独立的java项目,把这些java文件拷贝到src下面,再次创建客户MyClient.java

package com.test.service;

public class MyClient {
	public static void main(String[] args) {
		MyServiceImplService msis = new MyServiceImplService();
		IMyService ms = msis.getMyServiceImplPort();
		System.out.println(ms.add(12, 13));
	}
}

 

这个时候service获取实现接口的类时,就不需要依赖于IMyService接口了