日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

CXF Rest Server

 richsky 2012-04-29

CXF Rest Server

249人閱讀 評(píng)論(0) 收藏 舉報(bào)
研究了兩天CXF對(duì)restful的支持。
  現(xiàn)在,想實(shí)現(xiàn)一個(gè)以
http://localhost:9999/roomservice 為入口,
http://localhost:9999/roomservice/room為房間列表,
http://localhost:9999/roomservice/room/001/ 為001號(hào)房間的信息,
http://localhost:9999/roomservice/room/001/person 為在001號(hào)房間主的人的列表

  實(shí)現(xiàn)用HTTP請(qǐng)求對(duì)以上資源的CRUD。

  首先建立room,person的POJO,這里只有一點(diǎn)需要注意:
Java代碼  收藏代碼
  1. package com.DAO;  
  2.   
  3. import javax.xml.bind.annotation.XmlRootElement;  
  4.   
  5. @XmlRootElement(name="Person")  
  6. public class Person {  
  7.     private String name;  
  8.     private String sex;  
  9.     public String getName() {  
  10.         return name;  
  11.     }  
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.     public String getSex() {  
  16.         return sex;  
  17.     }  
  18.     public void setSex(String sex) {  
  19.         this.sex = sex;  
  20.     }  
  21.       
  22. }  



  一定要在類(lèi)的前邊加上annotation ,這樣才能讓這個(gè)person的信息在POJO和XML之間轉(zhuǎn)換。Room同理:
Java代碼  收藏代碼
  1. import java.util.Map;  
  2.   
  3. import javax.xml.bind.annotation.XmlRootElement;  
  4.   
  5. @XmlRootElement(name="Room")  
  6. public class Room {  
  7.     public Room()  
  8.     {  
  9.         persons=new HashMap<String,Person>();  
  10.     }  
  11.     String id;  
  12.     Map<String,Person> persons;  
  13.       
  14.     public String getId() {  
  15.         return id;  
  16.     }  
  17.     public void setId(String id) {  
  18.         this.id = id;  
  19.     }  
  20.     public Map<String, Person> getPersons() {  
  21.         return persons;  
  22.     }  
  23.     public void setPersons(Map<String, Person> persons) {  
  24.         this.persons = persons;  
  25.     }  
  26. }  


POJO有了,接下來(lái)要寫(xiě)DAO,由于主要是為了學(xué)習(xí)restful,為了方便,不必要將數(shù)據(jù)持久化到數(shù)據(jù)庫(kù),而是存在一個(gè)靜態(tài)的HashMap中:

Java代碼  收藏代碼
  1. package com.DAO;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. public class RoomDAO {  
  7.     private static Map<String, Room> rooms;  
  8.     static {  
  9.         rooms = new HashMap<String, Room>();  
  10.           
  11.         //this room is for testing  
  12.         Person p1=new Person();  
  13.         p1.setName("Boris");  
  14.         p1.setSex("male");  
  15.           
  16.           
  17.           
  18.         Room r=new Room();  
  19.         r.setId("001");  
  20.         r.getPersons().put(p1.getName(), p1);  
  21.         rooms.put("001", r);  
  22.     }  
  23.   
  24.     public static void addRoom(Room room) {  
  25.         rooms.put(room.getId(), room);  
  26.     }  
  27.   
  28.     public static void deleteRoom(String id) {  
  29.         if (rooms.containsKey(id)) {  
  30.             rooms.remove(id);  
  31.         }  
  32.   
  33.     }  
  34.   
  35.     public static void updateRoom(String id,Room room) {  
  36.         rooms.remove(id);  
  37.         rooms.put(room.getId(), room);  
  38.     }  
  39.   
  40.     public static Room getRoom(String id) {  
  41.         if (rooms.containsKey(id)) {  
  42.             return rooms.get(id);  
  43.         } else {  
  44.             return null;  
  45.         }  
  46.     }  
  47.     /*operations to persons*/  
  48.     public static void addPerson(String id_room,Person person) {  
  49.         if(rooms.containsKey(id_room))  
  50.         {  
  51.             Room room=rooms.get(id_room);  
  52.             room.getPersons().put(person.getName(), person);  
  53.         }  
  54.     }  
  55.       
  56.     public static Rooms getRooms()  
  57.     {  
  58.         return new Rooms();  
  59.     }  
  60.       
  61.     public static void deletePerson(String id_room,String name)  
  62.     {  
  63.         if(rooms.containsKey(id_room))  
  64.         {  
  65.             Room room=rooms.get(id_room);  
  66.             room.getPersons().remove(name);  
  67.         }  
  68.     }  
  69.       
  70.     public static Map<String, Room> getMapOfRooms()  
  71.     {  
  72.         return rooms;  
  73.     }  
  74. }  




