Java Jersey使用總結
簡介
Jersey是JAX-RS(JSR311)開源參考實現用於构建RESTful Web service,它包含三个部分:html
-
核心服務器(Core Server):经过提供JSR 311中标准化的注释和API标准化,能够用直观的方式开发RESTful Web服务。java
-
核心客戶端(Core Client):Jersey客户端API可以帮助开发者与RESTful服务轻松通讯;git
-
集成(Integration):Jersey还提供能够轻松继承Spring、Guice、Apache Abdera的库。github
在本次开发中使用Jersey2.0,而且仅使用了核心服务器。web
設置Jersey環境
Maven
03 |
<groupId>org.glassfish.jersey.containers</groupId> |
04 |
<artifactId>jersey-container-servlet-core</artifactId> |
05 |
<version> 2.0 </version> |
10 |
<groupId>javax.xml.ws</groupId> |
11 |
<artifactId>jaxws-api</artifactId> |
12 |
<version> 2.1 </version> |
17 |
<groupId>org.codehaus.jackson</groupId> |
18 |
<artifactId>jackson-core-asl</artifactId> |
19 |
<version> 1.9 . 12 </version> |
22 |
<groupId>org.codehaus.jackson</groupId> |
23 |
<artifactId>jackson-mapper-asl</artifactId> |
24 |
<version> 1.9 . 12 </version> |
27 |
<groupId>org.codehaus.jackson</groupId> |
28 |
<artifactId>jackson-jaxrs</artifactId> |
29 |
<version> 1.9 . 12 </version> |
引入Jar文件方式
从Jersey开发包中将如下库复制的WEB-INF下的库目录:json
-
服务器:jersey-server.jar 、jersey-container-servlet-core.jar、jersey-container-servlet.jar、javax.ws.rs-api-2.0.jarapi
-
客户端:jersey-client.jar浏览器
-
common:jersey-common.jar服务器
-
json支持:在Jersey2.0中须要使用Jackson1.9才能支持json。app
Hello World
如下将展现一个Hello World
第一步:编写一个名为HelloResource的资源,它接受Http Get请求并响应“Hello Jersey”
2 |
public class HelloResource { |
4 |
@Produces (MediaType.TEXT_PLAIN) |
5 |
public String sayHello() { |
第二步:编写JAX-RS application
01 |
public class APIApplication extends ResourceConfig { |
02 |
public APIApplication() { |
04 |
register(HelloResource. class ); |
07 |
register(JacksonJsonProvider. class ); |
10 |
register(LoggingFilter. class ); |
第三步:在web.xml文件中定义servelt调度程序,目的是将全部REST请求发送到Jersey容器。除了声明Jersey Servlet外,还需定义一个初始化参数,指定JAX-RS application。
01 |
<!--用于定义 RESTful Web Service 接口--> |
03 |
<servlet-name>JerseyServlet</servlet-name> |
04 |
<servlet- class >org.glassfish.jersey.servlet.ServletContainer</servlet- class > |
06 |
<param-name>javax.ws.rs.Application</param-name> |
07 |
<param-value>cn.com.mink.resource.APIApplication</param-value> |
10 |
<load-on-startup> 1 </load-on-startup> |
13 |
<servlet-name>JerseyServlet</servlet-name> |
14 |
<url-pattern>/services/*</url-pattern> |
第四步:测试程序
在命令终端中输入如下命令,将会看到“Hello Jersey”。
curl http://host:port/services/hello
或者在浏览器中输入如下URL,将会看到“Hello Jersey”
http://host:port/services/hello
使用
资源
Root Resource And Sub-Resource
资源是组成RESTful服务的关键部分,能够使用HTTP方法(如:GET、POST、PUT和DELETE)操做资源。在JAX-RX中,资源经过POJO实现,使用@Path
注释组成其标识符。资源能够有子资源,父资源是资源集合,子资源是成员资源。
在如下样例代码中,
Resources是”/services” URI组成是集合资源,UserResource是“/services/user” URI组成的成员资源;
02 |
public class Resources { |
05 |
public UserResource getUserResource() { |
10 |
public BookResource getBookResource() { |
UserResource是“/user” URI组成的集合资源,getUser是“/user/{username}” URI组成的资源方法
2 |
public class UserResource { |
5 |
@Produces ( "application/json" ) |
6 |
public User getUser( @PathParam ( "username" ) String userName) { |
HTTP Methods
HTTP方法映射到资源的CRUD(建立、读取、更新和删除)操做,基本模式以下:
- HTTP GET:读取/列出/检索单个或资源集合。
- HTTP POST:新建资源。
- HTTP PUT:更新现有资源或资源集合。
- HTTP DELETE:删除资源或资源集合。
@Produces
@Produces
注释用来指定将要返回给client端的数据标识类型(MIME)。@Produces
能够做为class注释,也能够做为方法注释,方法的@Produces
注释将会覆盖class的注释。
-
指定一个MIME类型
@Produces(“application/json”)
-
指定多个MIME类型
@Produces({“application/json”,“application/xml”})
@Consumes
@Consumes
与@Produces
相反,用来指定能够接受client发送过来的MIME类型,一样能够用于class或者method,也能够指定多个MIME类型,通常用于@PUT
,@POST
。
参数(Parameter Annotations)
Parameter Annotations用于获取client发送的数据。本文只介绍经常使用的注解,更多详见Jersey用户手册
@PathParam
使用@PathParam
能够获取URI中指定规则的参数,好比:
3 |
@Produces (MediaType.APPLICATION_JSON) |
4 |
public User getUser( @PathParam ( "username" ) String userName) { |
当浏览器请求http://localhost/user/jack时,userName值为jack。
@QueryParam
@QueryParam
用于获取GET请求中的查询参数,如:
3 |
@Produces ( "text/plain" ) |
4 |
public User getUser( @QueryParam ( "name" ) String name, |
5 |
@QueryParam ( "age" ) int age) { |
当浏览器请求http://host:port/user?name=rose&age=25时,name值为rose,age值为25。若是须要为参数设置默认值,能够使用@DefaultValue
,如:
3 |
@Produces ( "text/plain" ) |
4 |
public User getUser( @QueryParam ( "name" ) String name, |
5 |
@DefaultValue ( "26" ) @QueryParam ( "age" ) int age) { |
当浏览器请求http://host:port/user?name=rose时,name值为rose,age值为26。
@FormParam
@FormParam
,顾名思义,从POST请求的表单参数中获取数据。如:
2 |
@Consumes ( "application/x-www-form-urlencoded" ) |
3 |
public void post( @FormParam ( "name" ) String name) { |
@BeanParam
当请求参数不少时,好比客户端提交一个修改用户的PUT请求,请求中包含不少项用户信息。这时能够用@BeanParam
。
2 |
@Consumes ( "application/x-www-form-urlencoded" ) |
3 |
public void update( @BeanParam User user) { |
User Bean定义以下:
01 |
@XmlRootElement (name = "user" ) |
04 |
private String userName; |
09 |
@FormParam ( "telephone" ) |
10 |
private String telephone; |
15 |
public String getUserName() { |
19 |
public void setUserName(String userName) { |
20 |
this .userName = userName; |
使用Map
在一个大型的server中,由于参数的多变,参数结构的调整都会由于以上几种方式而遇到问题,这时能够考虑使用@Context
注释,并获取UriInfo实例,以下:
2 |
public String get( @Context UriInfo ui) { |
3 |
MultivaluedMap<String, String> queryParams = ui.getQueryParameters(); |
4 |
MultivaluedMap<String, String> pathParams = ui.getPathParameters(); |
一样还能够经过@Context
注释获取ServletConfig
、ServletContext
、HttpServletRequest
、HttpServletResponse
和HttpHeaders
等,以下:
02 |
public class Resource { |
05 |
HttpServletRequest req; |
08 |
ServletConfig servletConfig; |
11 |
ServletContext servletContext; |
14 |
public String get( @Context HttpHeaders hh) { |
15 |
MultivaluedMap<String, String> headerParams = hh.getRequestHeaders(); |
16 |
Map<String, Cookie> pathParams = hh.getCookies(); |
Jersey返回Json和Xml
JAX-RS支持使用JAXB(Java API for XML Binding)将JavaBean绑定到XML或JSON,反之亦然。JavaBean必须使用@XmlRootElement
标注,没有@XmlElement
注释的字段将包含一个名称与之相同的XML元素,以下:
02 |
public class OptionResult { |
03 |
@XmlElement (name = "code" ) |
04 |
private String result; |
06 |
private String errorMsg; |
08 |
public String getResult() { |
12 |
public void setResult(String result) { |
16 |
public String getErrorMsg() { |
20 |
public void setErrorMsg(String errorMsg) { |
21 |
this .errorMsg = errorMsg; |
而后在REST服务中使用:
2 |
public class UserResource { |
4 |
@Produces ( "application/json" ) |
5 |
public OptionResult create( @BeanParam User user) { |
最后,要注册数据转换器,该转换器会自动将JavaBean转换为json数据:
01 |
public class APIApplication extends ResourceConfig { |
02 |
public APIApplication() { |
04 |
register(OptionResult. class ); |