Josh Juneau:ア プリケーション開 発者、システム・ アナリスト、DBA。 開発ではおもに Java、PL/SQL、 Jython/Python を利用。Jython Monthly ニュース レター、Jython Podcast、Jython Web サイトを管理 している。『Java EE 7 Recipes: A Problem-Solution Approach』 (Apress、2013 年)、 『Introducing Java EE 7: A Look at What's New』 (Apress、2013 年)の著者。 Java API for RESTful Web Service と JSON Processing API の最新機能を利用する 本 記事は全 3 回シリーズの第 2 回です。このシリーズでは、 Java EE 7 で拡張された機能や、 HTML5、WebSocket、JavaScript Object Notation(JSON)処理な どの比較的新しい Web 標準を使 用して、最新型のエンタープライ ズ・アプリケーションを構築する 方法について説明します。 このパート 2 では、パート 1 で すでに開発した movieplex7 アプ リケーションを改良し、アプリケー ション・データベース内の映画を 表示、削除、追加できるようにし ます。 前回説明したとおり、 movieplex7 アプリケーションは、 完全な 3 層エンド・ツー・エンド・ アプリケーションです。Java EE 7 に搭載されている以下のテクノロ ジーを利用します。 ■■ Java Persistence API(JPA)2.1 (JSR 338) ■■ JavaServer Faces(JSF)2.2(JSR 344) ■■ Contexts and Dependency Injection(CDI)1.1(JSR 346) ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014 Java API for Batch Processing (JSR 352) ■■ Java API for RESTful Web Services(JAX-RS、JSR 339) 注:アプリケーションのすべて のソース・コードは、こちらから ダウンロードできます。 ■■ デモ・アプリケーションの概要 パート 1 では、NetBeans 7.3.x お よび GlassFish 4 のダウンロード 方法、インストール方法、設定方 法を学習しました。本記事でもこ の環境を利用して、アプリケーショ ンの構築とデプロイを行います。 注:2013 年夏に NetBeans 7.4 RC1 がリリースされました。こ の IDE を利用して本記事のアプリ ケーションを扱うこともできます が、本記事ではバージョン 7.3.1 を使用します。そのため、一部の 機能では、実際の動作が本記事 で説明する内容とは異なります。 パート 1 では、NetBeans で movieplex7 アプリケーションを構 成し、Apache Derby 内にデータ ベース・スキーマを生成しました。 その際に、persistence.xml に設 定したスキーマ生成を利用しまし た。次に、JSF 2.2 ベースの映画 予約用ユーザー・インタフェース を構築しました。このインタフェー スをバックエンド処理にバインド するために、マネージド Bean を 生成し、CDI アノテーションの @ Named を付加してインジェクショ ンできるようにしました。また、 新機能の Faces Flow を使用して、 アプリケーションで定義されたエ ントリ・ポイントと終了ポイントに より関連する一連のビュー / ペー ジをカプセル化しました。 本記事では、表示および削除 を実行するために JAX-RS を利用 します。また、映画の追加機能 には Java API for JSON Processing (JSON-P)を利用します。 これ以降は、このシリーズの パート 1 において NetBeans IDE で作成した Maven ベースのプロ ジェクトを使用しながら手順を確 認してください。 映画の表示および削除のための Web ページとロジックの作成 movieplex7 アプリケーションは、 映画の表示および削除に JAX-RS API を利用します。本項では、 movieplex7 ユーザーがすべての 映画の表示、各映画の詳細の表 示、既存の映画の削除を実行で きるビューとビジネス・ロジック を、JAX-RS を利用して追加する 手順について段階的に確認しま す。 JAX-RS 2 仕様では、API に以 下の新機能が追加されています。 ■■ クライアント API ■■ 非同期処理機能 ■■ フィルタ、インターセプタ、明 確に定義された拡張ポイント ■■ Bean バリデーション(Bean の フィールドにアノテーションを 適用することでデータを容易に 検証可能) RESTful クライアントの作成:ま ずは、クライアントとして機能し、 REST エンドポイントを呼び出す Bean をアプリケーションに追加し ます。以下の手順を実行します。 1.「Source Packages」を JAVA TECH JOSH JUNEAU Java EE 7 を 360 度探索する ABOUT US パート 2 JAVA IN ACTION COMMUNITY //new to java / blog 09 ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014 JAVA IN ACTION 図1 URI を設定します。 Client インスタンスを作成する 際には注意が必要です。このイン スタンスが、クライアント・サイド の通信インフラストラクチャを管 理するために使用される、リソー ス消費量の多いオブジェクトであ るからです。必要な個数だけを作 成すること、および処理の完了時 にはクローズすることを心がけて ください。この作業の結果、コー ドはリスト 1 のようになります。 3. リスト 2 のコードを追加して、呼 出し元に映画を返すメソッドを 実装します。映画を返すために は、target.request メソッドを呼 び出し、続いて HTTP GET メソッ ドを呼び出します。その結果、 Movie[] 型の値が返されます。 4. 最後に、インポート文を解決しま す。 クライアントを呼び出すビューの作成: 以上でクライアントの作成は完了しまし た。次に、このクライアントを呼び出す ビューを記述します。 1. NetBeans プロジェクト内で「Web Pages」を右クリックし、「New」 →「Folder」を選択して、フォ ルダ名に client と入力します。 「Finish」をクリックします。 2. 新しく作成した client フォルダを 右クリックし、 「New」→「Other」 を選択します。「JavaServer Faces」、 「Faces Template Client」 を選択して、「Next >」をクリッ クします。ファイル名に movies. xhtml と入力し、Template の横の 「Browse」をクリックして、「Web Pages」→「WEB-INF」を展開 します。template.xhtml を選択 し、「Select File」をクリックしま す。「Finish」をクリックします。 "top" および "left" という名前の付 いた <ui:define> セクションを削 除します。これらのセクションはテ ンプレートから継承されるためで す。 3. ファイルがエディタで開いたら、 <ui:define> 領域の内容をリスト 3 のコードに置き換えます。 movies.xhtml ビューのコードでは、 MovieClientBean の getMovies メソッ ドを呼び出して、すべての映画を取 得します。そのために、c:forEach 要 JAVA TECH enterprise.context.SessionScoped クラ スと javax.faces.bean.SessionScoped クラスのいずれもインポート可能です。 CDI を使用する場合は、@Named のイ ンポートに加えて、@SessionScoped を インポートしてください。JSF および @ ManagedBean を使用する場合は、@ SessionScoped をインポートしてくださ い。 また、JSF 2.2 より @ManagedBean が廃止された点にも注意する必要があ ります。過去のコードをサポートする 目的で @ManagedBean が必要な場 合を除き、@Named(CDI マネージド Bean)を使用してください。 以上でクラスの作成は完了しました。 次に、クライアントを実装するための コードを追加します。 1. まず、Client クラスの変数と WebTarget クラスの変数を宣言 し、次にライフサイクル・コー ルバック・メソッドの init() と destroy() を作成します。この init() メソッドに @PostConstruct アノ テーションを付加し、destroy() メ ソッドに @PreDestroyアノテーショ ンを付加します。 これらのアノテーションの付加 によって、アプリケーション・サー バー・コンテナが Bean を作成す る前に init() メソッドを呼び出し、 Bean を破棄する前に destroy() メ ソッドを呼び出すようになります。 2. init() メソッドでは、ClientBuilder を使用して新しいクライアントを 取得します。次に、client.target メソッドを呼び出して、Web サー ビス・ターゲットのエンドポイント ABOUT US 右クリックし、「New」→「Java Class」を選択します。クラス名 に MovieClientBean と入力し、 パッケージとして org.glassfish. movieplex7.client を指定しま す。次に、「Finish」をクリックし て Bean を作成します。生成後の Bean がエディタで開きます。 2. クラス定義の上に、クラスレベル のアノテーションである @Named と @SessionScoped を追加します。 @Named を追加することで、こ のクラスの CDI が有効になり、こ のクラスを式言語(EL)の式にイ ンジェクションできるようになりま す。@SessionScoped アノテーショ ンは、Bean のアクティブ化および 非アクティブ化がセッションのライ フサイクルにあわせて自動的に行 われることを示します。 3. このクラスはセッション・スコープ 内にあるので、java.io.Serializable を実装します。 4. 必要に応じてインポート文を解決 します。NetBeans には、未解決 のインポート文がエラーとして表 示されます(図 1)。 NetBeans でのインポート文の解決は 簡単です。黄色の電球アイコンをクリッ クするか、エディタ内を右クリックして 「Fix Imports」オプションを選択します (Mac OS X では [Shift]+[Cmd]+[I] キー で実行可能)。 各アノテーションが異なる組合せの インポート文へと解決されることもあ りますが、状況に適したインポート文 が自動的に選択されます。ただし、@ SessionScoped については、javax. COMMUNITY //new to java / blog 10 Client client; WebTarget target; @PostConstruct public void init() { client = ClientBuilder.newClient(); target = client .target("http://localhost:8080/movieplex7/webresources/movie/"); } @PreDestroy public void destroy() { client.close(); } すべてのリストのテキストをダウンロード 図2 素の items 属性を getMovies メソッド (Movie[] 型のオブジェクトを返すメソッ ド)にバインドして、配列の各項目に対 して反復処理を実行します。 <f:selectItem> 要素によって、配列 内の映画のそれぞれが別の項目として 表示されます。この要素は、c:forEach の var 属性をハンドルとして使用して、 Movie[] 内の各オブジェクトの itemValue 値および itemLabel 値を表示します。こ のビューには commandButton 要素も あります。"Details" というラベルが付い たこのボタンには、movie アクションが 含まれています。このボタンをクリック すると、movie.xhtmlという名前のビュー が検索されます。action に、呼び出す ビューの名前を指定しているためです。 コードの追加後、NetBeans の自動イ ンポート機能を使用し、左側にある黄 色の電球アイコンをクリックして、名前 空間の接頭辞を URI へと解決します。 次に、このビューのバッキング Bean を作成します。 1. org.glassfish.movieplex7.client パッケージを右クリックし、 「New」 →「Java Class」を選択します。 名前に MovieBackingBean と入力 し、「Finish」をクリックします。 2. クラスに以下のフィールドを追加 します。 int movieId; ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014 3. 新しいフィールドの getter/setter を作成します。エディタ・ペイン を右クリックして「Insert Code」 を選択します。表示されるコンテ キスト・メニューで、「Getter and Setter」を選択します(図 2)。 Generate Getters and Setters ウィ ンドウが開きます。フィールドの 横のチェック・ボックスを選択して、 「Generate」をクリックします。 4. クラスレベルのアノテーションであ る @Named と @SessionScoped を追加し、java.io.Serializable を 実装して、インポート文を解決し ます。 メニュー項目のナビゲーションと映画詳 細の追加:ユーザーに映画の一覧への アクセス方法を提供し、ユーザー・イ ンタフェースの Details ボタンについて コーディングします。 1. template.xhtml で、<form> 要素内の <ui:insert>(属性が name="left" のもの)に、リスト 4 のコードを追加します。 movies.xhtml ビューへのナビ ゲーション用のメニュー項目が生 成されます。 2. 特定の映画を選択して「Details」 ボタンをクリックする機能を有効 にするために、MovieClientBean クラスに MovieBackingBean をイ ンジェクションして、このクラスか ら MovieBackingBean にアクセス できるようにします。そのために、 以下のコードを MovieClientBean に追加します。 JAVA IN ACTION リスト3 JAVA TECH リスト2 ABOUT US リスト1 COMMUNITY //new to java / blog @Inject MovieBackingBean bean; 3. @Inject アノテーションの追加後、 11 リスト4 図3 ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014 JAVA IN ACTION <p/><h:outputLink value="${ facesContext.externalContext.requestContextPath }/faces/client/movies.xhtml">Movies</h:outputLink> JAVA TECH リスト 6 のコードをコピーして、こ のビューの <ui:define> 要素内に 貼り付けます。黄色の電球アイコ ンをクリックして、名前空間の接 頭辞と URI のマッピングをすべて 解決します。 プロジェクトの実行:プロジェクト名を 右クリックし、コンテキスト・メニュー で「Run」を選択して(Mac OS X では [Fn]+[F6] キーで実行可能)、プロジェク トを実行します。左側のナビゲーション・ バーにある「Movies」オプションをクリッ クして、図 3 に示す画面を表示します。 このビューには、配列内に含まれる すべての映画の一覧が表示され、各映 画の横にラジオボタンが付加されます。 この画面は、REST エンドポイントによ り生成されます。この点が、従来型の Enterprise JavaBeans(EJB)/JPA によ るバッキング・エンドポイントとは異な ります。 横にあるラジオボタンをクリックして 任意の映画を選択し、「Details」ボタン をクリックします。クリック後、その映画 リスト6 すべてのリストのテキストをダウンロード の詳細が表示されます(図 4)。「Back」 ボタンをクリックして映画の一覧に戻り ます。 削除機能 映画の削除機能を追加してアプリケー ションを改良します。 1. commandButton を使用して、バッ キング Bean 内の deleteMovie() というメソッド(選択された映画 を削除するメソッド)を呼び出し ます。そのために、movies.xhtml ビューにリスト 7 のコードを追加し ます。このボタンは、Details ボタ ンのコードの下に追加してくださ い。 注:ビュー内のコードを整形す るためには、エディタ内を右クリッ クして「Format」オプションを選 択します。 2. リスト 8 のコードを MovieClientBean に貼り付けて、 この Java クラスに deleteMovie() メソッドを追加します。この メソッドに付加されている @ Transactional アノテーションは、 JTA 1.2 で導入されました(JTA 1.2 は Java EE 7 の機能の一部としてリ リースされています)。 このアノテーションは、CDI マ ネージド Bean でのトランザクショ ン境界を制御するために使用でき ます。 3. インポート文を解決してアプリ ABOUT US 黄色の電球アイコンをクリックして javax.inject.Inject をインポートし ます。 4. Client インスタンスと WebTarget インスタンスを利用して、現在選 択されている Movie オブジェクト を取得します。そのために、REST エンドポイント URI のパスの末尾 に {movie} と記述して、現在選 択されているオブジェクトを表す movie という変数をこの URI に追 加します。"movie" をバインド文 字列として、bean.getMovieId() をバインド値としてそれぞれ渡す ことで、resolveTemplate メソッ ドを使用してこの変数を具体的 な値にバインドできます。この バインド値は、現在選択されて いる映画をもとに設定されます。 この機能を有効にするために、 MovieClientBean にリスト5 のコー ドを追加します。 5. プロジェクトの client フォルダ内に movie.xhtml ビューを作成します。 リスト5 COMMUNITY //new to java / blog 12 リスト8 <h:commandButton value="Delete" action="movies" actionListener="#{movieClientBean.deleteMovie()}"/> 図4 映画の追加機能 前項までに、映画の表示機能と削除機 能を追加してアプリケーションを改良し ました。次に、データベースに映画を 追加できるようにします。映画の追加機 能では、JSON Processing 1.0(JSON-P) API を利用します。JSON-P は、 アプリケー ションで JSON の解析および生成を行う ために使用できる標準 API です。また、 JSON の読取りや書込みには、JAX-RS API を利用します。 映画の追加機能についてアプリケー ション・サンプルを深く掘り下げる前に、 JSON-P API と JAX-RS API がもたらす機 能を簡単に確認しましょう。詳しくない 読者のために説明すると、JSON とは、 ネットワークに接続している Web サー ビスなどのアプリケーションで広く使用 ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014 ビスを提供します。String、byte[] な どの多くの型に関する型マッピングが 事前定義されています。アプリケーショ ンでカスタムの型に対する独自のマッ ピングを定義する必要がある場合は、 MessageBodyReader インタフェースと MessageBodyWriter インタフェースを使 用できます。 MessageBodyReader の作成:以下の 手順により、アプリケーションに新しい 映画を追加できるようになります。注意 点として、本番のアプリケーションでは、 適切な認証処理をしなければ追加、削 除、更新の機能を利用できないように する必要があります。 1.「Source Packages」 を右クリックし、 「New」→「Java Package」を 選択します。パッケージ名に org. glassfish.movieplex7.json と入力 し、「Finish」をクリックします。 2. 新しく作成したパッケージを右 クリックし、「New」→「Java Class」を選択します。名前に MovieReader と入力して、 「Finish」 をクリックします。 ABOUT US されているデータ交換形式です。JSON は、インターネット・アプリケーション でデータを操作するための共通形式と して使用可能なオブジェクトとデータ配 列により構成されます。JSON-P API は、 JSON データの解析、変換、問合せを 実行するための標準 API であり、オブ ジェクト・モデル(ツリー型)またはス トリーミング・モデル(イベント型パー サー)を使用できます。JSON-P API は 以下のパッケージで構成されます。 ■■ javax.json:JSON オブジェクト用のイ ンタフェース、ユーティリティ・クラス、 Java の型が含まれるパッケージ ■■ javax.json.stream:ストリーミング・ モデル用のパーサーおよびジェネ レータのインタフェースが含まれる パッケージ JAX-RS API は、軽量の Web サービ スである RESTful Web サービスを構 築するための Java API です。このサン プルでは、JAX-RS Entity Providers を 使用します。JAX-RS Entity Providers は、インターネット上のデータ表現と 関連する Java 型をマッピングするサー JAVA TECH すべてのリストのテキストをダウンロード 図5 ケーションを実行します。 プロジェクトを実行すると、映画の一 覧の下に Delete ボタンが表示されるよ うになります(図 5)。任意の映画を選 択して「Delete」ボタンをクリックすると、 その映画がデータベースから削除され、 ビューが更新されます。 COMMUNITY リスト7 JAVA IN ACTION //new to java / blog 13 @Provider アノテーションの付 加により、JAX-RS ランタイムが プロバイダのスキャン・フェー ズでその実装を検出できるよう になります。このアノテーション は、JAX-RS の対象となる任意の クラスに対して使用できます。@ Consumes アノテーションには、 クライアントによって送信され、リ ソースで消費可能なデータ表現の MIME メディア・タイプを指定しま す。このサンプルの MediaType. APPLICATION_JSON は、JSON リ ソースが消費されることを示しま す。 4. 黄色の電球アイコンをクリックして (Mac OS X では [Shift]+[Cmd]+[I] キーで実行可能)以下のクラスを インポートし、インポート文を解 決します。 javax.ws.rs.core.MediaType javax.ws.rs.Consumes javax.ws.rs.ext.Provider 5. MessageBodyReader<Movie> を実装するようにクラスのシグ ネチャを修正し、インポート文 を解決します。次に、左側にあ る黄色の電球アイコンをクリック @Provider @Produces (MediaType .APPLICATION_JSON) @Produces は、生成されるリ ソースの MIME メディア・タイプ を指定するために使用します。こ のサンプルでは、JSON が生成さ ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014 @Override public boolean isReadable(Class<?> type, Type type1, Annotation[] antns, MediaType mt) { return Movie.class.isAssignableFrom(type); } JAVA TECH @Provider @Consumes (MediaType.APPLICATION_ JSON) して、「Implement all abstract methods」を選択します(図 6)。 6. 生成された isReadable() メ ソッドをリスト 9 のコードに 置き換えます。このコードは、 MessageBodyReader が特定の型 のインスタンスを生成できるかを 判定します。 7. 生成された readFrom() メソッドを リスト 10 のコードに置き換え、必 要に応じてインポート文を解決し ます。 このコードでは、Json. createParser(in) の呼出しによって、ま ず in という名前の入力ストリームから型 を読み取り、次にその入力ストリームか ら JsonParser オブジェクトを作成します。 次に、このパーサーからキーの値を読 み取り、その値を新しい Movie インス タンスに設定します。その後、新しく作 成した Movie を返します。 MessageBodyWriter の作成: 1. 新しく作成したパッケージを右 クリックし、「New」→「Java Class」を選択します。次に、ク ラス名に MovieWriter と入力し、 「Finish」をクリックします。 2. 以下のクラスレベルのアノテー ションを追加します。 ABOUT US 3. MovieReader クラスに以下のクラ スレベルのアノテーションを付加 します。 リスト10 COMMUNITY リスト9 JAVA IN ACTION //new to java / すべてのリストのテキストをダウンロード blog れます。 3. 黄色の電球アイコンをクリックして (Mac OS X では [Shift]+[Cmd]+[I] キーで実行可能)、インポート文 を解決します。 注:javax.ws.rs.Produces クラス を必ずインポートしてください。 4. MessageBodyWriter<Movie> を 14 @Override public boolean isWriteable(Class<?> type, Type type1, Annotation[] antns, MediaType mt) { return Movie.class.isAssignableFrom(type); } 実装するようにクラス定義を修正 して、インポート文を解決します。 次に、左側にある黄色の電球アイ コンをクリックして、「Implement all abstract methods」を選択し ます。 5. isWriteable() メソッド、getSize() メソッド、writeTo() メソッドの実 装を、リスト 11 のコードにより上 書きします。インポート文を解決 します。 isWriteable() メソッドは、指定され た型が書込み可能な型であるかを判定 します。getSize() は、オブジェクト型 Movie のシリアライズ形式の長さ(バ イト単位)を返します。JAX-RS 2.0 で は、このメソッドは廃止され、すべて の MessageBodyWriter の実装で -1 を返すことが推奨されています。ま た、writeTo() メソッドは、指定され た型のデータを HTTP メッセージに 書き込みます。Json.createGenerator に OutputStream を渡すことで JsonGenerator が作成されます。その後、 作成された JsonGenerator を使用して、 JSON データをストリーミング形式で書 き込みます。 Add Movie フォームとバッキング Bean コンポーネントの作成: 1. client フォルダ内に addmovie. xhtml という新しいビューを作成 し、<ui:define> の内容をリスト 12 のコードに置き換えます。 addmovie.xhtml のコード により、映画の id、name、 actors の入力用フォームが作 成されます。それぞれの値 は、MovieBackingBean とい うマネージド Bean コントロー ラのフィールドにバインドさ れます。commandButton の actionListener 属性は、このコン トローラの action メソッドにバイ ンドされ、このメソッドがデータ ベースに対してフィールドの値を 追加します。この action 属性は movies に設定されています。そ のため、movies ビューに制御が 返されることになります。 注:フィールドおよびメソッド のバインド部の下側に、黄色の線 が表示される場合があります(図 7)。この黄色の線は、そのフィー ルドまたはメソッドが実際には存 在していないことを示します。 2. IDE で「MovieBackingBean」を 開き、クラスに以下のフィール ドを追加します。次に、getter/ String movieName; setter を作成します。 String actors; ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014 @Override public long getSize(Movie t, Class<?> type, Type type1, Annotation[] antns, MediaType mt) { return -1; } @Override public void writeTo(Movie t, Class<?> type, Type type1, Annotation[] antns, MediaType mt, MultivaluedMap<String, Object> mm, OutputStream out) throws IOException, WebApplicationException { JsonGenerator gen = Json.createGenerator(out); gen.writeStartObject().write("id", t.getId()) .write("name", t.getName()).write("actors", t.getActors()).writeEnd(); gen.flush(); } ABOUT US 図6 COMMUNITY リスト12 JAVA IN ACTION リスト11 JAVA TECH //new to java / すべてのリストのテキストをダウンロード 3. addmovie にナビゲーション用の commandButton を追加するた め、movies.xhtml にリスト 13 の コードを追加します。 4. MovieClientBean にリスト 14 の addMovie()メソッドを追加します。 インポート文を解決します。 addMovie メソッドは、新し い Movie インスタンスを生成 し、バッキング Bean に存在する 値をそのインスタンスに設定しま す。設定の完了後、この Bean が REST エンドポイントに送信され ます。この送信部分では、target. register() メソッドの呼出しによっ て MovieWriter を登録し、この MovieWriter が Movie を POJO (Plain Old Java Object)から JSON 形式への変換を行います。 5. アプリケーションを実行してテ ストします。左側のメニューで 「Movies」リンクを選択し、映画 blog 15 リスト13 リスト14 JAVA IN ACTION <h:commandButton value="New Movie" action="addmovie" /> COMMUNITY //new to java / ABOUT US すべてのリストのテキストをダウンロード JAVA TECH 図7 図8 の一覧の下にある「New Movie」 ボタンをクリックします。「Add a New Movie」フォームの MovieID フィールドに任意の値を入力して、 このフォームの入力を完了します (図 8)。「Add」をクリックすると、 映画の一覧に新しい映画が表示さ れます。 まとめ 本記事では、パート 1 で開発した movieplex7 アプリケーションを改良し、 映画の表示、追加、削除の機能を追加 しました。本記事では以下のテクノロ ジーを使用しました。 ■■ JSF 2.2 ■■ JAX-RS 2.0 ■■ Java API for JSON-P 1.0 このシリーズの最後となるパート 3 では、映画チケット販売の処理や、映 画ポイントの付与機能、他のユーザー とのチャット機能を追加します。その 際に、Batch Applications for the Java Platform 1.0(JSR 352)、Java Message Service 2.0(JSR 343)、Java API for WebSocket 1.0(JSR 356)をそれぞれ 利用します。</article> LEARN MORE • このシリーズのパート 1 blog 16 ORACLE.COM/JAVAMAGAZINE ///////////////////// JANUARY/FEBRUARY 2014
© Copyright 2024 ExpyDoc