Jersey to create Restful webservice


1、Jerseyって何?
Jerseyは、Oracle社が発表したrestfulフレームワークでglassfishプロジェクトに属します.tomcat、jettyに統合して使用でき、サーブレットとSpringの統合をサポートし、jsr 311の1.1と1.0のバージョンをサポートします.公式サイト:http://jersey.com/restful方式のwebserviceを開発するには、対応するツールパッケージをダウンロードする必要があります.具体的なアドレスは以下の通りです.https://maven.java.net/content/repositories/releases/com/sun/jersey/インスタンスを実行するにはserverとclientを同時にダウンロードする必要があります.もちろんそんなに探したくないので、このzipバッグを直接降りることができます.https://maven.java.net/service/local/artifact/maven/redirect?r=releases&g=com.sun.jersey&a=jersey-archive&v=1.10&e=zip
2、Restアクセスとは
REST(REpresentational State Transfer)は、ウェブアプリケーションなどのアーキテクチャスタイルのネットワークシステムを記述する.2000年のRoy Fieldingの博士論文に初めて登場し、HTTP規範の主な編纂者の一人である.RESTとは、アーキテクチャ制約条件と原則のセットを指す.これらの制約条件と原則を満たすアプリケーションや設計がRESTfulです.Webアプリケーションの最も重要なREST原則は,クライアントとサーバ間のインタラクションが要求間で無状態であることである.クライアントからサーバへの各リクエストには、リクエストを理解するために必要な情報が含まれている必要があります.サーバがリクエスト間の任意の時点で再起動した場合、クライアントは通知されません.また、ステータスレスリクエストは、クラウドコンピューティングなどの環境に適している任意の利用可能なサーバで回答できます.クライアントは、パフォーマンスを向上させるためにデータをキャッシュできます.サーバ側では、アプリケーションのステータスと機能をさまざまなリソースに分けることができます.リソースは、クライアントに公開される興味深い概念エンティティです.リソースの例としては、アプリケーション・オブジェクト、データベース・レコード、アルゴリズムなどがあります.各リソースはURI(Universal ResourceIdentifier)を使用して唯一のアドレスを取得します.すべてのリソースは、クライアントとサーバ間でステータスを転送するために統一されたインタフェースを共有します.GET、PUT、POST、DELETEなどの標準的なHTTPメソッドが使用される.Hypermediaはアプリケーションステータスのエンジンで、リソースはハイパーリンクによって相互接続されていることを示します.
論文中国語ダウンロードアドレス:REST_cnアーキテクチャスタイルとネットワークベースのソフトウェアアーキテクチャ設計.pdf
RESTful Webサービス例
メソッド/リソースのセット、URI:http://host//resourcesメンバーリソース、URI:http://host//resources/1234
HTTPメソッドは、リソースのCRUD(作成、読み取り、更新、削除)操作にマッピングされます.PUTメソッドを作成または更新するなど、いくつかの小さな変更ができますが、基本的なモードは次のとおりです.
HTTP GET:リストを取得して、単一のリソースまたはリソースのセットを取得します.例えば、1234と識別されたリソースの表示形式を取得する.
HTTP POST:新規リソース.コレクションにデジタルリソースを作成します.IDは自動的に割り当てられ、次のサブリソースが作成されます.
HTTP PUT:既存のリソースまたはリソースのセットを更新します.1234とマークされたデジタルリソースを更新します.
HTTP DELETE:リソースまたはリソースセットを削除します.1234とマークされたデジタルリソースを削除します.
3、Jersey常用注記
Jerseyの配置はすべて注釈に基づいて、実体クラスとXML、JSONの間の変換、restサービスの発表、関連パラメータの配置などはすべて注釈に基づいて完成することができて、以下は使用する注釈を簡単に紹介します:注釈(Annotation):javax.ws.rs.*で定義されており、JAX-RS(JSR 311)仕様の一部です.@Path:リソースベースURIを定義します.コンテキストルートとホスト名で構成され、リソース識別子はhttp://localhost:8080/Jersey/rest/contacts. @GET:これは以下の方法がHTTP GET方法に応答できることを意味する.Produces:レスポンスコンテンツMIMEタイプをテキスト形式で定義します.@Context:Request、Response、User、ServiceletContextなどのコンテキストオブジェクトにコメントを入力します.@Path(「{contact}」):これは@Pathコメントであり、ルートパス「/contacts」と結合してサブリソースを形成するURIである.@PathParam(「contact」):この注釈は、メソッドパラメータにパラメータを注入するパス、すなわちidである.その他利用可能なコメントは@FormParam、@QueryParamなどです.@Consumes:このメソッドがHTML FORMを使用することを宣言します.@FormParam:メソッドのHTML属性決定のフォーム入力を入力します[email protected](uri).build():新しく作成した連絡先(/contacts/{id})に新しいURIを構築し、応答コード(201/created)を設定します.使用可能http://localhost:8080/Jersey/rest/contacts/新しい連絡先にアクセスします.
4、Jerseyは実体オブジェクトサポートをXML/JSONにシーケンス化する
>解決対象がJSONにフォーマットできない問題:http://stackoverflow.com/questions/12179737/jersey-json-media-type-application-json-was-not-found.
オブジェクトクラスに@XmlRootElement注記を付ける必要があります.次のようにします.
package com.boonya.restful.jersey;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
import org.springframework.stereotype.Component;
@XmlRootElement
@Component("user")
public class User implements Serializable{
    private static final long serialVersionUID = -5656002284629831603L;
    private int id;
    private String userName;
    private String password;
    private String email;
    //getters/setters
       //..............
}
5、Jersey要求応答データメディアタイプMediaType
参照先:http://jackson.codehaus.org/javadoc/jax-rs/1.0/javax/ws/rs/core/MediaType.html?is-external=true
 static java.lang.String   
 APPLICATION_ATOM_XML                   "application/atom+xml"
