项目结构
**环境:**IDE采用MyEclipse 2014, JDK 1.7。 这里为了简便,服务端和客户端代码都放在一个项目中,通常服务端会在另一个项目中,由WSDL自动生成客户端部分代码的方法是一样的。
##Service端主要代码 HelloService类中的方法可供客户端调用,这里给了几种常见的注解的用法和自定义对象类型的传递。main方法是必需的,通常会根据需要修改url和端口,之后我们可以通过访问这个路径来生成客户端代码。
package server.source;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
import bean.SimpleBean;
/**
* 使用Web Service注解将Java类标记为实现 Web Service,亦可用 Web Service接口
* - targetNamespace 指定从 Web Service 生成的 WSDL 和 XML 元素的 XML 名称空间。缺省值为从包含该 Web Service 的包名映射的名称空间。
* - serviceName 指定 Web Service 的服务名称: wsdl:service。缺省值为 Java 类的简单名称 + Service。
*/
@WebService(serviceName = "MyService", targetNamespace = "http://webservice")
public class HelloService {
/** - exclude 指定是否从 Web Service 中排除某一方法。缺省值为 false
*/
@WebMethod(exclude = true)
public String excludeMethod(String param) {
return " exclude method : " + param;
}
/** - operationName 指定与此方法相匹配的 wsdl:operation 的名称。缺省值为 Java 方法的名称
*/
@WebMethod(operationName = "aliasMethod")
@WebResult(name = "myReturn")
public String any(@WebParam(name = "name") String param) {
return "alias method : " + param;
}
public String simpleMethod(String param) {
return "simpleMethod : " + param;
}
//自定义类型的传递
public List<SimpleBean> getSimpleBeanList() {
List<SimpleBean> list = new ArrayList<SimpleBean>();
list.add(new SimpleBean("yang", 23, new Date()));
list.add(new SimpleBean("Matrix", 33, new Date()));
return list;
}
//service的输出不会给client端看到
public void printSimpleBean(SimpleBean bean) {
System.out.println(bean.toString());
}
//要输出至client端可以返回string
public String simpleBean2String(SimpleBean bean) {
return bean.toString();
}
public static void main(String[] args) {
/**
* 发布WebService,注意如果提示:Exception in thread "main" com.sun.xml.internal.ws.server.ServerRtException:
* Server Runtime Error: java.net.BindException: Address already in use: bind
* 则需要修改一下发布端口
*/
Endpoint.publish("http://localhost:8011/helloService", new HelloService());
System.out.println("Server startup...");
}
}
运行并测试Service端
在HelloService类上右键,选择Run as -> Java Application, 看到控制台输出如下信息即正常
在浏览器中输入方法中的地址http://localhost:8011/helloService 可以看到helloService的相关信息,其中WSDL中有helloService的描述,包括方法、参数、返回值等等。 ##生成Client端 创建一个Web Service CLient,在New -> Other中选择Web Service CLient
WSDL可以通过两种方式引入,本地WSDL文件或者URL路径,这里自然是URL方式。
生成的客户端代码,放在webservice包下面
##Client端调用测试代码
package client;
import java.util.GregorianCalendar;
import java.util.List;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import webservice.HelloService;
import webservice.MyService;
import webservice.SimpleBean;
public class HelloWsTest {
public static void main(String[] args) {
//通过MyService类获取HelloService实例
HelloService helloService = new MyService().getHelloServicePort();
System.out.println(helloService.aliasMethod("test")); //方法别名调用
System.out.println(helloService.simpleMethod("simpleName")); //方法名调用
List<SimpleBean> list = helloService.getSimpleBeanList(); //自定义类型列表获取
for(SimpleBean sb : list) {
System.out.println(sb);
helloService.printSimpleBean(sb); //此处在Service端打印
System.out.println(helloService.simpleBean2String(sb)); //返回字符串到客户端打印
System.out.println(sb.getName() + " | age=" + sb.getAge());
}
SimpleBean bean = new SimpleBean();
bean.setName("inputBean");
bean.setAge(11);
try {
bean.setDate(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
} catch (DatatypeConfigurationException e) {
e.printStackTrace();
}
helloService.printSimpleBean(bean); //传递对象给Service端,后续进行其他操作
}
}
##运行 在HelloWsTest类上右键,选择Run as -> Java Application,控制台中Service端的输出信息如下:
切换查看Client端的输出信息:
##项目地址 项目地址戳这里