請參考閱讀 http://www.ibm.com/developerworks/library/wa-restful/java
the article is good, but not refer to right links for converter download, append below:web
Jason format converterspring
Download jacson-all-1.9.11.jar json
http://www.java2s.com/Code/Jar/j/Downloadjacksonall1911jar.htm安全
XML format converter, 這個不用下載,已經包含在spring framework中.restful
詳細見spring-oxm-4.0.5.RELEASE.jar, 不過這個須要註冊bean才能行, 其它兩個須要註冊的是BufferImageHttpMessageConverter, FormHttpMessageConverter, 其餘的都是包含jar就能夠自動註冊,並使用了.網絡
atom format converter rome-1.0.jarsession
http://www.java2s.com/Code/Jar/r/Downloadrome10jar.htm
mvc
Message converter for XML, 其餘的自動註冊,不用寫. 固然寫也能夠,看着明白點。app
下面僅僅註冊了jaxb庫,其餘的包含在lib就能夠了。
<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> <constructor-arg ref="jaxbMarshaller" /> <property name="supportedMediaTypes" value="application/xml"/> </bean> <bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="packagesToScan"> <list> <value>com.company.product.entity.*</value> </list> </property> </bean>
Controller and requestmapping,實現了CRUD (Post,Get,Put,Delete).
能夠實現Representational state transfer,標準工業格式json and XML
還實現了mvc內建支持modelAndView.
/** * */ package com.company.product.controller; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.company.product.entity.Book; import com.company.product.entity.BookList; import com.company.product.interfaces.LibraryI; import com.company.product.jms.MsgProducer; /** * @author zhuji06 * */ @Controller public class LibraryController { private LibraryI library; public void setSender(MsgProducer sender){ this.sender = sender; } private MsgProducer sender; public void setLibrary(LibraryI library){ this.library = library; } //headers="Accept=application/json, application/xml" @RequestMapping(method=RequestMethod.GET,value="/") public @ResponseBody String welcome(){ sender.send("Welcome,Spring REST with ActiveMQ JMS."); return "Welcome,Spring REST."; } @RequestMapping(method=RequestMethod.GET,value="/books/{bookId}") public @ResponseBody Book getBook(@PathVariable("bookId") Integer bookId){ return library.getBook(bookId); } @RequestMapping(method=RequestMethod.GET,value="/books") public @ResponseBody BookList getBooks(){ return new BookList(library.getBooks()); } @RequestMapping(method=RequestMethod.POST,value="/books") public @ResponseBody Book createBook(@RequestBody Book book, HttpServletResponse response){ Integer id = library.addBook(book); response.setHeader("Location","/Books/"+id); return library.getBook(id); } @RequestMapping(method=RequestMethod.PUT,value="/books") public @ResponseBody Book updateBook(@RequestBody Book book, HttpServletResponse response){ Integer id = library.putBook(book); response.setHeader("Location","/Books/"+id); return library.getBook(id); } @RequestMapping(method=RequestMethod.DELETE,value="/books/{bookId}") public @ResponseBody void deleteBook(@PathVariable("bookId") Integer bookId){ library.deleteBook(bookId); } }
Entity and its Wrappers (能夠轉化xml and Json)
/** * */ package com.company.product.entity; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; /** * @author zhuji06 * */ @XmlRootElement public class Book { /** * */ private Integer id; private String name; private String description; public Book(){ super(); } public Book(Integer id, String name,String description){ this.setId(id); this.setName(name); this.setDescription(description); } @XmlElement(nillable=false,required=true) public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @XmlElement(name = "desc") public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { String s = " id :" + id + "\n Name :" + name + "\n description :" + description; return s; } }
下面的BookList純粹是爲了妥協jaxb對List等的支持很差,因此對其進行了包裝,這也能夠更好的輸出list.
package com.company.product.entity; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="books") public class BookList { private int count; private List<Book> books; public BookList() {} public BookList(List<Book> books) { this.books = books; this.count = books.size(); } public int getCount() { return count; } public void setCount(int count) { this.count = count; } @XmlElement(name="book") public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } }
如何進行REST 測試呢?
目前商業的比較全的是ibm 的soapUI, 有15天適用版,還有開源的RestClient, java寫的簡單的測試工具,能夠去sourceforge上去下載.其實有另外一個強大網絡檢測工具,能夠試用,它就是Fiddler,本身百度去。
在右側有Composer頁面,能夠指定Action, URL, Header, and Body等。
這裏也須要提醒,若是測試Get方法,須要指定Header裏:Accept: application/xml 或者Accept:application/json, 它們會被AnnotationMethodHandlerAdapter使用,先判斷URL,後判斷Accept, 而後檢查produces,來匹配返回的類型。
因此能夠兩種方式測試
Get http://localhost:8080/SpringREST/service/books/1.xml
Get http://localhost:8080/SpringREST/service/books/1.json
或者 Get http://localhost:8080/SpringREST/service/books/1
Accept: application/xml 或者Accept:application/json
另外在POST類型,須要指定Content-Type:application/json,而後填充Body內容爲json格式,如
{"id":0,"name":"Thinking in Java","description":"this is a base book."}
總結,REST service從風格角度是比較好理解和實現的,可是若是要實現一個徹底的,安全的服務,仍是須要ROD的思惟,而且實現authentication without session,這個下一個文章祥解.
Nice week nice day.