接下來(lái)是重點(diǎn),如果想發(fā)布restful webservice,要通過(guò)一個(gè)叫JAXRSServerFactoryBean的類(lèi)來(lái)發(fā)布。這個(gè)類(lèi)有幾個(gè)方法是要了解的:

public void setResourceClasses(Class... classes);
那一系列的Class類(lèi)型的參數(shù),是告訴這個(gè)類(lèi),發(fā)布服務(wù)時(shí),會(huì)用到的POJO(就像上邊寫(xiě)的Room,Person)。

public void setAddress(String address);
這個(gè)方法是告訴這個(gè)類(lèi),服務(wù)的地址,比如"http://localhost:9999"

public void setServiceBeans(Object... beans)
這里是重點(diǎn),這個(gè)方法,要給這個(gè)用來(lái)發(fā)布服務(wù)的類(lèi)一個(gè)Service bean.這個(gè)Bean是我們要手動(dòng)編寫(xiě)的,作用是告訴服務(wù),收到什么樣的請(qǐng)求,應(yīng)該怎么樣處理。

現(xiàn)在,先來(lái)編寫(xiě)這個(gè)Service bean:

Java代碼  收藏代碼
  1. package com.server;  
  2.   
  3. import javax.ws.rs.Consumes;  
  4. import javax.ws.rs.DELETE;  
  5. import javax.ws.rs.GET;  
  6. import javax.ws.rs.POST;  
  7. import javax.ws.rs.PUT;  
  8. import javax.ws.rs.Path;  
  9. import javax.ws.rs.PathParam;  
  10. import javax.ws.rs.Produces;  
  11.   
  12. import com.DAO.Person;  
  13. import com.DAO.Room;  
  14. import com.DAO.RoomDAO;  
  15. import com.DAO.Rooms;  
  16.   
  17. @Path("/roomservice")  
  18. @Produces("application/xml")  
  19. public class RoomService {  
  20.       
  21.     @GET  
  22.     @Path("/room/{id}")  
  23.     @Consumes("application/xml")  
  24.     public Room getRoom(@PathParam("id")String id )  
  25.     {  
  26.         System.out.println("get room by id= "+id);  
  27.         Room room=RoomDAO.getRoom(id);  
  28.         return room;  
  29.     }  
  30.     @GET  
  31.     @Path("/room")  
  32.     @Consumes("application/xml")  
  33.     public Rooms getAllRoom()  
  34.     {  
  35.         System.out.println("get all room");  
  36.         Rooms rooms=RoomDAO.getRooms();  
  37.         return rooms;  
  38.     }  
  39.       
  40.     @POST  
  41.     @Path("/room")  
  42.     @Consumes("application/xml")  
  43.     public void addRoom(Room room)  
  44.     {  
  45.         System.out.println("add room which id is:"+room.getId());  
  46.         RoomDAO.addRoom(room);  
  47.     }  
  48.     @PUT  
  49.     @Path("/room/{id}")  
  50.     @Consumes("application/xml")  
  51.     public void updateRoom(@PathParam("id")String id,Room room)  
  52.     {  
  53.         System.out.println("update room which original id is:"+room.getId());  
  54.         RoomDAO.updateRoom(id,room);  
  55.     }  
  56.     @DELETE  
  57.     @Path("/room/{id}")  
  58.     @Consumes("application/xml")  
  59.     public void deleteRoom(@PathParam("id")String id)  
  60.     {  
  61.         System.out.println("remove room by id= "+id);  
  62.         RoomDAO.deleteRoom(id);  
  63.     }  
  64.     @POST  
  65.     @Path("/room/{id}")  
  66.     @Consumes("application/xml")  
  67.     public void addPerson(@PathParam("id") String id,Person person)  
  68.     {  
  69.         System.out.println("add person who's name is:"+person.getName());  
  70.         RoomDAO.addPerson(id, person);  
  71.     }  
  72.     @DELETE  
  73.     @Path("/room/{id}/{name}")  
  74.     @Consumes("application/xml")  
  75.     public void deletePerson(@PathParam("id")String id,@PathParam("name")String name)  
  76.     {  
  77.         System.out.println("remove person who's name is: "+name);  
  78.         RoomDAO.deletePerson(id, name);  
  79.     }  
  80. }  





需要注意:每個(gè)方法之前,要用annotation聲明http請(qǐng)求的method類(lèi)型,比如GET,DELETE,POST, PUT.

@Produces("application/xml")我還沒(méi)弄清楚到底是聲明的接受格式還是返回格式,還是其他。

