使用環境:jdk1.5+eclispe3.4+myeclispe7
File=>New=>Web Service Project。
project name: restblog,選擇REST(JAX-RS) 下一步。
勾選core,jaxb,client,json然后下一步。
之所以創建servlet是因為會請求一些物理不存在的URI,事實上就是這個servlet在處理這些resource。
jaxb(Java Architecture for XML Binding)可以將java class序列號成xml,請參考http://java.sun.com/developer/technicalArticles/WebServices/jaxb/
json就不多說了,這個包可以實現java class 轉化成json。
點擊finish完成工程創建。
這樣創建的工程與通常的web工程的區別就是添加了servlet在web.xml,這里貼出servlet代碼:后續的文章中也會提到他。
<servlet>
<display-name>JAX-RS REST Servlet</display-name>
<servlet-name>JAX-RS REST Servlet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS REST Servlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
在工程的classpath下會引用下列包:
這些包可以從http://download.java.net/maven/2/com/sun/jersey/ 下載(使用maven2)
首先創建一個簡單的類Category
使用@XmlRootElement標注該類
點擊
圖標創建webservice,選擇restblog工程,Framework選擇REST(JAX-RS)

Java class : CategoryService
URL path: 資源路徑 填寫category ,這樣所有與category相關的資源都使用http://yourpath/services/category訪問
LIfecycle: Pre-request(JAX-RS default)每次請求時生成一個服務類實例(這里指CategoryService),singleton:單例,只存在一個實例
Consumes: 接受的contentType 包括application/xml ,application/json 通俗來說就是接受提交數據的格式。
Produces: 產生的數據格式選項同樣為applicatin/xml,application/json 等。
注意這里的Consumes/Produces是指請求http://yourpath/services/category的數據格式。
點擊 Add 按鈕添加服務方法,界面如下:
這是一個構造服務方法的界面,下面有代碼預覽。在添加參數的時候,選擇Param Type選項的意義:
Context: 這是一個標識該參數為請求上下文。可以直接獲得request的參數。
QueryParam:uri?之后的參數
PathParam:uri中的參數如:/category/{id}中的id就是PathParam
FormParam:使用post提交的參數。
CookieParam: Cookie參數。
HeaderParam: 請求的頭部信息。
也許你已經注意到沒有session參數,是的,所謂的"無狀態stateless"多少就體現在這里,web服務不保存請求相關的信息。
綜合上面的用法,下面的例子涵蓋了常用的服務方法的寫法,之中的處理過程暫時用硬編碼。后面的文章會介紹HIbernate,Spring的應用。
package com.dawnpro.restblog;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
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 javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
@Path("category")
public class CategoryService {
@GET
@Produces( {"application/json","application/xml"})
/**
* getCategories 產生json,xml兩種數據格式,具體那種格式取決于contentType
*/
public List<Category> getCategories() {
List<Category> result =new ArrayList<Category>();
result.add(new Category(1,"第一個分類"));
result.add(new Category(2,"第二個分類"));
return result;
}
@GET
@Path("{id}")
public Category getCategory(@PathParam("id") int id) {
return new Category(id,"id為"+id+"的類別");
}
@GET
@Path("json/{id}")
@Produces( "application/json")
public JSONObject getCategoryJson(@PathParam("id") int id){//產生json
JSONObject o =new JSONObject();
try {
o.put("id", id);
o.put("name", "id為"+id+"的category");
} catch (JSONException e) {
e.printStackTrace();
}
return o;
}
@PUT
@Path("add")
@Produces("text/html")
@Consumes( { "application/xml", "application/json" })
public String addCategory(Category category) {
System.out.println("處理添加類別邏輯,接受的數據為id:"+category.getId()+",name:"+category.getName());
return "ok";
}
@POST
@Path("addbyname")
public String addCategory(@FormParam("categoryname") @DefaultValue("[未命名]") String cateogryname) {
System.out.println("處理添加類別邏輯,接受的數據為name:"+cateogryname);
return "添加類別"+cateogryname+"成功";
}
@POST
@Produces("text/html")
@Path("updatecategory")
@Consumes( { "application/xml", "application/json" })
public String updateCategory(Category category) {
System.out.println("處理更新類別邏輯,接受的數據為id:"+category.getId()+",name:"+category.getName());
return "ok";
}
@DELETE
@Path("delete/{id}")
public String deleteCategory(@PathParam("id") int id) {
System.out.println("處理刪除類別邏輯,接受的數據為id:"+id);
return "ok";
}
@GET
@Path("commonProcess")
public String commonProcess(@Context UriInfo info){//@Context 參數標識UriInfo
StringBuilder buf = new StringBuilder();
for (String param: info.getQueryParameters().keySet()) {
buf.append(param+" : "+info.getQueryParameters().get(param));
buf.append("\n");
}
System.out.println(buf.toString());
return "ok";
}
}
你可以在CategoryService.java編輯中 右鍵菜單=>MyEclipse=>Add REST Method添加服務方法。
右鍵工程根目錄restblog選擇MyEclipse=>Test with RESTful WebServices Explorer 將會打開測試窗口。
瀏覽中的地址為:http://localhost:8080/restblog/services/application.wadl 首先/services是由servlet攔截。
如果在瀏覽器中瀏覽該地址,將得到一個xml文件。這個文件叫web service application description language。顧名思義他是一個服務描述文件。
需要說明的是當調用方法的參數為Category類型,調用時傳遞的是xml同時contentType設置為application/xml這樣jersey會將xml轉化為Category類型的對象。如果轉化出錯則服務調用失敗,會返回錯誤信息。
總結
本節主要介紹在Myeclipse中創建RESTful web service project 以及測試。到目前為止,只寫了兩個類就輕松的實現了RESTful Web service。
參考資料:
介紹rest:http://java.sun.com/developer/technicalArticles/WebServices/restful/
介紹使用myeclipse rest 支持http://www.myeclipseide.com/documentation/quickstarts/webservices_rest/
RESTful Web Services Developer's Guidehttp://docs.sun.com/app/docs/doc/820-4867?l=zh
netbeans的restful webservice 支持:http://www.netbeans.org/kb/60/websvc/rest_zh_CN.html