在开发过程中,我们可能会需要天气,电话号码等信息,然而这些信息我们的数据库中没有,而且这也并不是我们项目所侧重的地方,天气信息自然气象局有,电话信息自然通信公司有,那么如何才能得到这些数据呢?WebService是一种很好的解决方案,它是通过将自己写好的接口外放而让别人来调用接口的方法,整体而言,类似于RMI,但它有一些约束和特点。
WebService是跨平台的,也就是不限制语言,所以这就决定了WebService需要一个相同的协议来确定发送和解读保持一致。
这就是SOAP,它是一个以HTTP为基准,以XML为内容的协议,保证了发送和接受的一致性。
大致流程如下,客户端发送信息给资源服务器,信息中包括服务端调用方法的参数,服务器调用方法,结果返回给客户端。这样我的项目数据库中没有天气信息,但是我通过WebService可以从气象局那里获取到,我也不用管理这方面数据,真的非常方便。
那我们写一个案例看一下吧,我们的服务器端就是一个简单的查询学生信息的功能。
1.导入jar包(jar包非常的多,这里不在列举,详情百度)http://cxf.apache.org/download.html
2.接口
package com.hzy.RsServer;
import javax.jws.WebService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.List;
@WebService
@Path("student")
/**
* JAX-WS:webservice,一般说的是soap
* JAX-RS:Rest service
*/
public interface IStudentService {
//根据id查找学生
@GET //get请求
@Path("/query/{id} {name}") //访问路径
@Produces(MediaType.APPLICATION_XML)//返回给客户的数据格式
public Student query(@PathParam("id") long id,@PathParam("name") String name);
//根据名字查询所有学生(张)
@GET
@Path("/queryList/{name}") //访问路径
//@Produces(MediaType.APPLICATION_XML)//返回给客户的数据格式
public List<Student> queryList(@PathParam("name") String name);
}
这里说一下这些注解的意思@WebService用来标记接口,表示这是一个提供WebService的接口。
@path是路径因为http访问,那么我们如果访问这个接口下的方法的话,http://127.0.0.1:54199/user/student/query/1 2?wsdl
这样就很清楚了,user是我发布时写的,student是我这个服务类,query是方法,1 2是参数 ,wsdl只是看文本树。这样就可以精确的定位到一个方法了。传统模式下我们是获取到代理对象来调用方法的,而这里可以直接定位到方法,显得更加简便。
3.实现类
package com.hzy.RsServer;
import java.util.ArrayList;
import java.util.List;
public class StudentServiceImpl implements IStudentService {
@Override
public Student query(long id,String name) {
Student student = new Student(id,name,"555");
return student;
}
@Override
public List<Student> queryList(String name) {
List<Student> students = new ArrayList<Student>();
for(long i=0;i<3;i++){
Student student = new Student(i,name + i ,"555");
students.add(student);
}
return students;
}
}
常规操作,完成你的业务就好。
5.记得在你用过的pojo类上加上注解
@XmlRootElement(name = "student") 这是用来告诉框架这个pojo需要转换成xml。
6.运行
import com.hzy.RsServer.StudentServiceImpl;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
public class Main {
public static void main(String[] args) {
//框架内置Bean,放东西的,用就是了
JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
//设置我们的实现类class
jaxrsServerFactoryBean.setResourceClasses(StudentServiceImpl.class);
//设置我们的实现对象,内部会通过动态代理完成远程调用模块
jaxrsServerFactoryBean.setServiceBean(new StudentServiceImpl());
//写出我们的访问路径
jaxrsServerFactoryBean.setAddress("http://127.0.0.1:54199/user");
//发布
jaxrsServerFactoryBean.create();
}
}
我们发布了以后用浏览器发个http请求。http://127.0.0.1:54199/user/student/query/1 2?wsdl
没错浏览器上返回了该方法的返回值而且是一个对象。