JAX-RS中QueryParam和MatrixParam有什么区别?

JAX-RS @QueryParam@MatrixParam什么@MatrixParam ? 从文档中,queryparam和matrixparam都可以在一个特殊条件下定位一个资源。 那么用例区别是什么?

PS:

Queryparam:

url ? key=value;

Matrixparam

url; key=value;

如本Oracle文档中所述 :

@PathParam和其他基于参数的注释@MatrixParam@HeaderParam@CookieParam@FormParam遵循与@FormParam相同的规则。 @MatrixParam从URL路径段中提取信息。 @HeaderParam从HTTP头中提取信息。 @CookieParam从cookie相关HTTP头中声明的cookie中提取信息。

示例(从这里得出):

 @Path("/books") public class BookService { @GET @Path("{year}") public Response getBooks(@PathParam("year") String year, @MatrixParam("author") String author, @MatrixParam("country") String country) { return Response .status(200) .entity("getBooks is called, year : " + year + ", author : " + author + ", country : " + country) .build(); } } 

请参阅以下URI模式和结果:

  1. URI模式: “/ books / 2012 /”

    getBooks被调用,年份:2012年,作者:null,国家:null

  2. URI模式: “/ books / 2012; author = andih”

    getBooks被称为,年份:2012年,作者:andih,country:null

  3. URI模式: “/ books / 2012; author = andih; country = germany”

    getBooks被称为,年份:2012年,作者:andih,国家:德国

  4. URI模式: “/ books / 2012; country = germany; author = andih”

    getBooks被称为,年份:2012年,作者:andih,国家:德国

有关差异的解释,您可以查看URL矩阵参数与请求参数

@MatrixParam注释将应用于URL中存在的特定资源, @QueryParam将应用于整个请求URL。

举一个超市的例子,如果你想要满足多种条件的所有水果,如类型=水果和价格范围从300开始并列出匹配的10个水果,你可以去下面的API设计,

 http://dev.brandstore.com/inventory/grocery;type=fruits/price;range=300/?limit=10 

在上面的示例中,第一个Matrix Param type=fruits仅适用于杂货资源相同range=300仅适用于价格资源,但分页limit=10查询参数适用于整个请求URL。 是的,如果只使用查询参数,你最终会得到像“grocery_type”和“grocery_price”这样的参数,你会失去请求中参数局部性所增加的清晰度。