该项目创建的是IDEA的MAVEN的java项目
此次案例包含服务端和客户端。服务端用于发布地址,客户端用于测试服务端写的东西
该案例服务端命名为:restfulStyle
org.apache.cxf
cxf-rt-frontend-jaxrs
3.0.1
org.apache.cxf
cxf-rt-transports-http-jetty
3.0.1
org.apache.cxf
cxf-rt-rs-client
3.0.1
org.apache.cxf
cxf-rt-rs-extension-providers
3.0.1
org.codehaus.jettison
jettison
1.3.7
com.fasterxml.jackson.jaxrs
jackson-jaxrs-json-provider
2.9.6
package com.qf.Users;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement//实体类注解,标记当前要转换的格式。@XmlRootElement是基于restful风格的webService,客户端和服务器端之间通讯可以使用xml数据,json数据,@XmlRootElement用来指定对象序列化为xml或json数据时的根节点名称,也可以指定名字@XmlRootElement(name="")。如果指定名字,客户端和服务端的name值要相同。
public class Users {
private int userid;
private String username;
private String password;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
package com.qf.dao;
import com.qf.Users.Users;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
@Produces("*/*")//规定了服务器返回给客户端的数据格式。此地*/*代表格式不限制
public interface UsersDao {
@Path("/insert")
@POST//post提交(即新增)数据
public int insertUsers(Users users);
@Path("/update")
@PUT//PUT更新数据
public int updateUsers(Users users);
@Path("/delete/{uid}")//{uid}表示占位,前端请求地址中传过来的参数由uid获取。此时restful风格就体现出来了,前台传值格式为delete/1,1是传过来的参数
@DELETE//DELETE删除数据
public int deleteUsers(@PathParam("uid") int userid);//@PathParam("uid") 代表将uid和userid绑定
@Path("/getbyid/{id}")//restful这个占位符记得加{}大括号。客户端访问该方法的正确地址是:http://localhost:8080/users/getbyid/{id},即发布地址/请求地址/参数 的格式才能访问到
@GET//GET取(查询)数据
@Produces(MediaType.APPLICATION_JSON)//单独指定该方法返回值转换成json对象,表示以json格式返回给客户端。MediaType类有好几种数据格式,只需点一下就会提示。
public Users findbyid(@PathParam("id") int userid);
@Path("/getall")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List findall();
}
package com.qf.dao.impl;
import com.qf.Users.Users;
import com.qf.dao.UsersDao;
import java.util.ArrayList;
import java.util.List;
public class UsersDaoImpl implements UsersDao{
public int insertUsers(Users users) {
System.out.println("insertUsers="+users);
return 11;
}
public int updateUsers(Users users) {
System.out.println("updateUsers="+users);
return 22;
}
public int deleteUsers(int userid) {
System.out.println("deleteUsers="+userid);
return 33;
}
public Users findbyid(int userid) {
System.out.println("findbyid="+userid);
Users users=new Users();
users.setUserid(110);
users.setUsername("张三");
users.setPassword("abc");
return users;
}
public List findall() {
List list=new ArrayList();
System.out.println("findall");
for (int i = 0; i < 5; i++) {
Users users=new Users();
users.setUserid(110);
users.setUsername("张三");
users.setPassword("abc");
list.add(users);
}
return list;
}
}
package com.qf.test;
import com.qf.dao.impl.UsersDaoImpl;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
public class Demo1 {
public static void main(String[] args) {
//创建服务工厂对象
JAXRSServerFactoryBean factoryBean=new JAXRSServerFactoryBean();
//设置服务地址
factoryBean.setAddress("http://localhost:8080/users/");
//设置实现类(服务类)对象
factoryBean.setServiceBean(new UsersDaoImpl());
//发布服务
factoryBean.create();
System.out.println("发布成功");
}
}
该案例服务端命名为:restfulClient
org.apache.cxf
cxf-rt-frontend-jaxrs
3.0.1
org.apache.cxf
cxf-rt-transports-http-jetty
3.0.1
org.apache.cxf
cxf-rt-rs-client
3.0.1
org.apache.cxf
cxf-rt-rs-extension-providers
3.0.1
org.codehaus.jettison
jettison
1.3.7
com.fasterxml.jackson.jaxrs
jackson-jaxrs-json-provider
2.9.6
package com.qf.entity;
//原来的费restful的客户端的代码都是由wsimport -s等命令自动生成的,但restful风格只是公司内部应用,因此还不普及,这个实体类只能从服务端复制过来
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement//实体类注解,标记当前要转换的格式。@XmlRootElement是基于restful风格的webService,客户端和服务器端之间通讯可以使用xml数据,json数据,@XmlRootElement用来指定对象序列化为xml或json数据时的根节点名称,也可以指定名字@XmlRootElement(name="")。如果指定名字,客户端和服务端的name值要相同。
public class Users {
private int userid;
private String username;
private String password;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
由于方法几乎有重复的,因此当中有些代码是注释状态
package com.qf.test;
import com.qf.entity.Users;
import org.apache.cxf.jaxrs.client.WebClient;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
public class Demo1 {
public static void main(String[] args) {
/* //测试服务端的新增方法
//创建服务端处理请求的方法中需要的参数
Users users=new Users();
users.setUserid(102);
users.setUsername("我是客户端");
users.setPassword("我是客户端");
//http://localhost:8080/users/是服务器端发布的地址,后面的insert是你想调用的对应的处理方法的请求地址(该地址我们定义在服务端的接口中的),只有有请求地址才能找到对应的处理方法
//post是restful中的新增的注解,即服务端接口请求地址下的post
Response resp = WebClient.create("http://localhost:8080/users/insert").post(users);//users是请求地址对应的处理方法需要的参数,用post传过去
//调用 Response的readEntity方法,获取服务端处理请求地址的方法的返回值
Object entity = resp.readEntity(Integer.class);
System.out.println(entity);//此时返回的是11
*/
/* //测试删除方法
//http://localhost:8080/users/是服务器端发布的地址,后面的delete是你想调用的对应的处理方法的请求地址(该地址我们定义在服务端的接口中的),为了调用对应方法
Response resp = WebClient.create("http://localhost:8080/users/delete").path("/123").delete();//"/123"是接口请求地址那占位符要获取的值,也就是说用path传请求地址的参数,并赋给请求地址处理方法的参数的值
//调用 Response的readEntity方法,获取服务端处理请求地址的方法的返回值
Object entity = resp.readEntity(Integer.class);
System.out.println(entity);
*/
/* //测试单行查询方法
//由于控制台需要java代码,而不是json数据,因此在这里需要用accept方法转换成在后台能使用的
Users users = WebClient.create("http://localhost:8080/users/getbyid/456")//http://localhost:8080/users/服务端发布的访问地址,getbyid是请求地址,456是发过去对应的参数,也是请求地址处理方法所需的参数。
.accept(MediaType.APPLICATION_JSON_TYPE)//接受数据的类型,因为服务端请求地址处理方法的返回值是json格式,因此用accept的MediaType.APPLICATION_JSON_TYPE参数处理
.get(Users.class);//接受返回的对象用get方法,Users是它返回过来的类型。
System.out.println(users);//返回值为Users{userid=110, username='张三', password='abc'}
*/
//测试多行查询,即服务端返回的是一个list集合
List list = WebClient.create("http://localhost:8080/users/getall")//http://localhost:8080/users/服务端发布的访问地址,getall是请求地址
.accept(MediaType.APPLICATION_JSON_TYPE)//接受数据的类型,因为服务端请求地址处理方法的返回值是json格式,因此用accept的MediaType.APPLICATION_JSON_TYPE参数处理
.get(new GenericType>() {});//new GenericType<>(){}处理集合的固定方法,List是服务端请求地址对应的处理方法的返回值类型.这也是为什么我们要提前将服务端的Users实体类复制过来的原因。因为这里会用到
System.out.println(list);//返回值为:[Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}, Users{userid=110, username='张三', password='abc'}]
}
}