最新消息:

webservice笔记4—— JAX-RS实现rest风格的webservice

JAVA 大步 2178浏览 0评论

    JAX-RS (Java API for XML-Restful Web Services) 介绍

JAX-RS 是基于Servlet构建的。
描述请求处理的过程:
          client request----->JAX-RS servlet----->JAX-RS application (e.g., predictions3)
Tomcat/Jetty中部署 JAX-RS 的web.xml 如下:
用来配置 JAX-RS servlet "拦截"  请求 然后 将这个请求 dispatches(转发) 到 jax-rs 应用中。

是否将应用打包成 WAR文件

打包 : 将所有用到的jar(库)放到 WAR文件中。
 有点是没有版本问题困扰(可能某个jar文件需要特定版本,而war文件已经将所有的jar打包了,所以可以发送给任何人,而无需在配置依赖就可以直接放到tomcat下运行),缺点是文件体积就变大了
不打包:则需要将jar(库)都放到TOMCAT_HOME/lib  ,然后重启tomcat。
优点是多个应用可以共享jar库
JAX-RS实现
 RI表示jersey, 是Metro project的部分,见: https://jersey.java.net (version 2.x).

   RESTful路由

 由  Rails framework 所倡导并流行, 现在被广泛的模仿。
  不同http请求操作
        // GET /predictions         /* Read all predictions */
public void doGet(...)
        // POST /predictions        /* Create a new prediction for data in the HTTP request body */
public void doPost(...)
        // GET /predictions/27      /* Read prediction with id = 27 */
public void doGet(...)
        // DELETE /predictions/27   /* Delete prediction with id = 27 */
public void doDelete(...)
 在如JAX-RS 和 Restlet等框架中,  REST-style routes 可以通过注解(Annotation)来指定
注解可以指定Http的动作,即响应的http请求类型(e.g., GET) 和 名词,即客户端请求的url地址(e.g., URIs such as /predictions)
注解也可以指定响应的 MIME type  (e.g., application/json versus text/xml)
注解可以指定一个正则表达式来验证参数
   下面是伪代码的示例(JAX-RS实例中的很短):
        GET /predictions/{id: [0-9]+}     ###id必须是整数,如  12

 JAX-RS 来构建 predictions3 service 的代码组成

Prediction.java: 
被注解的javaBean类,使其可以自动生成xml
  •  @XmlElement 注解 被放在 属性的getter方法上,如: who, what, id 三个属性的getter方法
  •  重写toString() 以支持对 get请求 做出 text/plain类型的响应
PredictionsList.java: 
 被注解的javaBean类,同时也是作为主要的工具类。
     ##  @XmlElement 注解 被添加到getPredictions() 方法上,用于自动生成xml。
     ##  thread-safe(线程安全)
  • 使用  java.util.concurrent.CopyOnWriteArrayList存储 predictions
  • 使用线程安全的AtomicInteger  确保每一个Prediction实例对象都有唯一的id。
     ##  重写toString() 以支持  生成  text/plain(纯文本) 的predictions列表
 PredictionsRS.java: 
大量的使用@GET, @Path 和@Produces 注解来表示JAX-RS service中的  REST-style 的资源
  • 支持 RESTful 路由风格的所有的CRUD(增删查改)操作。
  • 默认生成xml,也可以是 JSON 和纯文本来响应 GET 请求。支持GET 来获取prediction列表或单个prediction记录
 RestfulPrediction.java: 
通过继承 JAX-RS 中的 javax.ws.rs.core.Application类,并重写getClasses() 来注册这个PredictionRS资源到JAX-RS的上下文(context)中
  •  注意JAX-RS中的 "拦截器" servlet  “拦截”与PredictionRS 资源相关的请求。

JAX-RS 的注解

下面是JAX-RS中比较重要的注解类:

Table 1. JAX-RS annotations

Annotation Description
@ApplicationPath(your_application_path) 这个注解是放在你的Application类上的。设置整个应用的路径
@PATH(your_path) 这个类是放在你的javabean类上的。设置路径为  基本URL+/your_path。这个基本URL是基于你应用的路径和web.xml中servlet的URL pattern的。
@POST 用在方法上,表示这个方法会响应HTTP POST请求
@GET 用在方法上,表示这个方法会响应HTTP GET请求
@PUT 用在方法上,表示这个方法会响应HTTP PUT请求
@DELETE 用在方法上,表示这个方法会响应HTTP DELETE 请求
@Produces(MediaType.TEXT_PLAIN[, more-types]) 用在方法上,表示这个方法会返回何种类的响应。例如,如果指定为 ("text/plain") ,则返回纯文本的响应。也可指定 "application/xml" or "application/json"等其他类型。
@Consumes(type[, more-types]) 用在方法上,表示这个方法接收含有特定MIME type的http请求
@PathParam 用在方法上,从URL中获取值注入为该方法的一个参数。例如,/predictions/1 ,则我们就可以通过这个注解,将1获取到,然后作为这个方法的参数,相当方便。

实例:

项目目录结构:

使用maven管理依赖

因为用到的库较多,而库又要依赖其他库,所以建议使用maven来管理,pom.xml文件如下:
predictions.db:
存放记录的文本文件
被读取的文本文件,一条记录一行,每行的内容都有"!"分隔为两部分。
Prediction :
javabean类,使用如:
@XmlRootElement(name = "prediction")
 @XmlElement
等注解来指定生成的xml元素。
PredictionsList :
javabean类,返回整个Predicliton的列表
PredictionsRS:
对http请求进行响应,返回对应的类型的请求。
是最重要的一个类。
RestfulPrediction :
继承了Application类,
通过@ApplicationPath 注解指定整个应用的路径。
测试:
http://localhost:8080/resourcesP/xml/1
http://localhost:8080/resourcesP/create
http://localhost:8080/resourcesP/update

http://localhost:8080/resourcesP/delete/33

 
点击下载完整demo

 

来自为知笔记(Wiz)

 

转载请注明:大步's Blog » webservice笔记4—— JAX-RS实现rest风格的webservice

SiteMap