JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 。从JAVA EE 6开始,已经内置了该技术,跟.NET中的RESTful WCF类似,只要在常规方法上使用一些简单的注解,就可以对外暴露成RESTful 服务.
一、最基础的HelloWorld (无参数)
1 @Path("/") 2 public class MyService { 3 4 final String XMLNS_NAMESPACE = "http://yjmyzz.cnblogs.com/rest/service"; 5 final String ROOT_NODE = "root"; 6 7 @GET 8 @Path("/json/hello") 9 @Produces(MediaType.APPLICATION_JSON) 10 public JAXBElement<String> getHelloWorldJSON() { 11 JAXBElement<String> result = new JAXBElement<String>(new QName("", 12 ROOT_NODE), String.class, sayHelloWorld()); 13 return result; 14 } 15 。。。 16 }
1 private String sayHelloWorld() { 2 return "Hello JAX-RS!"; 3 }
解释:
@GET 表示该服务可以直接在浏览器地址栏里访问(对应HTTP请求中的GET方法)
@Path 这里用了二次,第一次是在Class上,相当服务的基地址;第二次是在方法上,表示具体某个服务方法的URL.
此外web.xml中,还需要增加以下内容:
1 <servlet-mapping> 2 <servlet-name>javax.ws.rs.core.Application</servlet-name> 3 <url-pattern>/rest/*</url-pattern> 4 </servlet-mapping>
@Produces 表示返回消息的格式,配合MediaType.APPLICATION_JSON说明,本方法返回Json字符串格式
以上几项综合起来,最终可以用类似 http://localhost:8080/jboss-as-helloworld-rs/rest/json/hello 的地址来访问,返回的结果为:
JAXBElement<T> 类似一个包装器(Wrapper),用于将返回对象做下json/xml格式的包装,比如上图中的{root:}就是它的功劳,感兴趣的朋友,可以把返回类似改成最原始的String对比下差异.
如果需要返回XML格式,只需要把@Produces后面的MediaType.APPLICATION_JSON换成MediaType.APPLICATION_XML就行了,即:
1 @GET 2 @Path("/xml/hello") 3 @Produces(MediaType.APPLICATION_XML) 4 public JAXBElement<String> getHelloWorldXML() { 5 JAXBElement<String> result = new JAXBElement<String>(new QName( 6 XMLNS_NAMESPACE, ROOT_NODE), String.class, sayHelloWorld()); 7 return result; 8 }
效果如下:
二、带一个基本类型参数的HelloWorld
1 @GET 2 @Path("/json/hi/{name}") 3 @Produces(MediaType.APPLICATION_JSON) 4 public JAXBElement<String> getHelloToNameJSON(@PathParam("name") String name) { 5 JAXBElement<String> result = new JAXBElement<String>(new QName("", 6 ROOT_NODE), String.class, sayHelloToName(name)); 7 return result; 8 } 9 10 @GET 11 @Path("/xml/hi/{name}") 12 @Produces(MediaType.APPLICATION_XML) 13 public JAXBElement<String> getHelloToNameXML(@PathParam("name") String name) { 14 JAXBElement<String> result = new JAXBElement<String>(new QName( 15 XMLNS_NAMESPACE, ROOT_NODE), String.class, sayHelloToName(name)); 16 return result; 17 }
1 private String sayHelloToName(String name) { 2 return "Hello " + name + ",welcome to the world of JAX-RS!"; 3 }
对比一下刚才的代码,有二个变化:
2.1 @Path上多了一个{name}的部分,表示url中,将允许以 /json/hi/xxx 的访问URL响应请求
2.2 方法参数前有一个 @PathParam("name") 的注解,表示如果按/json/hi/xxx的方式访问,则url中xxx的部分,会被映射到name这个参数上(说得更通俗点,就是通过解析url最后的xxx部分直接把name传进来)
运行效果如下:
三、返回结果为实体Bean
实际应用中,web服务返回的结果,除了基本类型,还有可能是实体Bean,先来定义一个User类
代码中加的一堆@XML开头的注解,是为了在传输过程中,如果需要以XML格式传输,这些注解可以帮助完成 XML <-> Obj的转换(详情可参见JAXB相关内容)
注意:这里我们没有使用JAXBElement<T>对结果进行包装,辅助方法getUser()代码如下
运行结果如下:
当然,也可以给方法增加参数,先从最基本类型的String参数耍起:
运行结果如下:
如果加上包装器JAXBElement<User>后,返回结果会变成什么样呢? 我也很好奇,so, 嘿-喂狗!
结果如下:
个中差异,请自行体会
四、单个String参数的实体Bean注入
web服务中方法的传入参数,不可能都是基础类型,同样也可以是实体Bean
1 @GET 2 @Path("/xml/product/{name}") 3 @Produces(MediaType.APPLICATION_XML) 4 public Product getProductXML(@PathParam("name") Product product) { 5 return getProductFromServer(product); 6 } 7 8 @GET 9 @Path("/xml/product2/{name}") 10 @Produces(MediaType.APPLICATION_XML) 11 public JAXBElement<Product> getProductXML2( 12 @PathParam("name") Product product) { 13 JAXBElement<Product> result = new JAXBElement<Product>(new QName( 14 XMLNS_NAMESPACE, ROOT_NODE), Product.class, 15 getProductFromServer(product)); 16 return result; 17 }
这里我们用到了一个新的Bean :Product类,代码如下:
先提个问题:从@Path上看,我们希望用类似 /xml/product/xxx 来请求该web方法,但是方法中的参数是一个Bean实例,而url中的xxx部分只是一个字符串,一个字符串如何被映射成一个Bean实例呢?
关键在于Product中的构造函数:Product(String name) ,方法getProductXML(@PathParam("name") Product product) 被请求时,url中的xxx部分会先映射成参数name,然后name又会被传入到构造函数Product(String name)中,于是一个崭新的Product对象诞生了!(可以通过eclipse Console的输出来印证Product(String name)是否被调用)
运行结果:
eclipse的控制台里,也可以看到构造器,确实被调用了
除了利用“带参数的构造器”来实现“url参数->Bean实例”的注入,JAX-RS机制还允许使用Bean自身提供的static valueOf()方法来实现注入,再来看一下示例:
从Product派生一个子类Book:
再定义一个新方法:
里面有一个辅助方法,代码如下:
运行效果如下:
eclipse的控制台信息如下:
五、POST方式的Bean实例参数注入
前面提到的都是GET方式的web服务方法,GET方式能传输的数据大小有限,对于较大的参数数据,直接POST的场景更常见,下面是一个示例:
解释一下:
又遇到了一个新的注解:@Consumes(MediaType.APPLICATION_JSON) 它表示传入的Book实例是json格式。
我们用jQuery以Ajax方式调用这个服务演示一下:
运行效果如下:
如果断点调试ajax,可以看到传过来的json串已经映射成Bean实例了
示例源代码下载:helloworld-rs.zip
相关推荐
[奥莱理] RESTful Java 开发 (Jax-RS 2.0 实现) (英文版) [奥莱理] RESTful Java with JAX-RS 2.0 (E-Book) ☆ 图书概要:☆ Learn how to design and develop distributed web services in Java, using RESTful ...
[奥莱理] 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(Java API for RESTful Web Services)是一个Java标准,它简化并促进了RESTful Web服务的开发。JAX-RS 2.0作为该标准的更新版本,引入了新的注解和方法来支持RESTful服务的构建。从定义资源到处理HTTP请求,...
JAX-RS是Java API for RESTful Web Services的简称,它是Java平台上的标准API,用于简化RESTful服务的开发。本文将深入探讨如何使用JAX-RS来构建RESTful Web Service,并结合实际代码示例进行解析。 首先,理解...
标题"jax-rs jax-ws所需包,亲测可用"表明这个压缩包包含了用于开发Java RESTful Web服务(JAX-RS)和Java SOAP Web服务(JAX-WS)所需的库文件。这些库是Java应用程序进行Web服务交互的核心组件,确保了对HTTP协议...
RESTful Java with JAX-RS 2.0 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...
Java API for RESTful Web Services (JAX-RS) 是Java平台上的另一项重要规范,它定义了如何在Java应用中创建RESTful Web服务。REST(Representational State Transfer)是一种轻量级的架构风格,强调资源的交互,...
标题中的“一个包含jax-ws和jax-rs的例子(含服务端和客户端)”是指这是一个示例项目,它演示了如何使用Java API for XML Web Services (JAX-WS)和Java API for RESTful Web Services (JAX-RS)来创建和消费Web服务。...
总结来说,JAX-RS是Java开发REST服务的标准API,通过其提供的注解和接口,开发者可以高效、简洁地构建RESTful服务。本压缩包包含的1.0和1.4版本,代表了JAX-RS在不同时间点的发展状态,可以供开发者根据项目需求选择...
JAX-RS(Java API for RESTful Web Services)是Java平台上的RESTful服务标准API,它定义了如何在Java中实现RESTful服务。 **JAX-RS与Java平台的集成**:JAX-RS不仅提供了实现RESTful服务的基本框架,还支持高级...
在Java世界中,JAX-RS 2.0是实现RESTful服务的标准API,它允许开发者通过注解轻松地创建RESTful Web服务。 本资料"restful_java_jax-rs_2_0-master"是针对Java开发者学习RESTful服务的一个重要资源,尤其是对于那些...
《RESTful Java with JAX-RS 2.0, 第二版》是一本专注于Java开发者如何通过JAX-RS(Java API for RESTful Web Services)2.0版本构建RESTful(Representational State Transfer)服务的书籍。REST是一种基于网络的...
JAX-RS,全称为Java API for RESTful Web Services,是Java平台上的一个标准,用于构建RESTful Web服务。它为开发人员提供了一种简单、直观的方式来创建Web服务,这些服务可以通过HTTP协议进行访问。RESTful架构风格...
在开发基于Java的RESTful Web服务时,JAX-RS(Java API for RESTful Web Services)扮演了核心角色。它是一种标准,允许开发者通过简单的注解来创建HTTP服务,简化了Web服务的开发过程。本资源包“Jax-RS所需要的...
《RESTful Java与JAX-RS》一书深入探讨了如何在Java环境下构建RESTful服务,利用JAX-RS标准实现高效、灵活的Web服务设计。本书由Bill Burke撰写,由O'Reilly Media出版,是专业开发人员和架构师了解REST架构原则及...
JAX-RS(Java™ API for RESTful Web Services)是Java平台上用于开发基于REST架构风格的Web服务的API。它是Java EE(Java Platform, Enterprise Edition)的一部分,也作为独立的JAX-RS Reference Implementation ...
总结来说,JAX-WS和JAX-RS是Java平台下创建Web服务的重要工具,它们分别对应于SOAP和RESTful两种不同的设计风格。Maven作为项目管理和构建工具,使得这些过程更加自动化和高效。而Spring框架的集成,则为服务的管理...
Java Web服务,特别是JAX-RS(Java API for RESTful Web Services)和Apache CXF,是企业级应用程序中实现服务接口的重要技术。本教程将深入探讨如何在SSH(Spring、Struts、Hibernate)架构中集成Web服务,以及如何...