static MediaType     
APPLICATION_ATOM_XML_TYPE                  "application/atom+xml"
static java.lang.String     
APPLICATION_FORM_URLENCODED       "application/x-www-form-urlencoded"
static MediaType   
 APPLICATION_FORM_URLENCODED_TYPE     "application/x-www-form-urlencoded"
static java.lang.String   
 APPLICATION_JSON                             "application/json"
static MediaType   
 APPLICATION_JSON_TYPE                           "application/json"
static java.lang.String   
 APPLICATION_OCTET_STREAM            "application/octet-stream"
static MediaType     
APPLICATION_OCTET_STREAM_TYPE          "application/octet-stream"
static java.lang.String     
APPLICATION_SVG_XML                      "application/svg+xml"
static MediaType     
APPLICATION_SVG_XML_TYPE                    "application/svg+xml"
static java.lang.String     
APPLICATION_XHTML_XML                  "application/xhtml+xml"
static MediaType   
 APPLICATION_XHTML_XML_TYPE                "application/xhtml+xml"
static java.lang.String   
 APPLICATION_XML                              "application/xml"
static MediaType     
APPLICATION_XML_TYPE                            "application/xml"
static java.lang.String   
 MEDIA_TYPE_WILDCARD                     The value of a type or subtype wildcard: "*"
static java.lang.String   
 MULTIPART_FORM_DATA                    "multipart/form-data"
static MediaType   
 MULTIPART_FORM_DATA_TYPE                  "multipart/form-data"
static java.lang.String     
TEXT_HTML                                       "text/html"
static MediaType     
TEXT_HTML_TYPE                                     "text/html"
static java.lang.String   
 TEXT_PLAIN                                       "text/plain"
static MediaType     
TEXT_PLAIN_TYPE                                     "text/plain"
static java.lang.String   
 TEXT_XML                                         "text/xml"
static MediaType   
 TEXT_XML_TYPE                                       "text/xml"
static java.lang.String   
 WILDCARD                                          "*/*"
static MediaType     WILDCARD_TYPE                         "*/*"
使用方法:メソッド名に注記@Produces(MediaType.APPLICATION_JSON)を付け、コールバック関数応答データがJSON形式であることを示す.
6、Jersey実例開発
6-1、プロジェクトインポートに必要なJarパッケージの作成
Jersey to create Restful webservice_第1张图片
6-2、Jerseyのwebを追加する.xml構成
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">

	<display-name>restful</display-name>

	<!-- spring Configuration -->
	<!-- <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:applicationContext.xml</param-value>
	</context-param> -->

    <!-- Jersey Configuration -->
	<servlet>
		<servlet-name>Jersey Web Application</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>com.boonya.restful.jersey</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Jersey Web Application</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>


	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>
