一. 创建两个maven jar项目
,
二 .编写服务器端 (RS_Server)
1. 导jar包 在pom.xml文件中写依赖的jar包
<dependencies>
<!-- CXF RS开发 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 内置jetty服务器 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.1</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<!-- 发送json数据需要以下两个jar包 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
2. 编写一个实体类User 添加注解
package com.blueSky.domain;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="User") //指定序列化对象的名字,服务器端实体类注解name属性值要和该名字一样
public class User {
private Integer id;
private String name;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", gender=" + gender + "]";
}
}
3. 编写IUserService接口 添加注解
package com.blueSky.service;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import com.blueSky.domain.User;
@Path("/userService") //访问路径(/userService/)
public interface IUserService {
/*
* 添加数据
* */
@POST //添加操作
@Path("/user") // 该方法访问路径为 /userService/user
@Consumes({"application/xml","application/json"}) //该方法可以接收xml和json类型的数据 (mime类型)
public void addUser(User user);
/*
* 删除数据
* */
@DELETE
@Path("/user/{id}")
@Consumes({"application/xml","application/json"})
public void deleteUser(@PathParam("id") int uid); //会把path中的id值作为实参传给形参uid
/*
* 修改数据
* */
@PUT
@Path("/user")
@Consumes({"application/xml","application/json"})
public void updateUser(User user);
/*
* 查询所有数据
* */
@GET
@Path("/user")
@Produces({"application/xml","application/json"}) //可以返回xml,json类型的数据
public List<User> findAllUser();
/*
* 查询一个数据
* */
@GET
@Path("/user/{id}")
@Consumes({"application/xml","application/json"}) //该方法既接收参数又返回参数 两个注解都要写
@Produces({"application/xml","application/json"})
public User findUser(@PathParam("id") Integer uid); //会把path中的id值作为实参传给形参uid
}
4. 编写UserServiceImpl实现类
package com.blueSky.service.impl;
import java.util.ArrayList;
import java.util.List;
import com.blueSky.domain.User;
import com.blueSky.service.IUserService;
public class UserServiceImpl implements IUserService{
/*
* 添加数据
* */
public void addUser(User user){
System.out.println(user.getName());
System.out.println("添加用户....");
}
/*
* 删除数据
* */
public void deleteUser(int id){
System.out.println("删除用户"+id);
}
/*
* 修改数据
* */
public void updateUser(User user){
System.out.println("修改用户信息....");
}
/*
* 查询所有数据
* */
public List<User> findAllUser(){
//因为没有数据库,手动制作一些数据
List<User> list = new ArrayList<User>();
//创建第一个用户
User user1 = new User();
user1.setId(1);
user1.setName("张三");
user1.setGender("男");
list.add(user1);
//创建第二个用户
User user2 = new User();
user2.setId(2);
user2.setName("李四");
user2.setGender("男");
list.add(user2);
//返回结果list
return list;
}
/*
* 查询一个数据
* */
public User findUser(Integer id){
//因为没有数据库,手动制作一些数据
//创建第一个用户
User user1 = new User();
user1.setId(1);
user1.setName("张三");
user1.setGender("男");
//创建第二个用户
User user2 = new User();
user2.setId(2);
user2.setName("李四");
user2.setGender("男");
//返回结果list
if(id==1){
return user1;
}else if(id==2){
return user2;
}else{
return null;
}
}
}
5. 编写UserServer类 发布服务
package com.blueSky.server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
import com.blueSky.domain.User;
import com.blueSky.service.IUserService;
import com.blueSky.service.impl.UserServiceImpl;
public class UserServer {
public static void main(String[] args) {
//1.创建服务接口实现类对象
IUserService userService = new UserServiceImpl();
//2.创建bean工厂,并进行设置
JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
jaxrsServerFactoryBean.setResourceClasses(User.class); //设置实体类
jaxrsServerFactoryBean.setServiceBean(userService); //设置服务类
jaxrsServerFactoryBean.setAddress("http://127.0.0.1:9001"); //设置地址
//3发布服务
jaxrsServerFactoryBean.create();
}
}
6. 浏览器访问进行测试

三 编写客户端(RS_Client)
使用web_client工具类
1.导jar包
pom.xml中写
<!-- rs客户端 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!-- json转换相关 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
2. 编写一个实体类
package com.blueSky.domain;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="User") //指定序列化对象的名字,服务器端实体类注解name属性值要和该名字一样
public class User {
private Integer id;
private String name;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", gender=" + gender + "]";
}
}
3. 编写请求服务类
package com.blueSky.Service;
import java.util.Collection;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.client.WebClient;
import com.blueSky.domain.User;
public class UserService {
public static void main(String[] args) {
//accept 接收 type发送
//添加用户
User user1 = new User();
user1.setName("客户端王五");
WebClient.create("http://127.0.0.1:9001/userService/user")
.type(MediaType.APPLICATION_XML) // 发送给服务器的数据格式
.post(user1); // post请求方式添加数据
//删除用户
WebClient.create("http://127.0.0.1:9001/userService/user/1") //给参数
.type(MediaType.APPLICATION_XML).delete();
//查询所有用户 json格式
Collection<? extends User> collection = WebClient
.create("http://127.0.0.1:9001/userService/user")
.accept(MediaType.APPLICATION_JSON) //接收数据格式为json
.getCollection(User.class); //使用getCollection方法来接收集合数据
System.out.println(collection);
//查询单个用户
User user = WebClient
.create("http://127.0.0.1:9001/userService/user/1") //给定参数
.accept(MediaType.APPLICATION_JSON) //接收数据格式为json
.get(User.class); // User接收
System.out.println(user);
}
}
4. 访问服务路径,进行测试
客户端控制台显示
服务器端控制台显示
zz