jersey 过滤_Jersey
本文從以下兩個(gè)方面對(duì)jersey進(jìn)行介紹:(內(nèi)容主要來(lái)源于jersey官網(wǎng))
一、jersey簡(jiǎn)單介紹
二、jersey的實(shí)現(xiàn)基礎(chǔ):JAX-RS程序接口核心。
一、jersey簡(jiǎn)單介紹
前言:
如果沒(méi)有一套好的工具或框架,要開發(fā)一套能以多種媒體類型顯示數(shù)據(jù)、并且屏蔽client-server底層通信細(xì)節(jié) 的restful風(fēng)格的web service ,將是一件耗時(shí)耗力的事情。為了簡(jiǎn)化restful web 服務(wù)的開發(fā)成本、提高效率,JAVA EE6 引入的一個(gè)新技術(shù):JAX-RS。
JAX-RS(即Java API for RESTful Web Services),是一個(gè)Java 編程語(yǔ)言的應(yīng)用程序接口,支持按照表述性狀態(tài)轉(zhuǎn)移(REST)架構(gòu)風(fēng)格創(chuàng)建Web服務(wù)。JAX-RS和所有JAVA EE的技術(shù)一樣,只提供了技術(shù)標(biāo)準(zhǔn),允許各個(gè)廠家有自己的實(shí)現(xiàn)版本,實(shí)現(xiàn)版本有:RESTEasy(JBoss),?Jersey(Sun提供的參考實(shí)現(xiàn)),?Apache CXF,?Restlet(最早的REST框架,先于JAX-RS出現(xiàn)),?Apache Wink。JAX-RS基于JavaEE的Servlet。
Jersey
jersey是一套restful風(fēng)格的開源框架,jersey提供了JAX-RS接口,并且作為JAX-RS的一種參考實(shí)現(xiàn)。
jersey不僅僅是對(duì)JAX-RS接口的實(shí)現(xiàn),在此之外,還通過(guò)擴(kuò)展JAX-RS實(shí)現(xiàn)了自己的一些接口,這些擴(kuò)展接口可以進(jìn)一步的去簡(jiǎn)化restful服務(wù)的開發(fā),提升效率。
與JAVA SE 的版本兼容
jersey2.6? 及之前版本? 基于 JAVA SE 6
2.25. 系列?基于JAVA SE 7
2.26 基于JAVA SE 8
Jerset依賴
對(duì)于使用MAVEN進(jìn)行項(xiàng)目構(gòu)建的開發(fā)者來(lái)說(shuō),添加jersey依賴十分方便。mvn中心倉(cāng)庫(kù)包含了所有jersey的穩(wěn)定版本。如果有需要可以在https://maven.java.net上main獲取jersey的最新版本(開發(fā)測(cè)試版本)。
詳情可參考官方教程:https://jersey.github.io/documentation/latest/modules-and-dependencies.html
二、jersey實(shí)現(xiàn)的基礎(chǔ):AX-RS程序接口核心概念:資源和子資源
1、root resource classes
根資源類,是一種由@path注解、并且包含至少一個(gè)由@path或@GET、@POST等資源方法指示符 注解的方法? 的JAVA類。
資源方法,是帶有資源方法指示符的資源類的方法。
@Path 注解的值是URI的相對(duì)路徑?!∥覀兛梢栽赨RI中加入變量, 在資源方法中使用@PathParam 來(lái)獲取參數(shù):
@Path("/users/{username}")public classUserResource {
@GET
@Produces("text/xml")public String getUser(@PathParam("username") String userName) {
...
}
}
也是使用正則表達(dá)式對(duì)前端的查詢參數(shù)進(jìn)行過(guò)濾,如:? ??@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")
1)HTTP 相應(yīng)注解
@GET, @PUT, @POST, @DELETE and @HEAD 是由 JAX-RS? 定義的資源方法標(biāo)志符注解。其名稱與HTTP方法相對(duì)應(yīng),用于處理HTTP的相關(guān)請(qǐng)求。
2)@Produces 注解
@Produces 注解用于指定 表示一個(gè)資源的枚舉媒體類型??梢杂迷谫Y源類,也可以用在資源方法上(具有更高的優(yōu)先權(quán))。如下所示:
@Path("/myResource")
@Produces("text/plain")public classSomeResource {
//返回純文本
@GETpublicString doGetAsPlainText() {
...
}
//返回html
@GET
@Produces("text/html")publicString doGetAsHtml() {
...
}
}
另外,也可以同時(shí)使用多種媒體輸出類型。
3)@Consumes注解
用于指定資源方法可以消費(fèi)的媒體類型,用法與@produces類似。(用于輸入信息的過(guò)濾,而@Produces用于輸出信息的過(guò)濾)。@Consumers也可以使用在類或者方法上。
4)參數(shù)注解
@QueryParam用于從請(qǐng)求的URL上獲取查詢參數(shù)。而上文提及的@PathParam用于獲取 由@Path注解中定義的路徑參數(shù)。
@DefaultValue注解用于設(shè)置查詢參數(shù)的默認(rèn)值,注解用例如下:
@Path("smooth")
@GETpublicResponse smooth(
@DefaultValue("2") @QueryParam("step") intstep,
@DefaultValue("true") @QueryParam("min-m") booleanhasMin,
@DefaultValue("true") @QueryParam("max-m") booleanhasMax,
@DefaultValue("true") @QueryParam("last-m") booleanhasLast,
@DefaultValue("blue") @QueryParam("min-color") ColorParam minColor,
@DefaultValue("green") @QueryParam("max-color") ColorParam maxColor,
@DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) {
...
}
@PathParam注解 和其他 :@MatrixParam, @HeaderParam, @CookieParam, @FormParam等基于參數(shù)的注解,都遵循和@QueryParam注解一樣的使用規(guī)則。
其中,@ MatrixParam提取URL路徑段的信息。@ HeaderParam提取HTTP頭信息。@ CookieParam提取cookie相關(guān)的HTTP標(biāo)頭聲明。
@FormParam獲取來(lái)自表達(dá)的數(shù)據(jù),并且媒體類型必須為“application/x-www-form-urlencoded”。如下:
@POST
@Consumes("application/x-www-form-urlencoded")public void post(@FormParam("name") String name) {//Store the message
}
如果想獲取參數(shù)名到參數(shù)值得映射,使用如下方法:
@GETpublicString get(@Context UriInfo ui) {
MultivaluedMap queryParams =ui.getQueryParameters();
MultivaluedMap pathParams =ui.getPathParameters();
}
獲取cookie或者h(yuǎn)eader:
@GETpublicString get(@Context HttpHeaders hh) {
MultivaluedMap headerParams =hh.getRequestHeaders();
Map pathParams =hh.getCookies();
}
通常情況下,@Context注解可以用于獲取所有request、response相關(guān)的環(huán)境上下文java類型數(shù)據(jù)。
2.sub-resources
root resource class 中被@Path注解的方法就是 sub-resources(子資源)。
1)根據(jù)request URL對(duì)@Path標(biāo)識(shí)的子資源進(jìn)行分層匹配。如下(不同的請(qǐng)求路徑會(huì)向不同層級(jí)下的資源進(jìn)行匹配):
@Singleton
@Path("/printers")public classPrintersResource {
@GET
@Produces({"application/json", "application/xml"})publicWebResourceList getMyResources() { ... }
@GET @Path("/list")
@Produces({"application/json", "application/xml"})publicWebResourceList getListOfPrinters() { ... }
@GET @Path("/jMakiTable")
@Produces("application/json")publicPrinterTableModel getTable() { ... }
@GET @Path("/jMakiTree")
@Produces("application/json")publicTreeModel getTree() { ... }
@GET @Path("/ids/{printerid}")
@Produces({"application/json", "application/xml"})public Printer getPrinter(@PathParam("printerid") String printerId) { ... }
@PUT @Path("/ids/{printerid}")
@Consumes({"application/json", "application/xml"})public void putPrinter(@PathParam("printerid") String printerId, Printer printer) { ... }
@DELETE @Path("/ids/{printerid}")public void deletePrinter(@PathParam("printerid") String printerId) { ... }
}
3.life-cycle of root resource classes
默認(rèn)情況,在執(zhí)行每個(gè)request url 的時(shí)候,被匹配到的root resource classes都會(huì)新建一個(gè)實(shí)例。
以下是對(duì)生命周期進(jìn)行管理的三個(gè)注解:
@RequestScoped (默認(rèn)注解) 每個(gè)新的request都會(huì)創(chuàng)建一個(gè)新實(shí)例用于處理請(qǐng)求(同一個(gè)請(qǐng)求的實(shí)例不會(huì)被重復(fù)創(chuàng)建)。
@PerLookup 每次請(qǐng)求都會(huì)創(chuàng)建新實(shí)例。(即使處理的是同一個(gè)請(qǐng)求)
@Singleton 每一個(gè)jax-rs實(shí)例將會(huì)只產(chǎn)生一個(gè)實(shí)例資源。
4.注入規(guī)則
以下例子使用了多種注入值的使用方法(屬性、方法、構(gòu)造函數(shù)等注入值)
@Path("{id:\\d+}")public classInjectedResource {//Injection onto field
@DefaultValue("q") @QueryParam("p")privateString p;//Injection onto constructor parameter
public InjectedResource(@PathParam("id") intid) { ... }//Injection onto resource method parameter
@GETpublicString get(@Context UriInfo ui) { ... }//Injection onto sub-resource resource method parameter
@Path("sub-id")
@GETpublic String get(@PathParam("sub-id") String id) { ... }//Injection onto sub-resource locator method parameter
@Path("sub-id")public SubResource getSubResource(@PathParam("sub-id") String id) { ... }//Injection using bean setter method
@HeaderParam("X-header")public voidsetHeader(String header) { ... }
}
總結(jié)
以上是生活随笔為你收集整理的jersey 过滤_Jersey的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 系统开发基础:UML相关知识笔记
- 下一篇: 电脑技巧:这样检查电脑后终于知道为什么越