Java EE 7 を 360 度探索する

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