1. WebService概念介绍
webservice是一种跨编程语言和跨操作系统平台的远程调用技术。首先我们将实现特定逻辑功能的代码发布,并向外界提供一个能通过Web进行调用的接口,则外界很容易通过该接口使用你提供的服务。
webService三要素:soap、wsdl、uddi
soap:一种数据传输协议,了解这个概念就行
wsdl:基于XML,是对服务端提供服务的描述,包括对外发布的服务名称(类)、接口方法名称(方法)、接口参数(方法参数)服务返回的数据类型(方法返回值)等
uddi: UDDI 是一种目录服务,企业可以通过 UDDI 来注册和搜索 Web 服务,可以帮助Web 服务提供商在互联网上发布 Web 服务.
2. WebService服务发布
服务的创建与发布方法有很多,这里介绍一种最简单的方法,无需导入外部jar包
- 新建普通java项目WebService
- 新建实体类
package student;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "StudentPO")
public class StudentPO {
private String id;
private String name;
private String sex;
private int gender;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
- 新建接口服务
package student;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface StudentService {
@WebMethod
public List<StudentPO> findAllStudent();
}
- 新建接口实现类
package student;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
@WebService(endpointInterface="student.StudentService")
public class StudentServiceImpl implements StudentService {
@Override
public List<StudentPO> findAllStudent() {
ArrayList<StudentPO> studentPOs=new ArrayList<>();
StudentPO studentPO1=new StudentPO();
studentPO1.setId("001");
studentPO1.setName("菜虚鲲");
studentPO1.setSex("female");
studentPO1.setGender(1);
StudentPO studentPO2=new StudentPO();
studentPO2.setId("002");
studentPO2.setName("鸡太美");
studentPO2.setSex("female");
studentPO2.setGender(2);
studentPOs.add(studentPO1);
studentPOs.add(studentPO2);
return studentPOs;
}
}
- 新建发布服务的类
package util;
import javax.xml.ws.Endpoint;
import student.StudentServiceImpl;
public class PublishService {
public static void main(String[] args) {
String address="http://localhost:8060/StudentService";
Endpoint.publish(address, new StudentServiceImpl());
System.out.println("发布成功!地址为: "+address);
}
}
- 访问wsdl文档,判断服务是否发布成功,在地址输入 http://localhost:8060/StudentService?wsdl,可以看到wsdl文档,里面有接口和方法的描述。
3. 客户端访问
客户端访问技术有很多,这里介绍两种,一是利用wsdl生成本地代码访问,二是远程服务调用
3.1 本地代码调用
-----借助wsdl文档生成本地代码,像使用本地代码一样调用
<1>.新建普通Java项目
<2>.进入项目src目录
<3>在地址栏输入cmd 回车,进入命令行,输入 http://localhost:8060/StudentService?wsdl 回车,可以看到生成了本地代码
<4>进入项目 refresh ,可以看到项目刷新出生成的代码
<5>新建Client进行测试
package util;
import java.util.ArrayList;
import java.util.List;
import student.StudentPO;
import student.StudentServiceImpl;
import student.StudentServiceImplService;
public class Client {
public static void main(String[] args) {
List<StudentPO> studentPOs=new ArrayList<>();
StudentServiceImplService factory = new StudentServiceImplService();
StudentServiceImpl StudentService=factory.getStudentServiceImplPort();
studentPOs=StudentService.findAllStudent();
System.out.println(studentPOs.toString());
}
}
运行程序可以看到查询结果
3.1 远程服务调用
-----不用生成本地代码,直接通过服务地址进行调用
<1>新建普通java项目
<2>新建实体类
package student;
public class StudentPO {
private String id;
private String name;
private String sex;
private int gender;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
<3>新建接口
package student;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface StudentService {
@WebMethod
public List<StudentPO> findAllStudent();
}
<3>新建测试类
package util;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import student.StudentPO;
import student.StudentService;
public class RMIClient {
public static void main(String[] args) throws MalformedURLException {
//WSDL地址
URL url = new URL("http://localhost:8060/StudentService?wsdl");
//创建服务
//1.namespaceURI - 命名空间地址
//2.localPart - 服务名称
QName qname = new QName("http://student/", "StudentServiceImplService");
Service service = Service.create(url, qname);
//获取实现类
StudentService studentService=service.getPort(StudentService.class);
List<StudentPO> studentPOs=new ArrayList<>();
studentPOs=studentService.findAllStudent();
System.out.println(studentPOs);
}
}
<3>运行