一、前期准备:
1.了解Rest
2.相关工具下载
Jersey https://jersey.java.net/
由于版本问题,我使用的是1.19
二、搭建
1.创建动态Web工程jerseyTest
2.编辑编译环境,将jersey的lib文件夹下的包全部倒入,同时放到工程下WebContent/WebINF/lib文件夹下
3.编写HelloServiece类
package cn.service;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
@Path("/what")
public class HelloService {
@Path("/fa/{contact}")
@GET
@Produces("text/plain")
public String helloWorld(@PathParam("contact") String contact){
return "hello " + contact;
}
@Path("/sys/{contact}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public JSONObject sysnonym(@PathParam("contact") String contact){
JSONObject address = new JSONObject();
JSONArray addresses = new JSONArray();
try {
addresses.put(0, "address1");
addresses.put(1, "address2");
address.put("addresses", addresses);
} catch (JSONException e) {
e.printStackTrace();
}
return address;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>cn.service</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
5.运行,地址栏输入http://localhost:8080/jerseyTest/rest/what/fa/fssqawj,
显示:
hello fssqawj
三、常见问题
1.jersey的最新版本为2.x,由于版本不同许多包的名字也不一样,我选择的是1.19的版本
2.遇到Root resource classes not found,请clean prj之后重试一下
3.遇到包名不存在,请确保WebContent/WebINF下的lib文件夹有相应的jar
四、相关知识
REST 在 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一。
REST 中最重要的概念是资源(resources),使用全球 ID(通常使用 URI)标识。客户端应用程序使用 HTTP 方法(GET/
POST/ PUT/ DELETE
)操作资源或资源集。RESTful Web 服务是使用 HTTP 和 REST 原理实现的 Web 服务。通常,RESTful Web 服务应该定义以下方面:
- Web 服务的基/根 URI,比如 http://host/<appcontext>/resources。
- 支持 MIME 类型的响应数据,包括 JSON/XML/ATOM 等等。
-
服务支持的操作集合(例如
POST、GET、PUT
或DELETE
)。
JSR 311 或 JAX-RS(用于 RESTful Web Services 的 Java API)的提议开始于 2007 年,1.0 版本到 2008 年 10 月定稿。目前,JSR 311 版本 1.1 还处于草案阶段。该 JSR 的目的是提供一组 API 以简化 REST 样式的 Web 服务的开发。
在 JAX-RS 规范之前,已经有 Restlet 和 RestEasy 之类的框架,可以帮助您实现 RESTful Web 服务,但是它们不够直观。Jersey 是 JAX-RS 的参考实现,它包含三个主要部分。
- 核心服务器(Core Server):通过提供 JSR 311 中标准化的注释和 API 标准化,您可以用直观的方式开发 RESTful Web 服务。
- 核心客户端(Core Client):Jersey 客户端 API 帮助您与 REST 服务轻松通信。
- 集成(Integration):Jersey 还提供可以轻松集成 Spring、Guice、Apache Abdera 的库。
该代码中有几个地方需要强调:
- 资源类(Resource Class):注意,资源类是一个简单的 Java 对象 (POJO),可以实现任何接口。这增加了许多好处,比如可重用性和简单。
- 注释(Annotation):在 javax.ws.rs.* 中定义,是 JAX-RS (JSR 311) 规范的一部分。
-
@Path
:定义资源基 URI。由上下文根和主机名组成,资源标识符类似于 http://localhost:8080/Jersey/rest/hello。 -
@GET:
这意味着以下方法可以响应 HTTPGET
方法。 -
@Produces:
以纯文本方式定义响应内容 MIME 类型。
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
@Path("/sys/{contact}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public JSONObject sysnonym(@PathParam("contact") String contact){
JSONObject address = new JSONObject();
JSONArray addresses = new JSONArray();
try {
addresses.put(0, "address1");
addresses.put(1, "address2");
address.put("addresses", addresses);
} catch (JSONException e) {
e.printStackTrace();
}
return address;
}
{"addresses":["address1","address2"]}