`
mj4d
  • 浏览: 302902 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAX-RS:关于JAX-RS

阅读更多

1. RESTful

关于什么是RESTful网上已经有很多资料描述,比如这里以及原文. 而这里说到的JAXRS只是JAVA的一种实现

 

2. JAX-RS

目前有两个版本的规范:JSR311和JSR339 .查看具体的规范文档,发现提供了JSR339与JSR311相比提供了ClientAPI、Filter and Interceptor、Asynchronous Process等特性。下面简单介绍下需要涉及的要点

 

resources及入参

在RESTful中将网络中的任何资源描述为Resources,而JAX-RS中则采用特定的annotation来标识该java类作为一个网络资源可供其他访 问。同样resource类也有生命周期和上下文环境的概念,一般来说当客户端发起一个请求该resource类就实例化,当在正确的response后 就进入GC的环节。下面是一个POJO是如何成为一个resource的,前面说了是依靠一系列的annotation

@Path标注javabean为resource,一个resource至少需要一个@Path,可继承

@Path("/rest")  
public class RESTPathService {  
  
    /** 
     *\\/rest/meth1 
     * @return 
     * @author Administrator 
     * @date 2013-3-9 
     */  
    @GET  
    @Path("/meth1")  
    public Response meth1() {  
        return Response.status(200).entity("/rest/meth1 is called").build();  
    }  
  
    /** 
     * \\/rest/meth2/2 OK 
     * \\/rest/meth2/a Error 
     * @return 
     * @author Administrator 
     * @date 2013-3-9 
     */  
    @GET  
    @Path("/meth2/{id : \\d+}")//id必须为数字  
    public Response meth2() {  
        return Response.status(200).entity("/rest/meth2 is called").build();  
    }  
  
}  

@PathParam标注path template变量为方法参数

@Path("/rest")  
public class RESTPathParamService {  
  
    @GET  
    @Path("/meth1/{name}")  
    public Response meth1(@PathParam("name") String name2) {  
        return Response.status(200).entity("/rest/meth1/" + name2 + " is called").build();  
    }  
  
    @GET  
    @Path("/meth2/{name}/{id : \\d+}")  
    public Response meth2(@PathParam("name") String name2, @PathParam("id") Integer id) {  
        return Response.status(200).entity("/rest/meth2/" + name2 + "/" + id + " is called").build();  
    }  
  
}  

@QueryParam标注查询变量为方法参数,如?name=robin&age=30将name、age作为方法参数

@Path("/rest")  
public class RESTQueryParamService {  
  
    /** 
     * \\/rest/meth1?name=robin&age=30 
     *  
     * @param name 
     * @param age 
     * @return 
     * @author Administrator 
     * @date 2013-3-9 
     */  
    @GET  
    @Path("/meth1")  
    public Response meth1(@QueryParam("name") String name, @QueryParam("age") Integer age) {  
        return Response.status(200).entity("[name=" + name + ", age=" + age + "]").build();  
    }  
  
    /** 
     * \\/rest/meth2?name=robin&age=30 
     *  
     * @param info 
     * @return 
     * @author Administrator 
     * @date 2013-3-9 
     */  
    @GET  
    @Path("/meth2")  
    public Response meth2(@Context UriInfo info) {  
        return Response  
                .status(200)  
                .entity("[name=" + info.getQueryParameters().getFirst("name") + ", age="  
                        + info.getQueryParameters().getFirst("age") + "]").build();  
    }  
  
    /** 
     * \\/rest/meth3?username=robin&password=123123 
     *  
     * @param info 
     * @return 
     * @author Administrator 
     * @date 2013-3-9 
     */  
    @GET  
    @Path("/meth3")  
    public Response meth3(@QueryParam("") User user) {  
        return Response.status(200).entity("[name=" + user.getUsername() + ", password=" + user.getPassword() + "]")  
                .build();  
    }  
  
}  

@MatrixParam与QueryParam类似,还有FormParam,支持将参数封装为bean对象作为方法参数传入

@Path("/rest")  
public class RESTMatrixParamService {  
  
    /** 
     * \\/rest/meth1;name=robin;age=30; 
     *  
     * @param name 
     * @param age 
     * @return 
     * @author Administrator 
     * @date 2013-3-9 
     */  
    @GET  
    @Path("/meth1")  
    public Response meth1(@MatrixParam("name") String name, @MatrixParam("age") Integer age) {  
        return Response.status(200).entity("[name=" + name + ", age=" + age + "]").build();  
    }  
}  

@CookieParam 获取cookie作为参数

@HeaderParam 获取header作为参数

@Path("/rest")  
public class RESTHeaderParamService {  
  
    @GET  
    @Path("/meth1")  
    public Response meth1(@HeaderParam("user-agent") String userAgent) {  
        return Response.status(200).entity("[user-agent=" + userAgent + "]").build();  
    }  
  
    @GET  
    @Path("/meth2")  
    public Response meth2(@Context HttpHeaders headers) {  
        return Response.status(200).entity("[user-agent=" + headers.getRequestHeader("user-agent").get(0) + "]")  
                .build();  
    }  
  
}  

@Context注入资源的实例,如HttpHeader、UriInfo、Request等,见上面的例子

@DefaultValue标注一个参数的默认值

@Encoded参数编码

 

methods

在resource类中用来标识该方法作为一个request的HTTP请求方法,只有POJO中的public方法才能暴露为一个resource方法。通常与@Path一起 使用。该类的annotation与HTTP方法一致:@GET,@POST,@PUT,DELETE,HEAD和OPTIONS.

 

返回类型

一个resource方法可以返回void,Response,GenericEntity以及其他任何的Java类型:

void 返回空的entry body和204的状态码

Response 可自行设定返回的状态码,如果未指定会根据response中的entry来判断,如果entry为null状态码为204,否则为200:

Response.status(200).entity(Object entry).build()    

GenericEntity 实际上是对返回对象的简单包装:public class GenericEntity<T>同样对状态码和entry的关系遵循上面Response的原则

Other:一个实体对象即一个普通的POJO对象,为空状态码204,不为空状态码200

 

异常处理

简单的说异常可以实现WebApplicationException或者采用Response返回特定的错误码如500

 

uri模板

一个root resource类用@Path

我们常用@Path标注一个POJO类,来表示该类作为一个root resource,而其他的相对路径我们可以标注在方法或者子类的resource中。在annotation的值是自动编码的,如

@Path("widget list/{id}")    
@Path("widget%20list/{id}")    

是等同的。同时也可以支持正则的请求路径:

@Path("widgets/{path:.+}")   -->widgets/a/aa或widgets/a  
@Path("widgets/{id: \\d+}")   -->widgets/12  

 

 

MediaType

在JAX-RS中处理请求和相应的mediatype主要用@Consumes和@Produces可用在resource类或方法上

@Produces("text/html")  

如果任何类型都支持

@Produces("*/*")  

或者多个

@Produces("application/xml", "application/json")  
分享到:
评论

相关推荐

    jax-rs jax-ws所需包,亲测可用

    标题"jax-rs jax-ws所需包,亲测可用"表明这个压缩包包含了用于开发Java RESTful Web服务(JAX-RS)和Java SOAP Web服务(JAX-WS)所需的库文件。这些库是Java应用程序进行Web服务交互的核心组件,确保了对HTTP协议...

    [Jax-RS] RESTful Java 开发 (Jax-RS 实现) (英文版)

    [奥莱理] RESTful Java 开发 (Jax-RS 实现) (英文版) [奥莱理] RESTful Java with Jax-RS (E-Book) ☆ 图书概要:☆ Learn how to design and develop distributed web services in Java using RESTful ...

    [Jax-RS] RESTful Java 开发 (Jax-RS 2.0 实现) (英文版)

    The RESTEasy workbook that follows provides step-by-step instructions for installing, configuring, and running several working JAX-RS examples, using the JBoss RESTEasy implementation of JAX-RS 2.0. ...

    jackson-jaxrs-json-provider-2.7.8-API文档-中文版.zip

    赠送jar包:jackson-jaxrs-json-provider-2.7.8.jar; 赠送原API文档:jackson-jaxrs-json-provider-2.7.8-javadoc.jar; 赠送源代码:jackson-jaxrs-json-provider-2.7.8-sources.jar; 赠送Maven依赖信息文件:...

    一个包含jax-ws和jax-rs的例子(含服务端和客户端)

    标题中的“一个包含jax-ws和jax-rs的例子(含服务端和客户端)”是指这是一个示例项目,它演示了如何使用Java API for XML Web Services (JAX-WS)和Java API for RESTful Web Services (JAX-RS)来创建和消费Web服务。...

    JAX-WS API, JAX-RS API

    综上所述,JAX-WS和JAX-RS都是Java平台中处理Web服务的重要工具,但它们的侧重点不同。JAX-WS专注于SOAP协议的Web服务,而JAX-RS则面向RESTful风格的API设计。了解并熟练掌握这两个API,对于Java开发者来说,意味着...

    Jax-RS所需要的依赖jar

    7. **其他依赖**:除了上述核心组件外,"JAX-RS-Lib"可能还包括其他必要的依赖,如XML解析库(如JAXB,用于对象到XML的绑定),JSON库(如Jackson或Gson,用于处理JSON数据),以及HTTP连接管理库(如Apache ...

    JAX-RS入门jar包集合

    - `javax.ws.rs-api`:JAX-RS的核心API,定义了基本的注解和接口。 - `jersey-server`和`jersey-container-servlet`:Jersey是JAX-RS的一个实现,提供了服务器端的实现和支持。 - `jersey-client`:Jersey的客户端...

    SpringMVC精品资源--JAX-RS &amp; SpringMVC supported maven buil.zip

    这个压缩包"SpringMVC精品资源--JAX-RS & SpringMVC supported maven build.zip"显然是一个关于这两个框架的学习资源集合,特别是针对使用Maven构建的项目。 首先,SpringMVC是Spring框架的一部分,它是基于模型-...

    JAX-RS Extension

    **标题:“JAX-RS 扩展”** **描述**: 在Java世界中,JAX-RS(Java API for RESTful Web Services)是用于构建RESTful Web服务的标准API。这篇博客文章(遗憾的是,链接不可用)可能探讨了如何通过扩展JAX-RS来...

    JAX-RS包(内含1.0和1.4)

    JAX-RS,全称Java API for RESTful Web Services,是Java平台上的一个标准,用于构建RESTful风格的Web服务。REST(Representational State Transfer)是一种轻量级、基于HTTP协议的设计模式,常用于实现分布式系统中...

    JAX-RS+spring

    1. **集成方式**: 通常通过Spring的Servlet容器如Tomcat或Jetty来部署JAX-RS应用,Spring负责应用的上下文管理和依赖注入,JAX-RS处理REST接口。 2. **Spring REST**: 使用Spring MVC的`@RestController`注解创建...

    jax-rs 2.1规范最终版-英文

    JAX-RS 2.1规范的最终版发布于2017年7月13日,由编辑Pavel Bucek和Santiago Pericas-Geertsen负责,可通过邮件组jaxrs-spec@javaee.groups.io进行评论反馈。该规范的发布由Oracle Corporation支持,它进一步强化了...

    Spring MVC与JAX-RS比较与分析

    JAX-RS(JSR 311)指的是Java API for RESTful Web Services,Roy Fielding也参与了JAX-RS的制订,他在自己的博士论文中定义了REST。对于那些想要构建RESTful Web Services的开发者来说,JAX-RS给出了不同于JAX-WS...

    jax-rs开发实例(bookkeeping)

    **JAX-RS 开发实例:Bookkeeping** JAX-RS,全称为Java API for RESTful Web Services,是Java平台上的一个标准,用于构建RESTful Web服务。它为开发人员提供了一种简单、直观的方式来创建Web服务,这些服务可以...

    RESTful Java with JAX-RS 2.0

    《RESTful Java with JAX-RS 2.0》是一本专注于Java语言在构建RESTful服务方面的专著。作者Bill Burke以其在Java技术方面的深厚底蕴和对RESTful架构的深刻理解,引领读者深入理解并掌握JAX-RS 2.0标准。 书中首先...

    JAX-RS注解及使用方法

    JAX-RS 注解及使用方法 JAX-RS(Java API for RESTful Web Services)是一种基于 Java 语言的 RESTful Web 服务框架,它提供了一种简单、灵活的方式来开发 RESTful Web 服务。JAX-RS 使用注解来定义资源的行为和...

    jax-rs学习不错的资料

    ### JAX-RS:Java API for RESTful Web Services #### 概述 JAX-RS,全称为Java API for RESTful Web Services,是Java平台上用于构建RESTful Web服务的规范。这一规范由Sun Microsystems(现已被Oracle收购)于...

    java_webservice_JAX-RS.zip_cxf_jax_jax-rs_spring cxf

    Java Web服务,特别是JAX-RS(Java API for RESTful Web Services)和Apache CXF,是企业级应用程序中实现服务接口的重要技术。本教程将深入探讨如何在SSH(Spring、Struts、Hibernate)架构中集成Web服务,以及如何...

    JAX-RS-FileUpload-Jersey-Example

    标题“JAX-RS-FileUpload-Jersey-Example”暗示了我们将集中讨论如何利用这两个强大的工具来创建一个RESTful服务,允许用户通过HTTP请求上传文件。首先,让我们了解一下JAX-RS和Jersey的基本概念。 **JAX-RS简介** ...

Global site tag (gtag.js) - Google Analytics