使用jaxws开发webservice(1)——入门
JAX-WS2.0 的全称为 Java API for XML-Based Webservices (JAX-WS) 2.0。JAX-WS 2.0 是对 JAX-RPC 1.0 规范的扩展,是 JAX-RPC 1.1 的后续版本, JAX-RPC 2.0 标准发布不久后便被重新命名为 JAX-WS 2.0。
解压后目录如下
bin目录下wsgen指令根据java类生成webservice服务端,wsimport指令根据wsdl生成客户端。
- 通过java类开发webservice服务端
编写java类Hello,以后作为webservice发布。该类有一个say方法,传入Student对象,返回一个list。用@WebService注释该类,@WebMethod注释say方法。
@WebService
public class Hello {
@WebMethod
public List<String> say(Student s) {
List<String> list = new ArrayList<String>();
list.add(s.getId()+"");
list.add(s.getName());
list.add(s.getAddress());
return list;
}
}
public class Student {
private int id;
private String name;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
使用命令wsgen生成代码和wsdl文件
wsgen -cp E:\workspace\work\HelloWorldServer\WebContent\WEB-INF\classes com.test.Hello -wsdl -s src -r wsdl -Xendorsed
-cp 表示Hello类的class路径
-wsdl 表示生成webservice
-s 表示生成java文件的路径,这里在当前路径下的src目录下面
-r 表示生成wsdl文件的路径,这里在当前路径下的wsdl目录下面
将-s目录下生成的java文件放入工程的src目录下
将-r目录下生成的wsdl和xsd文件放入WEB-INF的wsdl目录下面
在WEB-INF目录下面新建sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'> <endpoint name='Hello' implementation='com.test.Hello' url-pattern='/HelloService' /> </endpoints
在web.xml里面添加
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/HelloService</url-pattern>
</servlet-mapping>
最后工程结构如下
发布到tomcat后可以通过http://localhost:8080/HelloWorldServer/HelloService?wsdl获得wsdl文件
- 通过wsdl生成客户端代码
客户端分为同步和异步。
同步调用指令
wsimport -keep -s src wsdl/HelloService.wsdl -Xendorsed
-s 表示生成java文件的路径,这里在当前路径下的src目录下面
测试代码
HelloService service = new HelloService(new URL("http://localhost:8080/HelloWorldServer/HelloService?wsdl"));
Hello port = service.getHelloPort();
Student s = new Student();
s.setId(1);
s.setName("yel");
s.setAddress("aaaaa");
List<String > list = port.say(s);
for(String l : list){
System.out.println(l);
}
异步调用指令
wsimport -keep -b binding.xml -s src wsdl/HelloService.wsdl -Xendorsed
要在当前目录下新建binding.xml
<?xml version="1.0" encoding="UTF-8"?> <bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="wsdl/HelloService.wsdl" xmlns="http://java.sun.com/xml/ns/jaxws"> <bindings node="wsdl:definitions"> <enableAsyncMapping>true</enableAsyncMapping> </bindings> </bindings>
测试代码
HelloService service = new HelloService(new URL(
"http://localhost:8080/HelloWorldServer/HelloService?wsdl"));
Hello port = service.getHelloPort();
Student s = new Student();
s.setId(1);
s.setName("yel");
s.setAddress("aaaaa");
port.sayAsync(s, new AsyncHandler<SayResponse>() {
public void handleResponse(Response<SayResponse> res) {
SayResponse callNameResponse = null;
try {
callNameResponse = res.get();
List<String> list = callNameResponse.getReturn();
for (String l : list) {
System.out.println(l);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
});
Thread.sleep(1000);