使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务-2 资源
 
- UID
- 1066743
|

使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务-2 资源
资源资源是组成 RESTful Web 服务的关键部分。您可以使用 HTTP 方法(如 GET、POST、PUT 和 DELETE)操作资源。应用程序中的所有内容都是资源:员工、联系人、组织等。在 JAX-RX 中,资源通过 POJO 实现,使用 @Path 注释组成其标识符。资源可以有子资源。在这种情况下,父资源是资源集合,子资源是成员资源。
在样例 Contacts 应用程序中,您将操作个人联系人和联系人集合。ContactsResource 是 /contacts URI 组成的集合资源,ContactResource 是 /contacts/{contactId} URI 组成的成员资源。下划线 JavaBean 是一个简单的 Contact 类,使用 id、名称和地址作为成员字段。参见清单 3 和清单 4 了解详情。您还可以从本文最后下载完整的代码包(参见 )。
清单 3. ContactsResource1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| @Path("/contacts")
public class ContactsResource {
@Context
UriInfo uriInfo;
@Context
Request request;
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<Contact> getContacts() {
List<Contact> contacts = >new ArrayList<Contact>();
contacts.addAll( ContactStore.getStore().values() );
return contacts;
}
@Path("{contact}")
public ContactResource getContact(
@PathParam("contact") String contact) {
return new ContactResource(uriInfo, request, contact);
}
}
|
有几个有趣的地方需要注意。
- @Context: 使用该注释注入上下文对象,比如 Request、Response、UriInfo、ServletContext 等。
- @Path("{contact}"):这是 @Path 注释,与根路径 “/contacts” 结合形成子资源的 URI。
- @PathParam("contact"):该注释将参数注入方法参数的路径,在本例中就是联系人 id。其他可用的注释有 @FormParam、@QueryParam 等。
- @Produces:响应支持多个 MIME 类型。在本例和上一个示例中,APPLICATION/XML 将是默认的 MIME 类型。
您也许还注意到了,GET 方法返回定制 Java 对象而不是 String(纯文本),正如上一个 Hello World 示例所示。 JAX-RS 规范要求实现支持多个表示形式类型,比如 InputStream、byte[]、JAXB 元素、JAXB 元素集合等等,以及将其序列化为 XML、JSON 或纯文本作为响应的能力。下文我将提供更多有关表示形式技术的信息,尤其是 JAXB 元素表示形式。
清单 4. ContactResource1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| public class ContactResource {
@Context
UriInfo uriInfo;
@Context
Request request;
String contact;
public ContactResource(UriInfo uriInfo, Request request,
String contact) {
this.uriInfo = uriInfo;
this.request = request;
this.contact = contact;
}
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Contact getContact() {
Contact cont = ContactStore.getStore().get(contact);
if(cont==null)
throw new NotFoundException("No such Contact.");
return cont;
}
}
|
ContactResource 的代码简单明了。注意以下内容:
- Representation Type Contact:Contact 是一个简单的 JavaBean,由 @XmlRootElement 注释,这使它可以表示为 XML 或 JSON。
- ContactStore:这是基于 HashMap 的内存数据存储库,其实现对于本文不重要。
|
|
|
|
|
|