研究了两天CXF对restful的支持。 
  现在,想实现一个以 
http://localhost:9999/roomservice 为入口, 
http://localhost:9999/roomservice/room为房间列表, 
http://localhost:9999/roomservice/room/001/ 为001号房间的信息, 
http://localhost:9999/roomservice/room/001/person 为在001号房间主的人的列表

实现用HTTP请求对以上资源的CRUD。

首先建立room,person的POJO,这里只有一点需要注意:

package com.DAO;  import javax.xml.bind.annotation.XmlRootElement;  @XmlRootElement(name="Person")
public class Person {  private String name;  private String sex;  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;  }  }

一定要在类的前边加上annotation ,这样才能让这个person的信息在POJO和XML之间转换。Room同理:

import java.util.Map;  import javax.xml.bind.annotation.XmlRootElement;  @XmlRootElement(name="Room")
public class Room {  public Room()  {  persons=new HashMap<String,Person>();  }  String id;  Map<String,Person> persons;  public String getId() {  return id;  }  public void setId(String id) {  this.id = id;  }  public Map<String, Person> getPersons() {  return persons;  }  public void setPersons(Map<String, Person> persons) {  this.persons = persons;  }
}

POJO有了,接下来要写DAO,由于主要是为了学习restful,为了方便,不必要将数据持久化到数据库,而是存在一个静态的HashMap中:

package com.DAO;  import java.util.HashMap;
import java.util.Map;  public class RoomDAO {  private static Map<String, Room> rooms;  static {  rooms = new HashMap<String, Room>();  Person p1=new Person();  p1.setName("Boris");  p1.setSex("male");  Room r=new Room();  r.setId("001");  r.getPersons().put(p1.getName(), p1);  rooms.put("001", r);  }  public static void addRoom(Room room) {  rooms.put(room.getId(), room);  }  public static void deleteRoom(String id) {  if (rooms.containsKey(id)) {  rooms.remove(id);  }  }  public static void updateRoom(String id,Room room) {  rooms.remove(id);  rooms.put(room.getId(), room);  }  public static Room getRoom(String id) {  if (rooms.containsKey(id)) {  return rooms.get(id);  } else {  return null;  }  }  /*operations to persons*/  public static void addPerson(String id_room,Person person) {  if(rooms.containsKey(id_room))  {  Room room=rooms.get(id_room);  room.getPersons().put(person.getName(), person);  }  }  public static Rooms getRooms()  {  return new Rooms();  }  public static void deletePerson(String id_room,String name)  {  if(rooms.containsKey(id_room))  {  Room room=rooms.get(id_room);  room.getPersons().remove(name);  }  }  public static Map<String, Room> getMapOfRooms()  {  return rooms;  }
}

接下来是重点,如果想发布restful webservice,要通过一个叫JAXRSServerFactoryBean的类来发布。这个类有几个方法是要了解的:

public void setResourceClasses(Class... classes); 
那一系列的Class类型的参数,是告诉这个类,发布服务时,会用到的POJO(就像上边写的Room,Person)。

public void setAddress(String address); 
这个方法是告诉这个类,服务的地址,比如"http://localhost:9999"

public void setServiceBeans(Object... beans) 
这里是重点,这个方法,要给这个用来发布服务的类一个Service bean.这个Bean是我们要手动编写的,作用是告诉服务,收到什么样的请求,应该怎么样处理。

现在,先来编写这个Service bean:

