Upload
takakiyo-tanaka
View
3.807
Download
7
Embed Size (px)
DESCRIPTION
JJUG CCC 2014 Springで実施した R5-1 Eclipse/Liberty Java EEハンズオンのテキストです。説明で使用した資料はこちら→ http://www.slideshare.net/takakiyo/was855-libertyprofile20140518
Citation preview
JJUG CCC 2014 Spring
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン
0.このハンズオンについて このハンズオンでは,Eclipse と WAS Liberty プロファイルを使用した Servlet/JDBC アプリケーション、
CDI アプリケーションの開発をご紹介します。
Liberty プロファイルとは Liberty プロファイルは,IBM が 2012 年から提供している軽量・高速な新しい Web アプリケーション
実行環境です。Eclipse と連携する Developer Tools が無償で提供されており,Servlet や JSP の開発
している開発者の方たちにとって, 適なテスト環境として利用することができます。また本番運用にも
耐える高いパフォーマンスと,CI(継続的インテグレーション)ツールなどとの親和性をあわせもってい
います。開発者と運用担当者が協調してシステムをつくっていく DevOps を実現するための Java EE 環
境としても 適です。
Liberty プロファイルは,開発用途であれば無償で使用することができます。またライセンスを購入す
ることにより本番環境で使用することもできます。製品に組み込む Java EE サーバーとして利用する場
合には,一定の条件で無償で利用することもできます。
前提条件 このハンズオンでは以下の環境がセットアップされていることを前提としています。セットアンプが完
了していない方は,講師にご相談ください。
l Java SE 6または 7 Liberty プロファイルは,現在出ている 新版の Beta で Java 8環境に対応していますが,現時点
の正式版では Java 7環境にまでしか対応していません。このハンズオンでは Beta 版は使用しま
せんので,Java SE環境としては 6 ないし 7 をご用意ください。
l Eclipse IDE for Java EE Developers (Juno もしくは Kepler)
l Liberty Profile Developer Tools および Liberty プロファイル このハンズオンでは,2014 年 5 月現在 新のバージョンである V8.5.5.2を使用します。
前提環境のセットアップ方法 Eclipse IDE for Java EE Developer は,以下のサイトよりお使いの環境に合ったものをダウンロードし
てください。ダウンロードした ZIP/tar.gzファイルを適当なディレクトリに展開して導入します。
http://www.eclipse.org/downloads/
Eclipse を起動したら,メニューの Help から Eclipse Marketplace…を選択して Marketplace を起動
します。Find 欄に websphere libertyを入力して検索すると,検索結果に「IBM WebSphere Application Server V8.5.5 Liberty Profile Developer Tools for Eclipse Juno & Kepler」が表示されます
(2014 年 5 月現在のバージョンは V8.5.5.1)。Install ボタンを押して導入を行います。
導入が完了し,Eclipse が再起動されたら,Server ビューから右クリックで New で Server を選びます。
New Server の画面で「WebSphere Application Server V8.5 Liberty Profile」を選んで Next >をクリッ
クします。
次の画面で download or install のリンクをクリックすると,Liberty プロファイルの導入のための画
面があらわれます。導入用 Jar ファイルをすでにダウンロード済みの場合は「Install a new runtime environment from an archive:」を選択し,Jar ファイルの場所を指定します。ネットワーク経由でダウン
ロードを行う場合は,「Download and install a new environment from:」を選択し,V8.5.5.2を選択し
ます。Next >をクリックします。
次の画面では,追加で導入することが可能な Add-‐on の一覧が表示されます。Liberty プロファイル
に JMS や JAX-‐WS の機能を追加する Extended Content や各種のサンプルアプリケーションなどを追
加導入することが可能です。必要なものを選んで Next >をクリックします。
ライセンス条項を Accept して導入先ディレクトリを指定すると,Liberty プロファイル環境の導入がは
じまります。導入が完了すると New Server のダイアログボックスに戻りますので,Next >をクリックし
ます。
サーバー構成を作成する画面が出ますので,デフォルトの構成のまま Finish をクリックします。
これで Liberty プロファイルの導入は完了です。Server ビューに作成した Liberty プロファイルのサ
ーバーが表示されますので,右クリックで Start を選択してサーバーが正常に起動することを確認して
ください。
新規作成される JSP ファイルが,UTF-‐8 以外になっている場合は,修正しておいてください。
Windows 環境では Window > Preference...で,Mac 環境では Eclipse > Eclipse についてで設定
のダイアログボックスを開き,Web の JSP Files で Encoding が UTF-‐8 になっていることを確認します。
別の文字コードになっていたら,修正してください。
1.Simple Web アプリケーションの作成 初の章では単純な JSP ファイルをもった Web アプリケーションを作成します。また,このアプリケー
ションに対して Java EE セキュリティを使用したアクセス制御をかけ,ユーザー認証を行います。通常,
Java EE セキュリティを使用したアプリケーションは LDAP などを使用してユーザーレポジトリを別途用
意する必要がありますが,Liberty プロファイルでは,簡単にテスト用のユーザーレポジトリを構成する
ことができます。
1. “LabWeb”という名前の動的 Web プロジェクトを作成します。 a. File > New > Web Project を選択します。 b. Name には LabWeb と記入します。 c. Next をクリックします。 d. Target Runtime では、 WebSphere Application Server V8.5 Liberty Profile を選択し
ます。 e. Add project to an EAR のチェックを外します。
f. Finish をクリックします。
g. Yes をクリックし、Web パースペクティブに切り替えます。 2. 簡単な JSP を作成します。
a. File > New > Web page を選択します。 b. File Name に index.jsp と入力します。 c. Finish. をクリックします。
3. Who Am I JSP を作成します。 a. テキストを置き換えます。
<title>index</title> 以下のように変更します。 <title>Who Am I?</title>
b. Body には次のように記述します。 You are <%=request.getUserPrincipal().getName() %>
c. ファイルを保管します。
split ビューでは、 body html は実際の Web ページのように表示されます。
4. アプリケーションのセキュリティ・ロールを構成します。 a. LabWeb プロジェクトを右クリックします。 b. Java EE Tools > Generate Deployment Descriptor Stub を選択します。 c. WebContent > WEB-‐INF > web.xml を開きます。 d. Web Application (LabWeb) を選択します。 e. Add をクリックします。 f. Security Role を選択します。 g. OK をクリックします。
h. Role Name に all と入力します。
i. Web Application (Lab Web) を選択します。 j. Add をクリックします。 k. Security Constraint を選択します。 l. OK をクリックします。 m. role Name で Add をクリックします。 n. allと入力します。 o. Transport Guarantee に CONFIDENTIAL を選択します。
p. Web Resource Collection を選択します。 q. Web Resource Name の隣に index と入力します。 r. URL Pattern の隣の Add をクリックします。 s. /* と入力します。 t. web.xml を保存します。
5. サーバーのセキュリティを有効化します。 a. Servers ビューの WebSphere Application Server V8.5 Liberty Profile.を展開します。 b. Server Configuration を右クリックし、Open を選択します。 c. Feature Manager(フィーチャー・マネージャー)を選択します。 d. Feature (フィーチャー)で Add をクリックします。
e. appSecurity-‐2.0 を選択し、OK をクリックます。 認証バインディングが構成されるまでは、どのユーザーもアプリケーションにアクセスできな
いことにご注意ください。
6. アプリケーションをデプロイします。 a. LabWeb プロジェクトを右クリックします。 b. Run As > Run on Server を選択します。 c. WebSphere Application Server V8.5 Liberty Profile を選択します。 d. Finish をクリックします。 e. アプリケーションがデプロイされ起動します。Web ブラウザーが開き、次のようなエラーが表
示されます(環境によっては日本語で表示されることもあります)。 Error 403: Resource must be accessed with a secure connection try again using an HTTPS connection. これは、サーバーが SSL を使用するように設定されていないか、または、セキュリティ・ロー
ル・バインディングに問題があるために表示されるエラーです。
7. サーバーのセキュリティ・バインディングを構成します。 a. Servers ビューで、WebSphere Application Server V8.5 Liberty Profile. を展開します。 b. Server Configuration を右クリックし、Open を選択します。 c. design タブで Web Application(Web アプリケーション)を選択し、Add をクリックします。
d. Application Binding(アプリケーション・バインディング)を選択し、OK をクリックし
ます。
e. Add をクリックします。 f. Security role (セキュリティ・ロール)を選択し、OK をクリックします。
g. Security role name(セキュリティー・ロール名)には、all と入力します。
h. Security Role を選択して、Add をクリックします。 i. Special Subject (特殊対象)を選択して、OK をクリックします。
j. Special subject type (特殊対象のタイプ) にて、ALL_AUTHENTICATED_USERS を選択しま
す。
k. Feature Manager(フィーチャー・マネージャー)を選択します。 l. Feature(フィーチャー)で Add をクリックします。
m. ssl-‐1.0 を選択し、OK をクリックします。
n. Server Configuration を選択し、Add をクリックします。 o. Keystore (鍵ストア)を選択し、OK をクリックします。
p. パスワードには mysecretと入力します。 q. サーバー構成を保管します。
8. アプリケーションのテスト用にベーシック・ユーザー・レジストリーを作成します。 a. Server Configuration を選択し、Add をクリックします。
b. Basic User Registry (基本ユーザー・レジストリ)を選択し、OK をクリックします。
c. Basic User Registry (基本ユーザー・レジストリ)を選択し、Add をクリックします。 d. User を選択します。 e. OK をクリックします。 f. User name に、userXと入力します。 g. Password に、passwordXと入力します。
h. サーバー構成を保管します。
9. アプリケーションの稼動 a. 先程の Web ブラウザーをリフレッシュします。Web ブラウザーのセッションがクローズして
いた場合は、コンソール・ビューから次のハイパーリンクをクリックします。http://localhost:9080/LabWeb
b. 認証されていない証明書の警告が表示されたら、証明書を受け入れてください。
c. ユーザーID userX とパスワード passwordX を入力します。
d. JSP は以下を表示するはずです You are userX
2.CDI を使用したアプリケーションの作成 次にこのアプリケーションに対して ToDo リストの表示・追加・削除機能を追加していきます。
1. Entry クラスの作成
a. LabWeb プロジェクトを選択して,File > New > Class を選択します。
b. Package には jjug.lab.entity,Name には ToDoEntryを入力します。Interfaces の Add...ボタン
をクリックして Serializableインターフェースを追加します。
c. Finish ボタンを押します。
d. コードを編集し以下のフィールドを三つ追加します。 private String id; private String title; private String detail;
e. OutlineビューでToDoEntryクラスを右クリックし,Source > Generate Constructor using Fields...を選びます。
f. 三つのフィールドが選択された状態でOKをクリックします。
これにより以下のようなコンストラクタが生成されます。 public ToDoEntry(String id, String title, String detail) { super(); this.id = id; this.title = title; this.detail = detail; }
g. ふたたびOutlineビューでToDoEntryを右クリックしSource > Generate Getters and Setters...を選択します。Select Gettersをクリックし,OKをクリックします。三つのGetterが生
成されます。
h. ふたたびOutlineビューでToDoEntryを右クリックしSource > Generate hashCode() and equals()をクリックします。
i. 終的にToDoEntryクラスのコードは以下のようになります。
j. 編集内容を保管します。 k. LabWebプロジェクトを選択して,File > New > Classを選択します。
package jjug.lab.entity; import java.io.Serializable; public class ToDoEntry implements Serializable { public ToDoEntry(String id, String title, String detail) { super(); this.id = id; this.title = title; this.detail = detail; } private String id; private String title; private String detail; public String getId() { return id; } public String getTitle() { return title; } public String getDetail() { return detail; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ToDoEntry other = (ToDoEntry) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
l. Packageにはjjug.lab.entity,NameにはToDoListを入力します。Superclassとして
java.util.ArrayList<ToDoEntry>を入力します。
m. Finishをクリックます。 n. ToDoListにidを指定してToDoEntryを消去するメソッドを追加します。以下のようなコードを打
ち込んでください。
o. 編集内容を保管します。
2. CDI によるインジェクションの準備
a. この作成した ToDoList を,アプリケーション内から CDI によって利用できるように構成しま
す。
package jjug.lab.entity; import java.util.ArrayList; import java.util.Iterator; public class ToDoList extends ArrayList<ToDoEntry> { public void removeToDo(String id) { Iterator<ToDoEntry>it = this.iterator(); while (it.hasNext()) { ToDoEntry entry = it.next(); if (entry.getId().equals(id)) { it.remove(); } } } }
b. ToDoList の class 定義の直前で,@appl と入力した状態で Ctrl+スペースをおしてコンテ
ンツアシストを起動し,javax.enterprise.context パッケージの@ApplicaitonScoped のアノ
テーションを追加します。これによって,アプリケーション内には ToDoList のインスタンス
が一つ作られ,アプリケーション全体で共有されるようになります。
c. 同様にコンテンツアシストを使用して,javax.injectパッケージの@Namedアノテーションを
追加します。
d. 以下のように追記してtodolistという名前でインジェクションできるように指定します。 @ApplicationScoped @Named("todolist") public class ToDoList extends ArrayList<ToDoEntry> {
e. 編集内容を保管します。
f. LabWeb プロジェクトで右クリックして Properties を表示します。
g. Project Facets で Context and dependency injection (CDI)にチェックを入れます。
h. OK を押します。
i. Liberty プロファイルのサーバー構成に CDI のフィーチャーを追加するか聞いてくることが
あります。この場合は Yes をクリックします。
j. プロジェクトを確認すると WebContent の WEB-‐INF ディレクトリに beans.xml というファイ
ルが追加されています。CDI 1.0では,プロジェクトにこのファイルがあると CDI が利用可
能になります。
3. 表示画面の作成
a. ToDo のリストを表示する画面を JSP を用いて作成します。前章で作成した index.jsp を開
いて編集します。
b. 以下のコードを入力します。@taglibでJSTL(JSP Standard Tag Library)のcore機能の使用
を宣言しています。#{todolist}というEL式で,先ほど作成したToDoListをCDIによって名前
で取得しています。c:forEachで繰り返す各行では,EL式で値を表示し,また項目を削除す
るためのサーブレット呼び出しのリンクを追加してあります。 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <table border="1"> <tbody> <tr> <th>Title</th> <th>Detail</th> <th>Operation</th> </tr> <c:forEach var="todo" items="#{todolist}"> <tr> <td>${todo.title}</td>
<td>${todo.detail}</td> <td> <form method="POST" action="RemoveEntry"> <input type="hidden" name="id" value="${todo.id}" /> <input type="submit" value="Done" /> </form> </td> </tr> </c:forEach> </tbody> </table>
a. その後に項目を追加するサーブレットを呼び出す form を追記します。 <form method="POST" action="AddEntry"> <label>Title</label><input type="text" name="title" size="10" /> <label>Detail</label><input type="text" name="detail" size="20" /> <input type="submit" name="submit" value="Add New Schedule" /> </form>
c. 編集内容を保管します。
index.jspの内容は, 終的に以下のようになります。
4. ToDo 項目を追加・削除するサーブレットの追加
b. 項目を追加するサーブレットを作成します。LabWeb プロジェクトを選択した状態で File > New > Servlet を選びます。
<%@ page language="java" contentType="text/html; charset=UTF-‐8" pageEncoding="UTF-‐8"%> <!DOCTYPE html PUBLIC "-‐//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-‐equiv="Content-‐Type" content="text/html; charset=UTF-‐8"> <title>Who am I</title> </head> <body> You are <%=request.getUserPrincipal().getName() %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <table border="1"> <tbody> <tr> <th>Title</th> <th>Detail</th> <th>Operation</th> </tr> <c:forEach var="todo" items="#{todolist}"> <tr> <td>${todo.title}</td> <td>${todo.detail}</td> <td> <form method="POST" action="RemoveEntry"> <input type="hidden" name="id" value="${todo.id}" /> <input type="submit" value="Done" /> </form> </td> </tr> </c:forEach> </tbody> </table> <form method="POST" action="AddEntry"> <label>Title</label><input type="text" name="title" size="10" /> <label>Detail</label><input type="text" name="detail" size="20" /> <input type="submit" name="submit" value="Add New Schedule" /> </form> </body> </html>
c. Java Package として jjug.labを,Class Name として AddEntryServletを入力します
d. Next >をクリックします。
e. URL Mappings を選択し,Edit...ボタンをクリックし/AddEntryに修正します。
f. Next >をクリックします。
g. doGet のチェックをはずし,doPost にだけチェックを入れた状態にします。
h. Finish をクリックします。
i. サーブレットクラス AddEntryServlet のフィールドとして以下の二行を追加します。Ctrl+ス
ペースでコンテンツアシストを利用し,javax.inject.Inject および jjug.lab.ToDoList の
import 文を追加します。 @Inject ToDoList toDoList; この記述により CDI によってインスタンスが作成されてフィールドにインジェクションされま
す。
j. doPost メソッドを編集し,以下のコードを追加します。id として現在時刻を使用し,title と
detail をリクエスト・パラメーターから取得しています。新しい ToDoEntry を作成し
ToDoList に追加しています。 後に RequestDispatcherを使用して index.jsp に表示を委
譲しています。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-‐8"); String id = Long.toString(System.currentTimeMillis()); String title = request.getParameter("title"); String detail = request.getParameter("detail");
ToDoEntry newToDo = new ToDoEntry(id, title, detail); toDoList.add(newToDo);
RequestDispatcher rd = request.getRequestDispatcher("index.jsp"); rd.forward(request, response); }
a. 編集内容を保管します。
b. 引き続きエントリの削除を行うサーブレットを作成します。LabWeb プロジェクトを選択した
状態で File > New > Servlet を選びます。
c. Java Package として jjug.labを,Class Name として RemoveEntryServletを入力します。
d. Next >をクリックします。
e. URL Mappingsを選択し,Edit...ボタンをクリックし/RemoveEntryに修正します。
f. Next >をクリックします。
g. doGet のチェックをはずし,doPost にだけチェックを入れた状態にします。
h. Finish をクリックします。
i. サーブレットクラス RemoveEntryServlet のフィールドとして以下の二行を追加します。コン
テンツアシストを利用し, import 文を追加します。 @Inject ToDoList toDoList;
j. doPost メソッドを編集し,以下のコードを追加します。 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-‐8"); String id = request.getParameter("id");
toDoList.removeToDo(id); RequestDispatcher rd = request.getRequestDispatcher("index.jsp"); rd.forward(request, response); }
k. 編集内容を保管します。
5. アプリケーションの実行
a. LabWeb プロジェクトを右クリックします。
b. Run As > Run on Server を選択します。
c. WebSphere Application Server V8.5 Liberty Profile を選択します。
d. Finish をクリックします。
e. ログインすると,以下のような画面が表示されるはずです。
f. Title および Detail に適当な内容を入力して Add New Schedule をクリックしてみてくだ
さい。
6. CDI のスコープを変更してみる
a. Basic User Repository(基本ユーザー・レジストリ)に別ユーザーを追加します。Servers ビューで、WebSphere Application Server V8.5 Liberty Profile. を展開します。
b. Server Configuration を右クリックし、Open を選択します。
c. design タブで Basic User Repository(基本ユーザー・レジストリ)を選択し Add...をクリ
ックします。
d. User を選択し,OK をクリックします。User name に,userYと入力します。Password に、
passwordYと入力します。
e. サーバー構成を保管します。変更はサーバーを再起動することなく即座に反映されます。
f. Eclipse 上のブラウザ画面とは別にブラウザを起動し,それぞれ別ユーザー
(userX/userY)でログインします。
g. 画面を交互に操作して,同一の ToDo リストが共有されていることを確認します。
h. ToDoList の Java ソース画面を開き,ApplicationScoped を SessionScopedに変更します
(import 文とアノテーションの二カ所)。編集内容を保管します。
i. ふたたび Eclipse 上のブラウザ画面と別ブラウザからそれぞれ別のユーザーでログインし
て交互に操作します。ユーザーのセッションごとに,異なる ToDo リストが割り当てられてい
ることがわかります。
この章の内容が終わったら,いくつかの ToDo エントリを追加した状態で Liberty プロファイルのサー
バーを停止して,再起動してください。再度アクセスすると,ToDo エントリは全て消えていることがわか
ります。これは,現在のアプリケーションではデータをメモリ上に保持しているだけであるからです。
次章では,アプリケーションの保持しているエントリをデータベースを使って永続化してみます。
3.JDBC を使用したデータベースへのアクセス
JDBC Driver の構成 データベースにアクセスするための JDBC Driver を Liberty プロファイルに定義します。ここでは,
Java の組み込み DB である Derby を使用します。Java SE 7の JDK には,標準で Derby の Jar ファイ
ルが添付されています。
a. Enterprise Explorer ビューで WebSphere Application Server V8.5 Liberty Profile を開
き,shared > resources のしたに New > Folder で derbyという新しいフォルダーを作成
します。
b. 導入されている Java SEの JDK 環境に,db というディレクトリを探します。そのなかの lib と
いうディレクトリの中に derby.jar というファイルがあります。エクスプローラー/Finder で,
その derby.jar ファイルを,上で作ったフォルダーにドラッグ&ドロップでコピーします。
derby.jar が存在していない場合には,講師にご相談ください。
c. Servers ビューで、WebSphere Application Server V8.5 Liberty Profile. を展開します。
d. Server Configuration を右クリックし、Open を選択します。
e. design タブで Server Configuration を選択して Add...をクリックし,JDBC Driver(JDBC ド
ライバー)を選択します。
f. サーバーに jdbc のフィーチャーを追加するか尋ねるダイアログボックスがでたら,OK をク
リックします。
g. JDBC ドライバーの構成画面で ID に derbyDriverと入力し,共有ライブラリ参照の Add を
クリックします。
h. JDBC ドライバーの下に共有ライブラリが作成されます。ファイル・セット参照の Add をク
リックします。
i. 共有ライブラリのしたにファイル・セットが作成されます。ベース・ディレクトリーの
Browse...をクリックします。
j. shread.resource.dir を選ぶと上で作成した derby フォルダーが確認できます。これを選
択して OK を押します。
k. 組み込むパターンで Browse...をクリックすると先ほどコピーした derby.jar が表示されま
すので,選択して OK を押します。これで derby.jar を使用した JDBC ドライバーの定義が
完了しました。
データ・ソースの構成 前章で作成した JDBC Driver を使用してデータ・ソースを構成します。
a. Server Configuration を選択して Add...をクリックし,データ・ソースを選択します。
b. JNDI 名に jdbc/derbyDSと入力します。JDBC ドライバー参照の横の▼でプルダウンをだ
すと,先ほど定義した derbyDriver が表示されますので,これを選択します。
c. データ・ソース:jdbc/derbyDS を選択した状態で Add...をクリックし,Derby Embeddedのプロパティを選択します。
d. データベースの作成を create に,データベース名を${server.config.dir}/derbyDS に設定
します。これにより,server.xml がおいてあるサーバー構成ディレクトリに derbyDS という
ディレクトリが作成され,ここにデータベースファイルが格納されるようになります。
この章で構成したように,Liberty プロファイルの構成ディレクトリ(usr ディレクトリ)以下に各種リソー
スやドライバーなどを配置し,相対ディレクトリとして構成を作成することで,サーバーをパッケージして
他の環境に移動することが容易にできるようになります。
Listener の作成 データベースへの読み書きは,Listener および Filter を作成し,その中で行うことにします。
a. LabWeb プロジェクトを選択し New > Listnerを選択します。
b. Java Package として jjug.lab,Class Name として LabWebInitializerを入力して Next >を
クリックします。
c. Session context events の Lifecycle にチェックを入れます。
d. Finish をクリックします。
e. 作成されたソースファイルを編集します。アノテーションのついたDataSourceフィールドを追
加し,contextInitializedメソッドを以下のように実装します。 @Resource(name = "jdbc/derbyDS") DataSource ds; public void contextInitialized(ServletContextEvent arg0) { String sql = "create table todo ( " + "id varchar(50) not null primary key, " + "title varchar(99), " + "detail varchar(999), " + "userid varchar(99))"; try { Connection conn = ds.getConnection(); conn.prepareStatement(sql).executeUpdate(); conn.close(); } catch (Exception e) {} }
f. LabWeb プロジェクトを選択し New > Filter を選択します。
g. Java Package として jjug.lab,Class Name として LabWebFilterを入力して Next >をクリ
ックします。
h. デフォルトの Filter mappings を選択して Edit...をクリックし/*に修正します。
i. Finish をクリックします。
j. 作成された LabWebFilterに以下のようにコードを実装します。
@Inject ToDoList toDoList; @Resource(name = "jdbc/derbyDS") DataSource ds; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest hrequest = (HttpServletRequest)request; String userId = hrequest.getUserPrincipal().getName(); HttpSession session = hrequest.getSession(); if (session.isNew()) { queryDB(userId); } int s = toDoList.size(); chain.doFilter(request, response); if (toDoList.size() != s) { updateDB(userId); } }
アプリケーションのテスト 先ほどと同じようにアプリケーションにアクセスしてみてください。いくつか ToDo エントリを追加したあ
と,Liberty プロファイルを再起動してください。再度アクセスした場合も,以前のエントリが保持されて
いることがわかります。
この章では JDBC を直接使用したため,SQL を含んだ複雑なコーディングを必要としました。JPA(Java Persistence API)を使用すると,Java オブジェクトのデータベースへの永続化を,より簡潔な形で記述
することができます。
JPA を使用したアプリケーションの例は,IBM の技術サイト developerWorksの連載で取り上げてい
く予定です。
private void queryDB(String userId) { String sql = "select id,title,detail from todo where userid = ?"; try { Connection conn = ds.getConnection(); PreparedStatement pstat = conn.prepareStatement(sql); pstat.setString(1, userId); ResultSet rs = pstat.executeQuery(); while (rs.next()) { String id = rs.getString("id"); String title = rs.getString("title"); String detail = rs.getString("detail"); toDoList.add(new ToDoEntry(id, title, detail)); } conn.close(); } catch (SQLException e) {e.printStackTrace();} } private void updateDB(String userId) { String sql1 = "delete from todo where userid = ?"; String sql2 = "insert into todo values (?, ?, ?, ?)"; try { Connection conn = ds.getConnection(); PreparedStatement pstat =conn.prepareStatement(sql1); pstat.setString(1, userId); pstat.executeUpdate(); pstat = conn.prepareStatement(sql2); for (ToDoEntry e : toDoList) { pstat.setString(1, e.getId()); pstat.setString(2, e.getTitle()); pstat.setString(3, e.getDetail()); pstat.setString(4, userId); pstat.executeUpdate(); } conn.close(); } catch (SQLException e) {e.printStackTrace();} }