博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jersey(1.19.1) - Root Resource Classes
阅读量:4917 次
发布时间:2019-06-11

本文共 7354 字,大约阅读时间需要 24 分钟。

Root resource classes are POJOs (Plain Old Java Objects) that are annotated with @Path have at least one method annotated with @Path or a resource method designator annotation such as @GET, @PUT, @POST, @DELETE. Resource methods are methods of a resource class annotated with a resource method designator. This section shows how to use Jersey to annotate Java objects to create RESTful web services.

The following code example is a very simple example of a root resource class using JAX-RS annotations. 

package com.sun.ws.rest.samples.helloworld.resources;import javax.ws.rs.GET;import javax.ws.rs.Produces;import javax.ws.rs.Path;// The Java class will be hosted at the URI path "/helloworld"@Path("/helloworld")public class HelloWorld {	// The Java method will process HTTP GET requests	@GET	// The Java method will produce content identified by the MIME Media type "text/plain"	@Produces("text/plain")	public String getClichedMessage() {		// Return some cliched textual content		return "Hello World";	}}

Let's look at some of the JAX-RS annotations used in this example.

 

@Path

The @Path annotation's value is a relative URI path. In the example above, the Java class will be hosted at the URI path /helloworld. This is an extremely simple use of the @Path annotation. What makes JAX-RS so useful is that you can embed variables in the URIs.

URI path templates are URIs with variables embedded within the URI syntax. These variables are substituted at runtime in order for a resource to respond to a request based on the substituted URI. Variables are denoted by curly braces. For example, look at the following @Path annotation:

@Path("/users/{username}")

In this type of example, a user will be prompted to enter their name, and then a Jersey web service configured to respond to requests to this URI path template will respond. For example, if the user entered their username as "Galileo", the web service will respond to the following URL:

http://example.com/users/Galileo

To obtain the value of the username variable the @PathParam may be used on method parameter of a request method, for example:

@Path("/users/{username}")public class UserResource {    @GET    @Produces("text/xml")    public String getUser(@PathParam("username") String userName) {        ...    }}

If it is required that a user name must only consist of lower and upper case numeric characters then it is possible to declare a particular regular expression, which overrides the default regular expression, "[^/]+?", for example:

@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")

In this type of example the username variable will only match user names that begin with one upper or lower case letter and zero or more alpha numeric characters and the underscore character. If a user name does not match that a 404 (Not Found) response will occur.

A @Path value may or may not begin with a '/', it makes no difference. Likewise, by default, a @Path value may or may not end in a '/', it makes no difference, and thus request URLs that end or do not end in a '/' will both be matched. However, Jersey has a redirection mechanism, which if enabled, automatically performs redirection to a request URL ending in a '/' if a request URL does not end in a '/' and the matching @Path does end in a '/'.

 

HTTP Methods

@GET, @PUT, @POST, @DELETE and @HEAD are resource method designator annotations defined by JAX-RS and which correspond to the similarly named HTTP methods. In the example above, the annotated Java method will process HTTP GET requests. The behavior of a resource is determined by which of the HTTP methods the resource is responding to.

The following example is an extract from the storage service sample that shows the use of the PUT method to create or update a storage container:

@PUTpublic Response putContainer() {    System.out.println("PUT CONTAINER " + container);    URI uri = uriInfo.getAbsolutePath();    Container c = new Container(container, uri.toString());    Response r;    if (!MemoryStore.MS.hasContainer(c)) {        r = Response.created(uri).build();    } else {        r = Response.noContent().build();    }    MemoryStore.MS.createContainer(c);    return r;}

By default the JAX-RS runtime will automatically support the methods HEAD and OPTIONS, if not explicitly implemented. For HEAD the runtime will invoke the implemented GET method (if present) and ignore the response entity (if set). For OPTIONS the Allow response header will be set to the set of HTTP methods support by the resource. In addition Jersey will return a  document describing the resource.

 

@Produces

The @Produces annotation is used to specify the MIME media types of representations a resource can produce and send back to the client. In this example, the Java method will produce representations identified by the MIME media type "text/plain".

@Produces can be applied at both the class and method levels. Here's an example:

@Path("/myResource")@Produces("text/plain")public class SomeResource {    @GET    public String doGetAsPlainText() {        ...    }    @GET    @Produces("text/html")    public String doGetAsHtml() {        ...    }}

The doGetAsPlainText method defaults to the MIME type of the @Produces annotation at the class level. The doGetAsHtml method's @Produces annotation overrides the class-level @Produces setting, and specifies that the method can produce HTML rather than plain text.

If a resource class is capable of producing more that one MIME media type then the resource method chosen will correspond to the most acceptable media type as declared by the client. More specifically the Accept header of the HTTP request declared what is most acceptable. For example if the Accept header is:

Accept: text/plain

then the doGetAsPlainText method will be invoked. Alternatively if the Accept header is:

Accept: text/plain;q=0.9, text/html

which declares that the client can accept media types of "text/plain" and "text/html" but prefers the latter, then the doGetAsHtml method will be invoked.

More than one media type may be declared in the same @Produces declaration, for example:

@GET@Produces({"application/xml", "application/json"})public String doGetAsXmlOrJson() {	...}

The doGetAsXmlOrJson method will get invoked if either of the media types "application/xml" and "application/json" are acceptable. If both are equally acceptable then the former will be chosen because it occurs first.

The examples above refer explicitly to MIME media types for clarity. It is possible to refer to constant values, which may reduce typographical errors, see the constant field values of .

 

@Consumes

The @Consumes annotation is used to specify the MIME media types of representations a resource can consume that were sent by the client. The above example can be modified to set the cliched message as follows:

@POST@Consumes("text/plain")public void postClichedMessage(String message) {	// Store the message}

In this example, the Java method will consume representations identified by the MIME media type "text/plain". Notice that the resource method returns void. This means no representation is returned and response with a status code of 204 (No Content) will be returned.

@Consumes can be applied at both the class and method levels and more than one media type may be declared in the same @Consumes declaration.

 

转载于:https://www.cnblogs.com/huey/p/5395241.html

你可能感兴趣的文章
解决Ajax跨域问题:Origin http://127.0.0.1:8080 is not allowed by Access-Control-Allow-Origin....
查看>>
为JQuery EasyUI 表单组件加上“清除”功能
查看>>
Java 文件名操作的相关工具类
查看>>
Mysql打开日志信息
查看>>
[Xcode 实际操作]六、媒体与动画-(14)使用SystemSoundId播放简短声音
查看>>
[Swift通天遁地]三、手势与图表-(6)创建包含三条折线的线性图表
查看>>
[Swift]LeetCode13. 罗马数字转整数 | Roman to Integer
查看>>
OpenGL学习笔记2017/8/29
查看>>
实验吧web加了料的报错注入
查看>>
字符窜转对象
查看>>
6、Linux 基础(二)
查看>>
Letter Combinations of a Phone Number
查看>>
C#动态操作DataTable(新增行、列、查询行、列等)
查看>>
Slim 微型框架的使用
查看>>
高程5.4 RegExp类型
查看>>
CMD复制文件夹
查看>>
尽力而为
查看>>
Java技术预备作业
查看>>
阿虎烧烤的新感悟-O2O你真的会玩吗?
查看>>
Oracle10g闪回恢复区详细解析(转载)
查看>>