1.webservice的创建:创建一个接口、创建服务、开启服务
2.SEI(Service Endpoint Interface)服务提供的接口,SIB(Service Implemention Bean)服务实现的bean。
3.注解
@WebService添加注解指明这个接口是我们要实现的webservice接口(接口和实现类都必须添加)。
@WebService(endpointInterface="cxfSever.IEmployeeService",serviceName="EmployeeService"),endpointInterface接入点接口,serviceName命名接口服务的名称(在实现类中添加)
@WebParam、@WebResult给参数名添加注解,因为如果没有注解参数会被命名arg0用SOAPUI等工具解析之后不利于阅读。(接口方法中添加)
4.代码实例
首先定义使用到的DTO类
public class Employee
{
private int id;
private String name;
private String address;
public Employee()
{
}
public Employee(String name,String address)
{
this.id = name.hashCode();
this.name = name;
this.address = 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;
}
}
定义服务端接口
@WebService
public interface IEmployeeService
{
@WebResult(name="saveResult") boolean save(@WebParam(name="e") Employee e);
@WebResult(name="deleteResult") boolean delete(@WebParam(name="name") String name);
@WebResult(name="updateResult") String update(@WebParam(name="e") Employee e);
@WebResult(name="selectResult") Employee select(@WebParam(name="id") int id);
}
定义接口的实现类
@WebService(endpointInterface="cxfSever.IEmployeeService",serviceName="EmployeeService")
public class EmployeeService implements IEmployeeService
{
@Override
public boolean save(Employee e)
{
System.out.println("ID="+e.getId()+"name="+e.getName()+"address="+e.getAddress());
return false;
}
@Override
public boolean delete(String name)
{
System.out.println("删除name="+name);
return false;
}
@Override
public String update(Employee e)
{
System.out.println(e.getName());
return e.getName();
}
@Override
public Employee selete(int id)
{
System.out.println(id);
return new Employee("fjia","盐田");
}
}
发布服务可通过http://localhost:8088/EmService?wsdl查看服务是否发布成功。
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(EmployeeService.class);//设置具体实现类
factory.setAddress("http://localhost:8088/EmService"); //设置发布地址
Server server = factory.create();
server.start();
System.out.println("ws启动成功");
另一种发布方式
EmployeeService employeeService = new EmployeeService();
Endpoint.publish("http://localhost:8088/EmService", employeeService);
System.out.println("ws启动成功");
3.客户端代码
客户端的DTO类和接口要和服务器端的一致,我们调用接口的方法如下。
//创建webservice客户端代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//设置webservice地址
factory.setAddress("http://localhost:8088/EmService");
//注册webservice接口
factory.setServiceClass(IEmployeeService.class);
IEmployeeService emService = (IEmployeeService)factory.create();
emService.save(new Employee("fjia","盐田"));
emService.delete("sean");
System.out.println(emService.update(new Employee("sean","盐田")));
Employee employee = emService.selete("fjia".hashCode());
System.out.println(employee.getName());
另一种获得发布的服务调用接口
//服务的发布地址
String address = "http://localhost:8088/EmService?wsdl";
URL url = new URL(address);
//用命名空间(wsdl文件中的命名空间)和服务名称创建Qname对象相当于创建了一个节点(<EmployeeService xmlns="http://cxfServer/">)
QName qname = new QName("http://cxfServer/","EmployeeService");
//创建Service
Service service = Service.create(url, qname);
IEmployeeService employeeService = service.getPort(IEmployeeService.class);
System.out.println(employeeService.update(new Employee("sean","盐田")));
4.上面客户端调用的情况中都用到服务端的DTO类和SEI,但实际开发中我们往往接口提供商不会给我们这些内容,只给我们一个wsdl的地址给我调用。这时我们就可以使用JDK自带的名另“wsimport”命令来生成我们所需的内容。
其中-d 指定生成的目录
-keep 指定是否生成.java的源文件
-verbose 显示生成的详细信息
最后是网络中的wsdl文件。
我们看到生成的文件中除了IEmployeeService接口,还生成了一个以服务名称为类名的类这个类不是服务端的那个接口实现类,但是我们可以通过这个类快速的获得接口服务。
将生成的文件拷贝到客户端对应的包中,我们还可以这样调用webservice接口;
//生成的这个类并没有实现IEmployeeService接口(跟接口IEmployeeService没什么关系),而是继承类Service类
EmployeeService service = new EmployeeService();
//可直接获得服务端发布的服务
IEmployeeService employeeService = service.getEmployeeServicePort();
Employee employee = new Employee();
employee.setName("sean");
employee.setAddress("盐田");
System.out.println(employeeService.update(employee));
5.wsdl简单分析
wsdl中主要包含的元素:
type:用来定义访问的类型
message:主要是SOAP
portType:指明服务的接口,并通过operation绑定相应的in和out消息,其中in表示参数,out表示返回值。
binding:指定传递消息使用的格式
service:指定服务所发布的名称
6.webservice调试工具eclipse中的webservice浏览器、TCPMon、soapUI等调试。