Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

32
JJUG CCC 2014 Spring Eclipse Liberty プロファイルで始める Java EE 開発ハンズオン

description

JJUG CCC 2014 Springで実施した R5-1 Eclipse/Liberty Java EEハンズオンのテキストです。説明で使用した資料はこちら→ http://www.slideshare.net/takakiyo/was855-libertyprofile20140518

Transcript of Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

Page 1: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

 

   

 

JJUG CCC 2014 Spring

Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン

 

 

     

 

Page 2: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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 ボタンを押して導入を行います。  

Page 3: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

導入が完了し,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  >をクリックします。  

 

Page 4: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

次の画面では,追加で導入することが可能な Add-­‐on の一覧が表示されます。Liberty プロファイル

に JMS や JAX-­‐WS の機能を追加する Extended  Content や各種のサンプルアプリケーションなどを追

加導入することが可能です。必要なものを選んで Next  >をクリックします。  

  ライセンス条項を Accept して導入先ディレクトリを指定すると,Liberty プロファイル環境の導入がは

じまります。導入が完了すると New  Server のダイアログボックスに戻りますので,Next  >をクリックし

ます。  

サーバー構成を作成する画面が出ますので,デフォルトの構成のまま Finish をクリックします。  

 

Page 5: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

これで Liberty プロファイルの導入は完了です。Server ビューに作成した Liberty プロファイルのサ

ーバーが表示されますので,右クリックで Start を選択してサーバーが正常に起動することを確認して

ください。  

   

新規作成される JSP ファイルが,UTF-­‐8 以外になっている場合は,修正しておいてください。

Windows 環境では Window  >  Preference...で,Mac 環境では Eclipse  >  Eclipse についてで設定

のダイアログボックスを開き,Web の JSP  Files で Encoding が UTF-­‐8 になっていることを確認します。

別の文字コードになっていたら,修正してください。  

   

Page 6: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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.  をクリックします。  

Page 7: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

   

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 をクリックします。  

Page 8: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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 をクリックします。  

Page 9: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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 をクリックします。  

Page 10: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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 をクリックします。  

Page 11: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

m. ssl-­‐1.0  を選択し、OK をクリックします。  

   

n. Server  Configuration  を選択し、Add をクリックします。  o. Keystore  (鍵ストア)を選択し、OK をクリックします。  

   

p. パスワードには mysecretと入力します。  q. サーバー構成を保管します。  

   

8. アプリケーションのテスト用にベーシック・ユーザー・レジストリーを作成します。  a. Server  Configuration  を選択し、Add をクリックします。  

Page 12: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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. 認証されていない証明書の警告が表示されたら、証明書を受け入れてください。  

Page 13: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

c. ユーザーID  userX  とパスワード passwordX    を入力します。  

   

d. JSP は以下を表示するはずです    You are userX  

 

Page 14: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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...を選びます。  

Page 15: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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()をクリックします。  

 

Page 16: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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;     }  }  

Page 17: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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();         }       }     }  }  

Page 18: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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 を表示します。  

Page 19: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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>  

Page 20: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

    <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. 編集内容を保管します。

Page 21: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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>  

Page 22: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

c. Java  Package として jjug.labを,Class  Name として AddEntryServletを入力します  

   

d. Next  >をクリックします。  

e. URL  Mappings を選択し,Edit...ボタンをクリックし/AddEntryに修正します。  

   

f. Next    >をクリックします。  

g. doGet のチェックをはずし,doPost にだけチェックを入れた状態にします。  

 

Page 23: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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;

Page 24: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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と入力します。  

Page 25: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

e. サーバー構成を保管します。変更はサーバーを再起動することなく即座に反映されます。  

f. Eclipse 上のブラウザ画面とは別にブラウザを起動し,それぞれ別ユーザー

(userX/userY)でログインします。  

g. 画面を交互に操作して,同一の ToDo リストが共有されていることを確認します。  

h. ToDoList の Java ソース画面を開き,ApplicationScoped を SessionScopedに変更します

(import 文とアノテーションの二カ所)。編集内容を保管します。  

i. ふたたび Eclipse 上のブラウザ画面と別ブラウザからそれぞれ別のユーザーでログインし

て交互に操作します。ユーザーのセッションごとに,異なる ToDo リストが割り当てられてい

ることがわかります。  

 

この章の内容が終わったら,いくつかの ToDo エントリを追加した状態で Liberty プロファイルのサー

バーを停止して,再起動してください。再度アクセスすると,ToDo エントリは全て消えていることがわか

ります。これは,現在のアプリケーションではデータをメモリ上に保持しているだけであるからです。  

次章では,アプリケーションの保持しているエントリをデータベースを使って永続化してみます。  

 

Page 26: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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 ド

ライバー)を選択します。  

Page 27: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

f. サーバーに jdbc のフィーチャーを追加するか尋ねるダイアログボックスがでたら,OK をク

リックします。  

   

g. JDBC ドライバーの構成画面で ID に derbyDriverと入力し,共有ライブラリ参照の Add を

クリックします。  

   

h. JDBC ドライバーの下に共有ライブラリが作成されます。ファイル・セット参照の Add をク

リックします。  

   

i. 共有ライブラリのしたにファイル・セットが作成されます。ベース・ディレクトリーの

Browse...をクリックします。  

   

Page 28: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

j. shread.resource.dir を選ぶと上で作成した derby フォルダーが確認できます。これを選

択して OK を押します。  

   

k. 組み込むパターンで Browse...をクリックすると先ほどコピーした derby.jar が表示されま

すので,選択して OK を押します。これで derby.jar を使用した JDBC ドライバーの定義が

完了しました。  

   

データ・ソースの構成 前章で作成した JDBC  Driver を使用してデータ・ソースを構成します。  

a. Server  Configuration を選択して Add...をクリックし,データ・ソースを選択します。  

Page 29: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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 を作成し,その中で行うことにします。  

Page 30: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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  >をクリ

ックします。  

Page 31: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

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);     }  }  

Page 32: Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51

 

 

   

アプリケーションのテスト 先ほどと同じようにアプリケーションにアクセスしてみてください。いくつか 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();}  }