package com.server;  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.DAO.Person;
import com.DAO.Room;
import com.DAO.RoomDAO;
import com.DAO.Rooms;  @Path("/roomservice")
@Produces("application/xml")
public class RoomService {  @GET  @Path("/room/{id}")  @Consumes("application/xml")  public Room getRoom(@PathParam("id")String id )  {  System.out.println("get room by id= "+id);  Room room=RoomDAO.getRoom(id);  return room;  }  @GET  @Path("/room")  @Consumes("application/xml")  public Rooms getAllRoom()  {  System.out.println("get all room");  Rooms rooms=RoomDAO.getRooms();  return rooms;  }  @POST  @Path("/room")  @Consumes("application/xml")  public void addRoom(Room room)  {  System.out.println("add room which id is:"+room.getId());  RoomDAO.addRoom(room);  }  @PUT  @Path("/room/{id}")  @Consumes("application/xml")  public void updateRoom(@PathParam("id")String id,Room room)  {  System.out.println("update room which original id is:"+room.getId());  RoomDAO.updateRoom(id,room);  }  @DELETE  @Path("/room/{id}")  @Consumes("application/xml")  public void deleteRoom(@PathParam("id")String id)  {  System.out.println("remove room by id= "+id);  RoomDAO.deleteRoom(id);  }  @POST  @Path("/room/{id}")  @Consumes("application/xml")  public void addPerson(@PathParam("id") String id,Person person)  {  System.out.println("add person who's name is:"+person.getName());  RoomDAO.addPerson(id, person);  }  @DELETE  @Path("/room/{id}/{name}")  @Consumes("application/xml")  public void deletePerson(@PathParam("id")String id,@PathParam("name")String name)  {  System.out.println("remove person who's name is: "+name);  RoomDAO.deletePerson(id, name);  }
}

需要注意:每个方法之前,要用annotation声明http请求的method类型,比如GET,DELETE,POST, PUT. 
@Produces("application/xml")我还没弄清楚到底是声明的接受格式还是返回格式,还是其他。

@Path("/room/{id}")中的id是一个参数,应该在方法的参数列表中声明: 
public void deletePerson(@PathParam("id")String id,@PathParam("name")String name) 
这样就能得到URL中的id了。

现在,这些房间被资源化了,id为001的房间被资源化为一个URL,那地址应该是 
http:{服务器地址}:{端口}/roomservice/rrom/001

现在,创建一个Server:

package com.server;  import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;  import com.DAO.Person;
import com.DAO.Room;
import com.DAO.Rooms;  public class Server {  public static void main(String[] args) {  RoomService service = new RoomService();  // Service instance  JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();  restServer.setResourceClasses(Room.class,Person.class,Rooms.class);  restServer.setServiceBeans(service);  restServer.setAddress("http://localhost:9999/");  restServer.create();  }
}

现在,服务已经发布成功了,在浏览器输入http://localhost:9999/roomservice/room/001  得到结果:

<room>  <id>001</id>
<persons>
<entry>  <key>Boris</key>
<value>  <name>Boris</name>  <sex>male</sex>  </value>  </entry>  </persons>  </room>

如果用浏览器去访问,发送的http请求只能所GET,因此如果想对数据进行操作,必须写一个客户端。 
在写客户端之前,有一个问题: 
在浏览器输入http://localhost:9999/roomservice/room/ 
什 么都看不到,可是,我想要得到房间列表。但是,cxf发布restful只认你给他的类的class。所以你想让服务器返回一个room的列表给客户端, 是不行的。所以,必须想别的办法,我是又写了一个POJO,这个POJO里只有一个属性,就是一个存放所有room的Map: 
package com.DAO;

import java.util.Map;  import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="rooms")
public class Rooms {  Map<String,Room> rooms;  public Rooms()  {  rooms=RoomDAO.getMapOfRooms();  }  public Map<String, Room> getRooms() {  return rooms;  }  public void setRooms(Map<String, Room> rooms) {  this.rooms = rooms;  }
}

这样,然后再把DAO的方法加上:

@GET  @Path("/room")  @Consumes("application/xml")  public Rooms getAllRoom()  {  System.out.println("get all room");  Rooms rooms=RoomDAO.getRooms();  return rooms;  }

这样就能以list的形式显示出所有room了。 
访问http://localhost:9999/roomservice/room/ 
结果如下:

<rooms>
<rooms>
<entry>  <key>006</key>
<value>  <id>006</id>  <persons/>  </value>  </entry>
<entry>  <key>001</key>
<value>  <id>001</id>
<persons>
<entry>  <key>Boris</key>
<value>  <name>Boris</name>  <sex>male</sex>  </value>  </entry>  </persons>  </value>  </entry>  </rooms>  </rooms>

