Jersey は、RESTful Web サービスを構築するための JAX-RS (JSR311) のオープンソースリファレンス実装です。
Core Server (コアサーバー) JSR 311 で標準化されたアノテーションと API 標準化を提供することで、以下の 3 つの部分で使用できます。直感的な方法で RESTful Web サービスを開発します。
Core Client Jersey クライアント API は、開発者が RESTful サービスと簡単に通信するのに役立ちます
統合 Jersey は、Spring、Guice、Apache Abdera を簡単に継承できるライブラリも提供します
Jersey 環境をセットアップします
Maven
<!--jersey--> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>2.0</version> </dependency> <!--JAXB API--> <dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.1</version> </dependency> <!-- Json支持 --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.12</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.12</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.9.12</version> </dependency>
Jar ファイルを紹介しますメソッド
次のライブラリを Jersey 開発パッケージから WEB-INF 下のライブラリ ディレクトリにコピーします:
サーバー Jersey-server.jar、jersey-container-servlet-core.jar、jersey-container-servlet.jar、javax.ws .rs-api-2.0.jar
クライアント: Jersey-client.jar
共通: Jersey-common.jar
Jsonサポート: Jersey2.0サポートjsonにはJackson1.9が必要です。
デモ Hello Wolrd
ステップ 1: Http Get リクエストを受け入れ、「Hello Jersey」で応答する HelloResource という名前のリソースを作成します
@Path("/hello") public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String sayHello() { return "Hello Jersey"; } }
ステップ 2: JAX-RS アプリケーションを作成します
public class APIApplication extends ResourceConfig { public APIApplication() { //加载Resource register(HelloResource.class); //注册数据转换器 register(JacksonJsonProvider.class); // Logging. register(LoggingFilter.class); } }
ステップ 3: サーベルトスケジューラですべての REST リクエストを Jersey コンテナに送信することを目的として、web.xml ファイルで定義されます。 Jersey Servletの宣言に加えて、JAX-RSアプリケーションを指定する初期化パラメータも定義する必要があります。
<!--用于定义 RESTful Web Service 接口--> <servlet> <servlet-name>JerseyServlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>cn.com.mink.resource.APIApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JerseyServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
ステップ 4: プログラムをテストする
コマンド ターミナルに次のコマンドを入力すると、「Hello Jersey」が表示されます。
curl http://host:port/services/hello
またはブラウザに次の URL を入力すると、「Hello Jersey」が表示されます
http://host:port/services/hello
Use
リソース
ルート リソースとサブリソース
リソースは、RESTful サービスの重要な部分であり、HTTP メソッド (GET、POST、PUT、DELETE など) を使用してリソースを操作できます。 JAX-RX では、リソースは POJO を通じて実装され、@Path アノテーションを使用して識別子を形成します。リソースには子リソースを含めることができます。親リソースはリソース コレクションであり、子リソースはメンバー リソースです。
Resources は「/services」URI で構成されるリソースのコレクションであり、UserResource は「/services/user」URI で構成されるメンバー リソースです。
POJO は単純な Java オブジェクトを参照することに注意してください
@Path("/services") public class Resources { @Path("/user") public UserResource getUserResource() { ... } @Path("/book") public BookResource getBookResource() { ... } }
UserResource は「」で構成されます。 /user" URI コレクション リソース、getUser は "/user/{username}" URI で構成されるリソース メソッドです
中括弧内の内容はパラメーターです。ユーザー名は URL とパスにも表示されるため、この設定は合理的です。 url
@Path("/user") public class UserResource { @GET @Path("{username"}) @Produces("application/json") public User getUser(@PathParam("username") String userName) { ... } }
HTTPメソッド
HTTPメソッドは、リソースのCRUD(作成、読み取り、更新、削除)操作にマッピングされます。基本モードは次のとおりです:
HTTP GET: 単一リソースの読み取り/リスト/取得
HTTP。 POST: 新しいリソースを作成します
HTTP PUT: 既存のリソースまたはリソースコレクションを更新します
HTTP DELETE: リソースまたはリソースコレクションを削除します
@Produces
@Produces アノテーションは、返されるデータ識別タイプ (MIME) を指定するために使用されます。クライアント。 @Produces は、クラス アノテーションまたはメソッド アノテーションとして使用できます。メソッドの @Produces アノテーションは、クラスのアノテーションをオーバーライドします。 上書きの意味は、メソッドが独自の Produce を宣言している場合、そのメソッドが優先され、クラスは参照専用となることです。
MIME タイプを指定します
@Produces("application/json")
複数の MIME タイプを指定します
@Produces({" application/json","application/xml"})
@Consumes
@Consumes は、@Produces の逆で、クライアントから受け入れ可能な MIME タイプを指定するために使用することもできます。クラスまたはメソッドに使用するか、複数の MIME を指定できます。通常は @PUT、@POST に使用されます。
Parameter (パラメータアノテーション)
パラメータアノテーションは、クライアントから送信されたデータを取得するために使用されます。この記事では、一般的に使用されるアノテーションのみを紹介します。詳細については、Jersey ユーザー マニュアルを参照してください。
@PathParam
@PathParam を使用して、次のような URI で指定されたルールのパラメーターを取得します。
@GET @Path("{username"}) @Produces(MediaType.APPLICATION_JSON) public User getUser(@PathParam("username") String userName) { ... }
ブラウザーが http:// をリクエストしたとき。 localhost/user/jack、userName の値は jack です。
ここでのユーザー名は、Keyがユーザー名でvalueがjackであるという意味ではなく、/usr/に続くものがユーザー名であることに注意してください。ここでのユーザー名は単なる変数です
キーと値の形式については、次のようなものもあります。
@QueryParam
@QueryParam は、次のような GET リクエストでクエリ パラメータを取得するために使用されます。
@GET @Path("/user") @Produces("text/plain") public User getUser(@QueryParam("name") String name, @QueryParam("age") int age) { ... }
@GET @Path("/user") @Produces("text/plain") public User getUser(@QueryParam("name") String name, @DefaultValue("26") @QueryParam("age") int age) { ... }
ブラウザが http://host:port/user?name=rose をリクエストすると、名前の値はroseで、年齢値は26です。
@FormParam
@FormParam は、名前が示すように、POST リクエストのフォーム パラメーターからデータを取得します。例:
@POST @Consumes("application/x-www-form-urlencoded") public void post(@FormParam("name") String name) { // Store the message }
表单我一直没弄清楚到底是什么东西,但就使用的情况来看,就是key,value之类的东西
BeanParam
当请求参数很多时,比如客户端提交一个修改用户的PUT请求,请求中包含很多项用户信息。这时可以用@BeanParam。
User Bean定义如下:
@XmlRootElement(name = "user") public class User { @PathParam("userName) //我觉得这个应该是写错了,FormParam private String userName; @FormParam("name") private String name; @FormParam("telephone") private String telephone; @FormParam("email") private String email; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } ... }
使用Map
在一个大型的server中,因为参数的多变,参数结构的调整都会因为以上几种方式而遇到问题,这时可以考虑使用@Context 注释,并获取UriInfo实例,如下:
@GETpublic String get(@Context UriInfo ui) { MultivaluedMap<String, String> queryParams = ui.getQueryParameters(); MultivaluedMap<String, String> pathParams = ui.getPathParameters(); }
我觉得,可以认为map是上面几种情况的超集,因为它能够替代以上任意一种。map就是context
同样还可以通过@Context 注释获取ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等,如下:
@Path("/") public class Resource { @Context HttpServletRequest req; @Context ServletConfig servletConfig; @Context ServletContext servletContext; @GET public String get(@Context HttpHeaders hh) { MultivaluedMap<String, String> headerParams = hh.getRequestHeaders(); Map<String, Cookie> pathParams = hh.getCookies(); } }
Jersey返回Json和Xml
JAX-RS支持使用JAXB(Java API for XML Binding)将JavaBean绑定到XML或JSON,反之亦然。JavaBean必须使用@XmlRootElement标注,没有@XmlElement注释的字段将包含一个名称与之相同的XML元素,如下:
这里就说明了javabean和xml, json的关系
@XmlRootElement public class OptionResult { @XmlElement(name = "code") private String result; private String errorMsg; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public String getErrorMsg() { return errorMsg; } public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } }
然后在REST服务中使用:
@Path("/user") public class UserResource { @POST @Produces("application/json") public OptionResult create(@BeanParam User user) { ... } }
最后,要注册数据转换器,该转换器会自动将JavaBean转换为json数据:
public class APIApplication extends ResourceConfig { public APIApplication() { //加载Model register(OptionResult.class); //加载与OptionResult同一个packge的Model //packages(OptionResult.class.getPackage().getName()); //加载Resource register(UserResource.class); //注册数据转换器 register(JacksonJsonProvider.class); // Logging. register(LoggingFilter.class); } }
说明:返回XML数据的原理相同,仅仅是数据转换器不同,只需要在APIApplication中同时XML数据转换器即可。
Wiki上关于REST的总结
含状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.
资源是由URI来指定。
对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
通过操作资源的表现形式来操作资源。
资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。
应该注意区别应用的状态和连接协议的状态。HTTP连接是无状态的(也就是不记录每个连接的信息),而REST传输会包含应用的所有状态信息,因此可以大幅降低对HTTP连接的重复请求资源消耗。
实现举例:
每种操作都会对应一个函数
列举所有商品
GET http://www.store.com/products
呈现某一件商品
GET http://www.store.com/product/12345
下单购买
POST http://www.store.com/order
REST的优点
可更高效利用缓存来提高响应速度
通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
浏览器即可作为客户端,简化软件需求
相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
不需要额外的资源发现机制
在软件技术演进中的长期的兼容性更好
JavaBean
JavaBeans是Java语言中可以重复使用的软件组件,它们是一种特殊的Java类[1],将很多的对象封装到了一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。
优点
Bean可以控制它的属性,事件和方法是否暴露给其他程序
Bean可以接收来自其他对象的事件,也可以产生事件给其他对象
有软件可以配置Bean
Bean的属性可以被序列化,以供日后使用
JavaBean规范
要成为JavaBean类,必须遵循关于命名,构造器,方法的特定规范,有了这些规范,才能使用,复用,替代和连接javabean的工具。
规范是:
有一个public 无参构造器
属性可以通过get, set, is方法或者遵循特定命名规范的其他方法访问。
可序列化
一个例子
public class PersonBean implements java.io.Serializable { /** * <code>name</code>属性(注意大小写) */ private String name = null; private boolean deceased = false; /** 无参构造器(没有参数) */ public PersonBean() { } /** * <code>name</code>属性的Getter方法 */ public String getName() { return name; } /** * <code>name</code>属性的Setter方法 * @param value */ public void setName(final String value) { name = value; } /** * "deceased"属性的Getter方法 * 布尔型属性的Getter方法的不同形式(这里使用了is而非get) */ public boolean isDeceased() { return deceased; } /** * <code>deceased</code>属性的Setter方法 * @param value */ public void setDeceased(final boolean value) { deceased = value; } }
总结
1. Javabean提供了一种保证,即对于所有的成员变量,一定有get,set方法。并且还可以序列化
2. REST服务基于底层的保证来实现,因此可以简化很多事情,比如Javabean和XML的转换就可以写得相当简单。
更多Jersey 入门与Javabean相关文章请关注PHP中文网!