<p><strong>一、Hello World</strong></p>
<p></p>
<p>编写一个名为HelloResource的资源</p>
<p><textarea cols="63" rows="15" name="code" class="java">package sample.hello.resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/hello")
public class HelloResource {
@GET
@Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String sayHello(){
return "Hello Jersey";
}
}
</textarea></p>
<ul>
<li>资源类(Resource Class):注意,资源类是一个简单的 Java 对象 (POJO),可以实现任何接口。这增加了许多好处,比如可重用性和简单。 </li>
<li>注释(Annotation):在 javax.ws.rs.* 中定义,是 JAX-RS (JSR 311) 规范的一部分。 </li>
<li>
<code>@Path</code>:定义资源基 URI。由上下文根和主机名组成,资源标识符类似于 http://localhost:8080/Jersey/rest/hello。 </li>
<li>
<code>@GET:</code>这意味着以下方法可以响应 HTTP <code>GET</code> 方法。 </li>
<li>
<code>@Produces:</code>以纯文本方式定义响应内容 MIME 类型。 </li>
</ul>
<p>在 web.xml 文件中定义 Jersey servlet 调度程度</p>
<p><br><textarea cols="74" rows="15" name="code" class="xhtml"><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>sample.hello.resources</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> </textarea></p>
<p></p>
<p>需要的类包:</p>
<li>
<a class="ulink" href="http://download.java.net/maven/2/com/sun/jersey/jersey-server/1.3/jersey-server-1.3.jar" target="_top">jersey-server.jar</a>, </li>
<li>
<a class="ulink" href="http://download.java.net/maven/2/com/sun/jersey/jersey-core/1.3/jersey-core-1.3.jar" target="_top">jersey-core.jar</a>, </li>
<li>
<a class="ulink" href="http://download.java.net/maven/2/javax/ws/rs/jsr311-api/1.1/jsr311-api-1.1.jar" target="_top">jsr311-api.jar</a>, </li>
<li><a class="ulink" href="http://repo1.maven.org/maven2/asm/asm/3.1/asm-3.1.jar" target="_top">asm.jar</a></li>
<p></p>
<p>如果报错:com.sun.jersey.spi.service.ServiceConfigurationError: jersey-server-components: A dependent class, org/jvnet/mimepull/MIMEParsingException, of the class com.sun.jersey.multipart.impl.MultiPartReader implementing the provider class java.lang.Object is not found. The provider implementation is ignored. </p>
<p></p>
<p>类包引起的问题,具体不详,只要保持以上4个包绝对没问题。</p>
<p></p>
<p>然后在url中输入<a href="http://localhost:8080/contextPath/rest/hello">http://localhost:8080/contextPath/rest/hello</a>,即可看到“Hello Jersey”的纯文本回复。</p>
<p></p>
<p></p>
<p></p>
<p><strong>二、Root Resource Classes</strong></p>
<p><strong></strong></p>
<p><strong></strong></p>
<p>Root Resource Classes是普通的POJO类,由@Path标注</p>
<p>有一个方法被@Path标注,或被@GET,@PUT,@POST,@DELETE标注。</p>
<p></p>
<p>1、@Path的值 就是 URL路径。</p>
<p>2、@Path可以传递变量,在运行时会被替换掉:</p>
<p>如: </p>
<p><textarea cols="50" rows="1" name="code" class="java">@Path("/users/{username}")</textarea></p>
<p>在这个例子上,用户访问这个URL就需要传递username这个参数</p>
<p></p>
<p>如:<a href="http://example.com/users/Galileo">http://example.com/users/Galileo</a></p>
<p></p>
<p>然后通过在一个请求方法中标注@PathParam来获得这个参数</p>
<p></p>
<p><textarea cols="66" rows="8" name="code" class="java">@Path("/users/{username}")
public class UserResource {
@GET
@Produces("text/xml")
public String getUser(@PathParam("username") String userName) {
...
}
}</textarea></p>
<p></p>
<p>3、@Path上定义的参数,可以使用正则表达式</p>
<p>如:@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")</p>
<p></p>
<p>此处,如果用户输出的参数不匹配,就会报404(Not Found)错误。</p>
<p></p>
<p>4、@Path中定义的URL前后是否有"/",都不会有影响。</p>
<p>所以在请求URL的末尾有无"/"也不会有影响。</p>
<p>所以<a href="http://localhost:8080/JerseyDemo/hello">http://localhost:8080/JerseyDemo/hello</a> 和</p>
<p> <a href="http://localhost:8080/JerseyDemo/hello/">http://localhost:8080/JerseyDemo/hello/</a>是一样的</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>编写一个名为HelloResource的资源</p>
<p><textarea cols="63" rows="15" name="code" class="java">package sample.hello.resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/hello")
public class HelloResource {
@GET
@Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String sayHello(){
return "Hello Jersey";
}
}
</textarea></p>
<ul>
<li>资源类(Resource Class):注意,资源类是一个简单的 Java 对象 (POJO),可以实现任何接口。这增加了许多好处,比如可重用性和简单。 </li>
<li>注释(Annotation):在 javax.ws.rs.* 中定义,是 JAX-RS (JSR 311) 规范的一部分。 </li>
<li>
<code>@Path</code>:定义资源基 URI。由上下文根和主机名组成,资源标识符类似于 http://localhost:8080/Jersey/rest/hello。 </li>
<li>
<code>@GET:</code>这意味着以下方法可以响应 HTTP <code>GET</code> 方法。 </li>
<li>
<code>@Produces:</code>以纯文本方式定义响应内容 MIME 类型。 </li>
</ul>
<p>在 web.xml 文件中定义 Jersey servlet 调度程度</p>
<p><br><textarea cols="74" rows="15" name="code" class="xhtml"><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>sample.hello.resources</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> </textarea></p>
<p></p>
<p>需要的类包:</p>
<li>
<a class="ulink" href="http://download.java.net/maven/2/com/sun/jersey/jersey-server/1.3/jersey-server-1.3.jar" target="_top">jersey-server.jar</a>, </li>
<li>
<a class="ulink" href="http://download.java.net/maven/2/com/sun/jersey/jersey-core/1.3/jersey-core-1.3.jar" target="_top">jersey-core.jar</a>, </li>
<li>
<a class="ulink" href="http://download.java.net/maven/2/javax/ws/rs/jsr311-api/1.1/jsr311-api-1.1.jar" target="_top">jsr311-api.jar</a>, </li>
<li><a class="ulink" href="http://repo1.maven.org/maven2/asm/asm/3.1/asm-3.1.jar" target="_top">asm.jar</a></li>
<p></p>
<p>如果报错:com.sun.jersey.spi.service.ServiceConfigurationError: jersey-server-components: A dependent class, org/jvnet/mimepull/MIMEParsingException, of the class com.sun.jersey.multipart.impl.MultiPartReader implementing the provider class java.lang.Object is not found. The provider implementation is ignored. </p>
<p></p>
<p>类包引起的问题,具体不详,只要保持以上4个包绝对没问题。</p>
<p></p>
<p>然后在url中输入<a href="http://localhost:8080/contextPath/rest/hello">http://localhost:8080/contextPath/rest/hello</a>,即可看到“Hello Jersey”的纯文本回复。</p>
<p></p>
<p></p>
<p></p>
<p><strong>二、Root Resource Classes</strong></p>
<p><strong></strong></p>
<p><strong></strong></p>
<p>Root Resource Classes是普通的POJO类,由@Path标注</p>
<p>有一个方法被@Path标注,或被@GET,@PUT,@POST,@DELETE标注。</p>
<p></p>
<p>1、@Path的值 就是 URL路径。</p>
<p>2、@Path可以传递变量,在运行时会被替换掉:</p>
<p>如: </p>
<p><textarea cols="50" rows="1" name="code" class="java">@Path("/users/{username}")</textarea></p>
<p>在这个例子上,用户访问这个URL就需要传递username这个参数</p>
<p></p>
<p>如:<a href="http://example.com/users/Galileo">http://example.com/users/Galileo</a></p>
<p></p>
<p>然后通过在一个请求方法中标注@PathParam来获得这个参数</p>
<p></p>
<p><textarea cols="66" rows="8" name="code" class="java">@Path("/users/{username}")
public class UserResource {
@GET
@Produces("text/xml")
public String getUser(@PathParam("username") String userName) {
...
}
}</textarea></p>
<p></p>
<p>3、@Path上定义的参数,可以使用正则表达式</p>
<p>如:@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")</p>
<p></p>
<p>此处,如果用户输出的参数不匹配,就会报404(Not Found)错误。</p>
<p></p>
<p>4、@Path中定义的URL前后是否有"/",都不会有影响。</p>
<p>所以在请求URL的末尾有无"/"也不会有影响。</p>
<p>所以<a href="http://localhost:8080/JerseyDemo/hello">http://localhost:8080/JerseyDemo/hello</a> 和</p>
<p> <a href="http://localhost:8080/JerseyDemo/hello/">http://localhost:8080/JerseyDemo/hello/</a>是一样的</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
本文介绍如何使用Java和Jersey框架创建一个简单的RESTful API。包括定义资源类、使用注解设置路径和响应类型,并配置servlet映射。
1042

被折叠的 条评论
为什么被折叠?