@Path("/room/{id}")中的id是一個(gè)參數(shù),應(yīng)該在方法的參數(shù)列表中聲明:
public void deletePerson(@PathParam("id")String id,@PathParam("name")String name)
這樣就能得到URL中的id了。

現(xiàn)在,這些房間被資源化了,id為001的房間被資源化為一個(gè)URL,那地址應(yīng)該是
http:{服務(wù)器地址}:{端口}/roomservice/rrom/001  

現(xiàn)在,創(chuàng)建一個(gè)Server:
Java代碼  收藏代碼
  1. package com.server;  
  2.   
  3. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;  
  4.   
  5. import com.DAO.Person;  
  6. import com.DAO.Room;  
  7. import com.DAO.Rooms;  
  8.   
  9. public class Server {  
  10.   
  11.     public static void main(String[] args) {  
  12.         RoomService service = new RoomService();  
  13.   
  14.         // Service instance  
  15.         JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();  
  16.         restServer.setResourceClasses(Room.class,Person.class,Rooms.class);  
  17.         restServer.setServiceBeans(service);  
  18.         restServer.setAddress("http://localhost:9999/");  
  19.         restServer.create();  
  20.     }  
  21. }  



現(xiàn)在,服務(wù)已經(jīng)發(fā)布成功了,在瀏覽器輸入http://localhost:9999/roomservice/room/001  得到結(jié)果:
Xml代碼  收藏代碼
  1. <room>  
  2. <id>001</id>  
  3.   
  4. <persons>  
  5.   
  6. <entry>  
  7. <key>Boris</key>  
  8.   
  9. <value>  
  10. <name>Boris</name>  
  11. <sex>male</sex>  
  12. </value>  
  13. </entry>  
  14. </persons>  
  15. </room>  


如果用瀏覽器去訪問(wèn),發(fā)送的http請(qǐng)求只能所GET,因此如果想對(duì)數(shù)據(jù)進(jìn)行操作,必須寫(xiě)一個(gè)客戶(hù)端。
在寫(xiě)客戶(hù)端之前,有一個(gè)問(wèn)題:
在瀏覽器輸入http://localhost:9999/roomservice/room/
什么都看不到,可是,我想要得到房間列表。但是,cxf發(fā)布restful只認(rèn)你給他的類(lèi)的class。所以你想讓服務(wù)器返回一個(gè)room的列表給客戶(hù)端,是不行的。所以,必須想別的辦法,我是又寫(xiě)了一個(gè)POJO,這個(gè)POJO里只有一個(gè)屬性,就是一個(gè)存放所有room的Map:
package com.DAO;

Java代碼  收藏代碼
  1. import java.util.Map;  
  2.   
  3. import javax.xml.bind.annotation.XmlRootElement;  
  4. @XmlRootElement(name="rooms")  
  5. public class Rooms {  
  6.     Map<String,Room> rooms;  
  7.     public Rooms()  
  8.     {  
  9.         rooms=RoomDAO.getMapOfRooms();  
  10.     }  
  11.     public Map<String, Room> getRooms() {  
  12.         return rooms;  
  13.     }  
  14.     public void setRooms(Map<String, Room> rooms) {  
  15.         this.rooms = rooms;  
  16.     }  
  17. }  

這樣,然后再把DAO的方法加上:
Java代碼  收藏代碼
  1. @GET  
  2.     @Path("/room")  
  3.     @Consumes("application/xml")  
  4.     public Rooms getAllRoom()  
  5.     {  
  6.         System.out.println("get all room");  
  7.         Rooms rooms=RoomDAO.getRooms();  
  8.         return rooms;  
  9.     }  


這樣就能以list的形式顯示出所有room了。
訪問(wèn)http://localhost:9999/roomservice/room/
結(jié)果如下:
Xml代碼  收藏代碼
  1. <rooms>  
  2.   
  3. <rooms>  
  4.   
  5. <entry>  
  6. <key>006</key>  
  7.   
  8. <value>  
  9. <id>006</id>  
  10. <persons/>  
  11. </value>  
  12. </entry>  
  13.   
  14. <entry>  
  15. <key>001</key>  
  16.   
  17. <value>  
  18. <id>001</id>  
  19.   
  20. <persons>  
  21.   
  22. <entry>  
  23. <key>Boris</key>  
  24.   
  25. <value>  
  26. <name>Boris</name>  
  27. <sex>male</sex>  
  28. </value>  
  29. </entry>  
  30. </persons>  
  31. </value>  
  32. </entry>  
  33. </rooms>  
  34. </rooms>  



關(guān)于客戶(hù)端 http://sunbo1591./blog/766029

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多