转载于:https://blog.51cto.com/xuliangjun/1577348

CXF发布restful WebService的入门例子(服务器端)相关推荐

  1. CXF发布RestFul WebService和SOAP WebService

    CXF发布RestFul WebService和SOAP WebService Apache CXF可以发布多种协议的WebService,Spring支持整合cxf到项目中,可以简化后台构架,以下是 ...

  2. android webservice 传递对象,Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍...

    Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍 最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没 ...

  3. Android通过ksoap2传递复杂数据类型,服务端为CXF发布的webservice,亲手写的代码

    最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没有注意到,啊,我的时间呀,进这么过去了,为了不让小伙伴们走弯路,我还是认真的把开发文档写一 ...

  4. JSR311发布Restful WebService工程

    背景知识  Representational state transfer (REST) Web Service:  它是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格 ...

  5. Eclipse + Apache Axis2 发布RESTful WebService(一)基础知识

    1.什么是WebService 学习 WebService 第一步:体系结构.三元素SOAP/WSDL/UDDI 2.什么是Axis2 Axis2是Apache一套崭新的WebService引擎(框架 ...

  6. 开发RESTful WebService

    RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS.全称:Java API for RESTful WebService. ...

  7. 使用CXF与Spring集成实现RESTFul WebService

    以下引用与网络中!!! 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. ...

  8. spring boot整合cxf发布和调用webservice

    一.前言 说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例 ...

  9. cxf 发布 一个简单的 webservice

    一个 简单的 cxf 发布webservice的例子 ,希望能对你有所帮助. 1,开发环境   eclipse   jdk 1.7   apache-cxf-3.1.6 2,开发步骤 1).  导入c ...

最新文章

  1. STL中的nth_element()方法的使用
  2. android构建过程
  3. 乐播投延迟很高_大屏也要高刷新!华为4K@120智慧屏初体验,屏幕软件都够硬
  4. linux下添加用户的命令--useradd
  5. 初使用 ReportViewer 控件时遇到的一点小麻烦
  6. 水滴状的自己定义视图,让您摆脱单调的Dialog
  7. L3-010. 是否完全二叉搜索树-PAT团体程序设计天梯赛GPLT
  8. APP适配安卓手机刘海屏
  9. 多位数据库专拣点评这本书
  10. PHP 使用 ZipArchive 将文件打包成 zip
  11. python做人工智能-马哥教育官网-专业Linux培训班,Python培训机构
  12. QT 资源管理器和.qrc文件的使用
  13. DOS BAT脚本批量打开Edge网页
  14. php初级入门教程_PHP初学者教程
  15. 人生苦难重重,如何解决人生的问题?| 读《少有人走的路:心智成熟的旅程》
  16. [Unity] UGUI学习笔记
  17. 酷比魔方IWork1X 的做系统问题
  18. 钢七连实战教学  老师和学生的差别
  19. Python Plt颜色配色一览(热力图)
  20. 新冠疫情历史数据(COVID-19-Data)

热门文章

  1. 3指南针旋转_Qt编写自定义控件6-指南针仪表盘
  2. 微信一次发两个ajax请求,微信浏览器发送ajax请求执行多次解决方法
  3. 红帽linux登陆错误,xmanager连接RedHat出错:/usr/X11R6/bin/xterm: No such file or directory
  4. 2560x1600分辨率高吗_手机屏幕分辨率真的越高越好?它的好处和坏处你知道吗?...
  5. 黑龙江智能车邀请赛中的单车比赛
  6. 2021年春季学期-信号与系统-第十次作业参考答案-第四小题
  7. TM1810-3, TM1810-2 LED恒流驱动IC
  8. html给img添加滤镜,给图片在博客中添加滤镜效果_CSS/HTML
  9. python空字典对象相当于false吗_python怎么判断某一对象是否为字典
  10. FLAC3D可视化后处理matlab,一种基于Matlab的由Midas导入Flac3D的模型识别方法与流程...