概述
在系列二中,PersonResource使用很多的注解,這些注解都是基於jsr311規范實現的,所使用的jar包就是api目錄下的javax.ws.rs-api-2.0.1.jar。在早期的1.x版本中使用的是jsr311-api-1.1.1.jar,而javax.ws.rs-api-2.0.1.jar要比jsr311-api-1.1.1.jar功能更加強大,比如@BeanParam,有興趣的話可以自行查看文檔比較兩者的差異,這里不再贅述。
下面主要講一下javax.ws.rs-api-2.0.1.jar常用到的注解。
@Path
@Path有兩個作用:
- 標注class,表明該類是個資源類。凡是資源類,必須使用@Path注解,不然jersey無法掃描到該資源類。
- 標注method,表示具體的請求資源的路徑
這點和Spring的@RequestMapping不同,@RequestMapping只是簡單的注解請求路徑而已,@Controller才是表明該類是個action,而@Path一人扮演兩個角色。
@GET
@GET、@POST、@PUT、@DELETE指明http請求的方式屬於get,post,put,delete中的哪一種。具體的指定請求方式,需要在客戶端發起請求指定
@Consumes
指定http請求的MIME類型,默認是*/*,表示任意的MIME類型。該注解的值是個數組類型,支持多個MIME類型,可以使用MediaType來指定MIME類型(這里我很反感將Consumes直譯為消費者,這種翻譯會讓人晦澀難懂,就是指定請求的MIME類型而已)
@Produces
指定http響應的MIME類型,默認是*/*,表示任意的MIME類型。該注解的值是個數組類型,支持多個MIME類型,可以使用MediaType來指定MIME類型(同上,反感將Produces直譯為生產者,指定響應的MIME類型)
@PathParam
配合@Path來使用的,使用方式在@Path用{}來指定路徑中匹配的參數,這種匹配是通過正則表達式來實現的。比如PersonResource使用@Path("/{id}")
@QueryParam
@QueryParam獲取的參數,實際就是url中拼接在?后面的參數
@FormParam
客戶端以form(MIME為application/x-www-form-urlencoded)的方式提交表單,服務端使用@FormParam解析form表單中的參數
@FormDataParam
通常在上傳文件的時候,需要@FormDataParam。客戶端提交form(MIME為multipart/form-data)的方式提交表單,服務端使用@FormDataParam來解析form表單中的參數
@HeaderParam
獲取http請求頭中的參數值
@CookieParam
獲取http請求頭中cookie中的參數值
@MatrixParam
獲取請求URL中的參數中的鍵值對,必須使用“;”作為鍵值對的分隔符,比如/person/1;id=1;name=bella;age=22。除此之外呢,@MatrixParam可以接受List參數,尤其是在鍵值對key相同的時候,就會被解析為List
@DefaultValue
@DefaultValue配合@PathParam、@QueryParam、@FormParam、@FormDataParam、@MatrixParam、@HeaderParam、@CookieParam等使用,如果請求指定的參數中沒有值,就使用@DefaultValue中的值為默認值。注意:@DefaultValue指定的值在解析過程中出錯(比如@DefaultValue("test") @QueryParam("age") int age),將返回404錯誤。
@BeanParam
如果傳遞的參數較多,可以自己寫個bean,bean中的字段使用@PathParam、@QueryParam、@FormParam、@FormDataParam、@MatrixParam、@HeaderParam、@CookieParam來注解。而在resouces中具體方法參數中就可以使用@BeanParam來注解這個自定義的bean
@Context
用來注入,和Spring的@AutoWired效果類似。可以注入UriInfo、HttpHeader、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse等,按照業務需要選擇性注入。
@Encoded
禁止解碼,客戶端發送的參數是什么樣,服務器接收到的參數就是什么樣
總結
- 按照RESTFUL風格,選擇性地使用@GET、@POST、@PUT、@DELETE
- 參數的@*Param多樣,按照自己的需要來使用
- 想了解更多,可以查閱jersey官方文檔