本文的核心内容:WebService三要素、开发一个WebService程序、CXF本地版
一:WebService
WebService,即网络服务,是一种跨编程语言、跨操作系统、跨平台的远程调用技术。
应用实例:360导航的天气预报信息等。
WebService的三要素
WSDL: 网络服务的定义语言(Web Service Definition Language ),使用XML用以描述WebService服务信息(服务名、服务提供的功能及其实现类、参数、响应类型),通俗理解WSDL是WebService的使用说明书。
SOAP:简单对象访问协议(Simple Object Access Protocol),是一种简单的基于HTTP+XML的数据交换协议。SOAP=HTTP(协议)+XML(数据格式)。
UDDI(不重要):目录服务(Universal Description, Discovery and Integration )。企业可以将自己提供的WebService注册在UDDI,也可以使用别的企业在UDDI注册的WebService服务,从而达到资源共享,促进全球经济合作。
二:使用WebService开发第一个程序。
服务的提供方:
提供服务接口+服务接口的实现
接口源码:
import javax.jws.WebService;
import java.util.ArrayList;
/**
* Created by Maps on 2018/6/11.
* @WebService服务标记接口
*/
@WebService
public interface JAXService {
//返回值类型不能为接口 【ArrayList接口的实现类】
public ArrayList<String> getInfo(String key);
}
接口实现类源码:
import com.jaxws.service.JAXService;
import javax.jws.WebService;
import java.util.ArrayList;
/**
* Created by Maps on 2018/6/11.
* @WebService服务标记接口实现类
*/
@WebService
public class JAXServiceImpl implements JAXService{
@Override
public ArrayList<String> getInfo(String key) {
ArrayList<String> list=new ArrayList<String>();
if("101".equals(key)){
list.add("name=Jack");
list.add("age=12");
list.add("sex=man");
}else if("102".equals(key)){
list.add("name=Tom");
list.add("age=13");
list.add("sex=man");
}else{
list.add("name=Jane");
list.add("age=23");
list.add("sex=woman");
}
return list;
}
}
发布服务类源码:
import com.jaxws.service.JAXService;
import com.jaxws.service.impl.JAXServiceImpl;
import javax.xml.ws.Endpoint;
/**
* Created by Maps on 2018/6/11.
*/
public class MyService {
public static void main(String[] args) {
//创建服务对象
JAXService jaxService=new JAXServiceImpl();
//发布服务
//参数1: ws的发布地址 参数2:服务对象
Endpoint.publish("http://localhost:9999/ws",jaxService);
System.out.println("服务发布成功!!");
//服务说明书网址 http://localhost:9999/ws?wsdl
}
}
发布服务,并生成wsdl服务说明
1:首先通过浏览器访问服务说明书
2:WSDL详解
服务的接收方:
根据wsdl服务说明,生成符合当前语言的客户端代码
将生的.Java文件引入程序
编写客户端代码,完成服务调用【法一】
/**
* Created by Maps on 2018/6/11.
*/
public class ClientBootstrap {
public static void main(String[] args) {
//1:服务名称对象
JAXServiceImplService jaxServiceImplService=new JAXServiceImplService();
//2:根据服务名称对象获取功能实现类对象
JAXServiceImpl jaxService=jaxServiceImplService.getJAXServiceImplPort();
//3:调用服务方法 获取返回值 完成WebSerivce的远程调用
List<String> list=jaxService.getInfo("102");
for (String str:list) {
System.out.println(str);
}
}
}
【法二】
import com.jaxws.client.JAXServiceImpl;
import org.junit.Test;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
import java.util.List;
/**
* Created by Maps on 2018/6/11.
*/
public class ClientTest {
@Test
public void method ()throws Exception{
//1:创建服务对象
Service service=Service.create(new URL("http://localhost:9999/ws?wsdl"),
new QName("http://impl.service.jaxws.com/","JAXServiceImplService"));
//2:通过服务对象获取服务功能对象
JAXServiceImpl jaxService=service.getPort(JAXServiceImpl.class);
//3:通过接口完成 WebService的调用
List<String> list=jaxService.getInfo("101");
for (String str:list) {
System.out.println(str);
}
}
}
三:SOAP 1.1协议
SOAP 1.1协议的请求方式:POST
SOAP 1.1协议的请求和响应的共同标签:
<s:envelope>
<s:body>
四、Apache CXF简介
Apache CXF 是一个开源的 web service 框架
支持多种协议(SOAP 1.1、1.2、RESTFul HTTP 、 WS-I BasicProfile、WS-Security)等 。
CXF 大大简化了 web service 的编程,Spring 进行无缝集成
接口与接口实现类与上面一致。
使用cxf发布服务【本地版】
import com.jaxws.service.JAXService;
import com.jaxws.service.impl.JAXServiceImpl;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.junit.Test;
/**
* Created by Maps on 2018/6/12.
*/
public class CXF_Test {
public static void main(String[] args){
//1. 构建基于java api for xml ws工厂bean对象
JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
//2. ws服务的网络地址
factoryBean.setAddress("http://localhost:9999/ws");
//3. 指定ws服务接口
factoryBean.setServiceClass(JAXService.class);
//4. 指定ws服务接口的实现类
factoryBean.setServiceBean(new JAXServiceImpl());
//5. 发布ws服务
factoryBean.create();
System.out.println("服务发布成功!等待客户端调用......");
}
}
import com.jaxws.client3.JAXService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;
import java.util.List;
/**
* Created by Maps on 2018/6/11.
*/
public class ClientTest {
@Test
public void cxfTest()throws Exception{
//1. 构建代理工程bean
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
// 绑定wsdl url地址
factoryBean.setAddress("http://localhost:9999/ws?wsdl");
//2. 获取服务接口对象
JAXService jaxService=factoryBean.create(JAXService.class);
//3. ws远程调用
List<String> list= jaxService.getInfo("101");
for (String str : list) {
System.out.println(str);
}
}
}