CXF发布restful WebService的入门例子(服务器端)
研究了两天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>
转自 http://borissun.iteye.com/blog/765869
CXF发布restful WebService的入门例子(服务器端)的更多相关文章
- CXF发布restful WebService的入门例子(客户端)
上篇说了怎么用cxf发布restful webservice,由于浏览器只能对该service发送http的GET请求,所以如果想对服务器上的数据,还需要实现客户端. 客户端的实现方式有无数种...可 ...
- SSH集成cxf 发布restful webservice
首先讲一下什么是restful webservice ,这个问题网上一搜有很多博文去长篇大论的介绍它,但是最后你看完了也会觉得云里雾里的,所以我在这里简单的讲一下我理解的rest webservice ...
- 开发基于CXF的 RESTful WebService web 项目 webservice发布
配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <se ...
- Java 使用httpclient Post与cxf 发布的Webservice通信
使用cxf发布的webservice不知道什么情况总会有时管用有时不管用,对于项目来说这肯定不行.又不想改动webservice因为代码太多.人懒! 于是便使用httpclient与webservic ...
- Eclipse + Apache Axis2 发布RESTful WebService(三)第一个程序Hello Axis2 !(未成功)
此路不通 Axis2发布SOAP WebService非常简单,建一个Dynamic Web Project,然后为它建一个Axis的Web Service(Tomcat7+JDK),就会生成Clas ...
- Eclipse + Jersey 发布RESTful WebService(一)了解Maven和Jersey,创建一个WS项目(成功!)
一.下文中需要的资源地址汇总 Maven Apache Maven网站 http://maven.apache.org/ Maven下载地址: http://maven.apache.org/down ...
- 使用CXF发布的WebService报错:org.apache.cxf.interceptor.Fault: The given SOAPAction does not match an operation
场景:JAVA语言使用CXF搭建WebService发布报错 错误信息:org.apache.cxf.interceptor.Fault: The given SOAPAction does not ...
- Eclipse + Apache Axis2 发布RESTful WebService(一)基础知识
1.什么是WebService 学习 WebService 第一步:体系结构.三元素SOAP/WSDL/UDDI 2.什么是Axis2 Axis2是Apache一套崭新的WebService引擎(框架 ...
- Eclipse + Apache Axis2 发布RESTful WebService(二)配置开发环境
1. 下载axis2相关软件地址:http://axis.apache.org/axis2/java/core/download.html 2. 安装插件:将axis2-eclipse-codegen ...
随机推荐
- javascript 基础学习教程
http://www.itxueyuan.org/javascript/jiaocheng_2/
- Maven项目中找不到maven dependencies library
一般是,workspace中的.classpath文件中有内容丢失造成 在 <classpathentry kind="con" path="org.eclipse ...
- hdu1269 强连通
题意:判断给定有向图中是否所有点都能够互相到达. 就是询问是否只有一个强连通分量. #include<stdio.h> #include<string.h> #include& ...
- hdu1025 dp(最长上升子序列LIS)
题意:有一些穷国和一些富国分别排在两条直线上,每个穷国和一个富国之间可以建道路,但是路不能交叉,给出每个穷国和富国的联系,求最多能建多少条路 我一开始在想有点像二分图匹配orz,很快就发现,当我把穷国 ...
- C#编写的windows程序随系统启动
url:http://www.cnblogs.com/emanlee/archive/2009/08/31/1557380.html 设置某程序随系统启动自动运行,取消自动运行. 使用到using M ...
- Python 基本语法1
Python 基础语法(一) Python的特点 1. 简单 Python是一种代表简单思想的语言. 2. 易学 Python有极其简单的语法. 3. 免费.开源 Python是FLOSS(自由/开放 ...
- exceptions-in-java
http://www.javaworld.com/article/2076721/core-java/designing-with-exceptions.html http://www.javawor ...
- C++ typedef详解
1.typedef的用途1)定义一种类型的别名注意typedef并不是简单的宏替换,如下例所示: int main() { char *pa,pb;//声明了一个指向字符变量的指针pa,和一个字符变量 ...
- WCF入门教程一[什么是WCF]
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- ABBYY FineReader 12扫描界面介绍
ABBYY FineReader 12OCR图文识别软件自身拥有着自己的扫描界面,一般在默认情况下,ABBYY FineReader 使用其自身的扫描界面.本文就解析了ABBYY FineReader ...