6-3、サービスコードの作成
package com.boonya.restful.jersey;
import javax.annotation.Resource;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path(value = "/userservice")
public class UserService {
	
	@Resource(name="user")
	User user;
	

	@GET
	@Produces(MediaType.TEXT_PLAIN)
	public String sayHello() {
		return "Hello Jersey";
	}

	@GET
	@Produces(MediaType.TEXT_PLAIN)
	@Path("user/login/{username}/{password}")
	public String getUserEmail(@PathParam("username")String userName,@PathParam("password") String password) {
		if (userName.equals("boonya") && password.equals("123456")) {
			return "Hello boonya,you logined success! Your email is [email protected]";
		}
		return "Sorry,we didn't find this user's Account!";
	}
	
	@GET
	@Produces(MediaType.APPLICATION_XML)
	@Path("user/info/xml")
	public User  getUserInfoByxml(){
		User user=new User();
		user.setId(10000);
		user.setUserName("boonya");
		user.setPassword("asdfg");
		user.setEmail("[email protected]");
		return user;
	}
	
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("user/info/json")
	public User  getUserInfoByjson(){
		User user=new User();
		user.setId(10000);
		user.setUserName("boonya");
		user.setPassword("asdfg");
		user.setEmail("[email protected]");
		return user;
	}
	
	@POST
	@Produces(MediaType.TEXT_HTML)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	@Path("user/add")
	public void addUser(@FormParam("username")String userName,@FormParam("password") String password){
		user.setId(10001);
		user.setUserName(userName);
		user.setPassword(password);
		System.out.println(user!=null);
	}
	
	@PUT
	@Produces(MediaType.TEXT_HTML)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	@Path("user/update/{id}")
	public void updateUser(@PathParam("id") int id,@PathParam("email")String email){
		if(id==user.getId()){
			user.setEmail(email);
			System.out.println("Update user success! "+user.getEmail());
		}
	}
	
	@DELETE
	@Produces(MediaType.TEXT_HTML)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	@Path("user/delete/{id}")
	public void addUser(@PathParam("id") int id){
		if(id==user.getId()){
			user=null;
			System.out.println("Delete user success!");
		}
	}

}

7、Jerseyクライアントテスト
package com.boonya.restful.jersey;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.header.MediaTypes;
import com.sun.jersey.test.framework.JerseyTest;
/**
 *           TOMCAT        
 */
public class ClientTest extends JerseyTest {
	
    public ClientTest()throws Exception {
        super("com.sun.jersey.samples.services.userservice.resources");
    }

    /**
     *     JSON       
     */
    public void getUserInfoByJson() {
        WebResource webResource =super.client().resource("http://localhost:8080/restful/services/userservice/user/info/json");
        String responseMsg = webResource.get(String.class);
        System.out.println(responseMsg);
    }
    
    /**
     *     XML       
     */
    public void getUserInfoByXml() {
        WebResource webResource =super.client().resource("http://localhost:8080/restful/services/userservice/user/info/xml");
        String responseMsg = webResource.get(String.class);
        System.out.println(responseMsg);
    }

    /**
     * Test if a WADL document is available at the relative path
     * "application.wadl".
     */
    public void testApplicationWadl() {
        WebResource webResource = resource();
        String serviceWadl = webResource.path("application.wadl").accept(MediaTypes.WADL).get(String.class);
        System.out.println(serviceWadl.length() > 0);
    }
    
    public static void main(String[] args) throws Exception {
    	ClientTest test=new ClientTest(); 
    	System.out.println("-------Json----");
    	test.getUserInfoByJson();
    	System.out.println("-------Xml----");
    	test.getUserInfoByXml();
	}
}

8、プロジェクトテストの断面図
8-1、GETアクセス
Jersey to create Restful webservice_第2张图片
Jersey to create Restful webservice_第3张图片
8-2、JSONアクセスデータ
Jersey to create Restful webservice_第4张图片
8-3、XMLアクセスデータ
Jersey to create Restful webservice_第5张图片
8-4、クライアントテスト結果
Jersey to create Restful webservice_第6张图片
9、参考資料
http://wenku.baidu.com/view/a8bd4e86ec3a87c24028c4b6.html
http://wenku.baidu.com/view/39a69f2758fb770bf78a55ee.html
http://www.techferry.com/articles/RESTful-web-services-JAX-RS-annotations.html
http://www.ishang123.com/jishubowen/java/2012-08-01/126.html