《第10章jax-rs概述》由会员分享,可在线阅读,更多相关《第10章jax-rs概述(29页珍藏版)》请在金锄头文库上搜索。
1、基于JAX-RS的RESTful Web服务的构建,REST风格Web服务的构建框架,建立基于REST风格的Web服务可以采用一些技术框架简化构建过程,常用的技术框架包括: WCF 微软提供的基于.NET技术的RESTful Web服务构架的框架,可以使用.NET支持的各种语言编写服务实现代码。 JAX-RS规范 由Java标准化组织JCP(http:/jcp.org)制定的构建RESTful风格的Web服务的技术规范,目前最新的规范版本是2.1(JSR370)。 SpringFramework 是Spring的生态圈中对REST风格Web服务的实现。,JAX-RS规范和Jersey实现,从J
2、avaEE6规范开始,已经包含了JAX-RS作为RESTful Web Service的规范。 作为JavaEE规范参考实现的开源项目GlassFish,它的子项目Jersey实现了JAX-RS规范。可以从下载最新的版本。另外,很多JavaIDE例如NetBeans也集成了Jersey,用于对JAX-RS规范的支持。 JAX-RS规范要求必须在Java 5(JDK1.5和JRE5.0)以上开发和部署,只支持注解的开发方式。,JAX-RS服务的部署,利用JAX-RS规范开发的Web服务是Java Web程序(WAR文件)的一部分,可以直接部署在支持JavaEE6或者JavaEE7全部功能的服务器
3、中(例如GlassFish3.x或者4.x版本),也可以部署在仅支持Servlet/JSP及规范的服务器中(例如Tomcat)。 当在Servlet/JSP容器中部署时,需要在Web程序中添加对应的JAX-RS实现类库(例如Jersey)。如果需要使用JAX-RS的服务端事件(SSE),则要求容器必须支持Servlet3.0规范(例如,Tomcat7.x及以上版本);否则只要求容器支持Servlet2.5规范即可(例如,Tomcat6.x版本)。,资源类和资源方法,如前所述,ROA中的资源就是可以用URI描述的信息,在JAX-RS中,资源就是部署在Web程序中,可通过URI请求到的资源类实例。
4、 资源类 使用javax.ws.rs.Path注解定义其URI的公开类,JAX-RS也允许使用接口(interface)的实例作为资源。 资源方法 资源类或接口中能够处理诸如GET、POST等不同请求方式的公开方法。,资源类和资源方法的注解,javax.ws.rs.Path 标注资源类的URI,该注解也可以用于类中的资源方法。 javax.ws.rs.GET 标注该资源类中处理HTTP协议中GET请求的资源方法,经常用于查询。该资源方法应做到幂等。 javax.ws.rs.POST 标注该资源类中处理HTTP协议中POST请求的资源方法,通常用于资源的创建,资源标识由服务器端产生。 javax
5、.ws.rs.PUT 标注该资源类中处理HTTP协议中PUT请求的资源方法,经常用于更新,有时也用于资源的创建,但创建资源所需的标识应由客户端提供。该资源方法应做到幂等。,资源类和资源方法的注解,javax.ws.rs.DELETE 标注该资源类中处理HTTP协议中DELETE请求的资源方法,通常用于资源删除。该资源方法应做到幂等。 javax.ws.rs.HEAD 标注该资源类中处理HTTP协议中HEAD请求的资源方法,通常用于资源中元数据的获取。 javax.ws.rs.OPTIONS 标注该资源类型中处理HTTP协议中OPTIONS请求的资源方法,通常用于查询可用于资源的操作。,资源类示
6、例,import javax.ws.rs.PATH; import javax.ws.rs.GET; /PATH注解使用String类型的value参数,设定资源类的URI Path(“/hello“) /value参数名可以省略 public class Hello/资源类必须是公开的 /GET标注的资源方法必须也是公开的,处理GET请求 GET public String sayHello() return “hello,world!“; ,资源类的实例化,如前所述,JAX-RS服务是Web程序的一部分,当用户请求到来的时候,容器将建立资源类的实例,建立的方式有两种: 请求实例 这种方式是
7、每接到用户请求,都将建立对应的资源类的实例。 单例模式 所有请求都使用同一个资源类的实例,Application类,JAX-RS提供了javax.ws.rs.core.Application类用于设置资源类的两种实例化方式。 public abstract class Application private static final Set emptySet = Collections.emptySet(); /子类实现此抽象方法可以实现资源类的请求实例化模式 public abstract Set getClasses(); /子类改写此方法可以实现资源类的单例模式 public Set g
8、etSingletons() return emptySet; ,getClasses和getSingletons方法,public abstract Set getClasses() 此方法返回java.util.Set类型的一个集合,该集合中存储的是以请求实例化模式的资源类的Class对象,Class对象的获取可以通过表达式“类名.class“获取。 public Set getSingletons() 此方法返回的是以需要以单例模式建立实例的资源类的具体实例的java.util.Set类型的集合。在该方法中,可以直接建立对应资源类的实例,然后将这些实例加入到Set集合中,返回该Set集合
9、即可。,请求实例模式的Application示例,/* ApplicationConfig继承Application类,实现了getClasses抽象方法,将Hello资源类设置为请求实例化方式。 另外,可以使用类级注解ApplicationPath设置该Web程序中Web服务资源的URL模式,此示例中设置为/resource。 -*/ javax.ws.rs.ApplicationPath(“/resource“) public class ApplicationConfig extends Application Set prototypes= new java.util.HashSet(
10、); Override public Set getClasses() prototypes.add(Hello.class); return prototypes; ,单例模式的Application示例,/* 该示例实现了getClasses抽象方法的同时,改写了getSingletons方法,将Hello资源类设置为单例模式。 -*/ javax.ws.rs.ApplicationPath(“/singletonres“) public class ApplicationConfig extends Application Set singletons= new java.util.Ha
11、shSet(); public Set getClasses() return Collections.emptySet(); Override public Set getSingletons() return singletons.add(new Hello(); ,在web.xml中设置资源类,使用ApplicationPath设置服务资源的URL模式适用于直接支持JAX-RS规范的容器或者实现了Servlet3.0及以上的规范Servlet/JSP容器(如Tomcat7.x及以上版本)中部署时可用。 对于仅支持Servlet2.5规范的容器(如Tomcat6.x),JAX-RS的实现类
12、库一般会提供在web.xml中利用类似Servlet的配置方式配置服务资源的URL模式。 例如,org.glassfish.jersey.servlet.ServletContainer是Jersey提供的配置Servlet,它有一个名为“javax.ws.rs.Application“的起始参数,用于设定Web服务中继承Application的子类类名,配置该Servlet的url-pattern,就可设置Web程序中的JAX-RS服务的URL模式。,Jersey服务的web.xml配置示例, ServletAdaptor org.glassfish.jersey.servlet.Servl
13、etContainer javax.ws.rs.Application rs.ApplicationConfig ServletAdaptor /resource/* ,路径模板和PathParam注解,用Path定义资源的URI时,可以利用“模板名“定义路径模板,匹配任意字符形成的路径信息。模板名的实际值可通过PathParam注入给资源方法的对应参数。,假设对该服务的请求URI为“/hello/li”,则sayHello方法参数name的实际值将为“li“,Path(“/hello“) public class Hello GET Path(“name“) public String sa
14、yHello(PathParam(“name“) String name) return “hello,“+name; ,资源方法的参数注解,资源方法的参数的注解除去PathParam之外,还有其他一些类似的注解,可以用于获取HTTP请求中的其他一些数据。和PathParam一样,这些注解也都位于javax.ws.rs包中: QueryParam可以获取URL中查询字符串中的参数。 FormParam可以获取表单控件中存储的数据。 HeaderParam可以获取来源于请求头中的值。 CookieParam可以获取Cookie中的值。 MatrixParam可以获取矩阵参数中的参数值。 在使用这
15、些注解时,JAX-RS实现会按照资源方法参数的实际类型自动转换对应的数据。,QueryParam示例,Path(“/cal“) public class CalReSource GET public int add(QueryParam(“n“) int n, QueryParam(“m“) int m) return n+m; ,假设对该服务的请求URI为“/cal?n=1&m=2”,n和m都将自动转换为整型类型,add方法返回值将为3.,MatrixParam示例,矩阵参数是指在URL中以分号引导的名/值对,其中名和值之间用等号分开。例如:http:/localhost:8080/ws/hello;name=lili,Path(“/hello“) public class Hello GET public String sayHello( MatrixParam(“name“) String name) return “hello,“+name; ,假设此服务部署在本机中,上下文路径为ws,则上述的URL请求该资源时,sayHello方法参数name的值为lili。,BeanParam注解,BeanParam同样用于资源方法的参数,该注解可以把前述注解修饰的单