JAX-RS
JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services,是一个Java 编程语言的
应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和
服务端的开发和部署。
JAX-RS提供了一些标注将一个资源类,一个POJO Java类,封装为Web资源。标注包括:
@Path,标注资源类或者方法的相对路径
@GET,@PUT,@POST,@DELETE,标注方法是HTTP请求的类型。
@Produces,标注返回的MIME媒体类型
@Consumes,标注可接受请求的MIME媒体类型
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。
基于JAX-RS实现的框架有Jersey,RESTEasy等。这两个框架创建的应用可以很方便地部署到Servlet 容器中,比如Tomcat,JBoss等。值得一提的是RESTEasy是由JBoss公司开发的,所以将用RESTEasy框架实现的应用部署到JBoss服务器上,可以实现很多额外的功能。
1 先来看@queryparam
先看例子:
URL输入为:users/query?from=100&to=200&orderBy=age&orderBy=name
此时,输出为:
getUsers is called, from : 100, to : 200, orderBy[age, name]
要注意的是,跟@pathparam不同,@queryparam
中,指定的是URL中的参数是以键值对的形式出现的,而在程序中
@QueryParam("from") int from则读出URL中from的值,
而@pathparem中,URL中只出现参数的值,不出现键值对,比如:
“/users/2011/06/30”
则:
输出为:
getUserHistory is called, year/month/day : 2011/6/30
2 以动态的方式获得:
URL;users/query?from=100&to=200&orderBy=age&orderBy=name
输出为:
getUsers is called, from : 100, to : 200, orderBy[age, name]
注意这里把orderby后的两个参数读入为LIST处理了.
3 @DefaultValue,默认值
例子:
URL:users/query
输出:getUsers is called, from : 1000, to : 999, orderBy[name]
先看例子:
- Path("/users")
- public class UserService {
- @GET
- @Path("/query")
- public Response getUsers(
- @QueryParam("from") int from,
- @QueryParam("to") int to,
- @QueryParam("orderBy") List<String> orderBy) {
- return Response
- .status(200)
- .entity("getUsers is called, from : " + from + ", to : " + to
- + ", orderBy" + orderBy.toString()).build();
- }
- }
URL输入为:users/query?from=100&to=200&orderBy=age&orderBy=name
此时,输出为:
getUsers is called, from : 100, to : 200, orderBy[age, name]
要注意的是,跟@pathparam不同,@queryparam
中,指定的是URL中的参数是以键值对的形式出现的,而在程序中
@QueryParam("from") int from则读出URL中from的值,
而@pathparem中,URL中只出现参数的值,不出现键值对,比如:
“/users/2011/06/30”
则:
- @GET
- @Path("{year}/{month}/{day}")
- public Response getUserHistory(
- @PathParam("year") int year,
- @PathParam("month") int month,
- @PathParam("day") int day) {
- String date = year + "/" + month + "/" + day;
- return Response.status(200)
- .entity("getUserHistory is called, year/month/day : " + date)
- .build();
- }
输出为:
getUserHistory is called, year/month/day : 2011/6/30
2 以动态的方式获得:
- @Path("/users")
- public class UserService {
- @GET
- @Path("/query")
- public Response getUsers(@Context UriInfo info) {
- String from = info.getQueryParameters().getFirst("from");
- String to = info.getQueryParameters().getFirst("to");
- List<String> orderBy = info.getQueryParameters().get("orderBy");
- return Response
- .status(200)
- .entity("getUsers is called, from : " + from + ", to : " + to
- + ", orderBy" + orderBy.toString()).build();
- }
URL;users/query?from=100&to=200&orderBy=age&orderBy=name
输出为:
getUsers is called, from : 100, to : 200, orderBy[age, name]
注意这里把orderby后的两个参数读入为LIST处理了.
3 @DefaultValue,默认值
例子:
- @Path("/users")
- public class UserService {
- @GET
- @Path("/query")
- public Response getUsers(
- @DefaultValue("1000") @QueryParam("from") int from,
- @DefaultValue("999")@QueryParam("to") int to,
- @DefaultValue("name") @QueryParam("orderBy") List<String> orderBy) {
- return Response
- .status(200)
- .entity("getUsers is called, from : " + from + ", to : " + to
- + ", orderBy" + orderBy.toString()).build();
- }
URL:users/query
输出:getUsers is called, from : 1000, to : 999, orderBy[name]