2. 管理対象 Bean を作成する

ここでは、Web アプリケーションの管理対象 Bean を作成してコンフィグレーションします。作成するのは、ユーザ ID、パスワード、氏名、連絡先などの情報を保持する UserBean という JavaBean です。

2.1. ContactDetailsBean クラスのインポート

  1. [AppXplorer] ビューで [workshop-jsf-tutorial|web/WEB-INF/src/java] ノードを開きます。


  2. [web/WEB-INF/src/java] ノードを右クリックして [新規|パッケージ] を選択し、このノードの下に beans および util という名前の新しいパッケージを作成します。
  3. あらかじめ ContactDetailsBean というクラスが用意されています。住所、市町村、都道府県、国、郵便番号、会社電話番号、自宅電話番号などの連絡先情報を保持するための非常に単純なクラスです。ContactDetailsBean.java クラスを、workshop-jsf-tutorial/web/Resources フォルダから beans パッケージにコピーします。コードを開いて確認します。

2.2. 管理対象 Bean クラス UserBean の作成

  1. [AppXplorer] ビューで beans パッケージを右クリックし、[新規|クラス] を選択します。
  2. クラス名に「UserBean」と入力します。[追加] をクリックして「Serializable」と入力します。これにより、[インターフェース] リストに java.io.Serializable インタフェースが追加されます。

  3. [終了] をクリックします。
  4. UserBean クラスで、次のように変数を宣言します。
    private String userId = null; 
    private Integer password = null; 
    private String name = null; 
    private ContactDetailsBean contactDetails = null;
  5. [ソース|ゲッターおよびセッターの生成] を選択して、各変数のゲッター メソッドとセッター メソッドを生成します。[ゲッターおよびセッターの生成] ダイアログで、[すべて選択] を選択して [OK] をクリックします。
  6. 次のフィールドを UserBean に追加します。
    private static final long serialVersionUID = 1L;
  7. UserBean クラスを保存します。

2.2.1. DataStoreBean クラスと MessageFactory クラスのインポート

  1. workshop-jsf-tutorial/web/Resources フォルダから、DataStoreBean.java クラスを beans パッケージに、MessageFactory.java クラスを util パッケージにそれぞれコピーします。

DataStoreBean は、登録済みユーザのリストを保持します。DataStoreBean クラスを開いてコードを確認します。DataStoreBean コンストラクタは、登録済みユーザのリストを保持する java.util.Hashtable のインスタンスを初期化します。このクラスは、ユーザを追加または削除したり、ユーザ情報を取得したりするためのメソッドを備えています。Hashtable では、userId をキーとし、UserBean インスタンスを値として、ユーザごとにマッピングされます。

MessageFactory クラスは、ローカライズされたメッセージをアプリケーション リソース バンドル (たとえば application.properties ファイル) から取得します。クラスを開いてコードを確認します。getMessage(String, Object[ ]) メソッドは、ローカライズされたメッセージの FacesMessage インスタンスを返します。String 引数は、ResourceBundle 内のメッセージに対応するキーです。通常、Object インスタンスには、メッセージ内に埋め込まれている置換パラメータが格納されます。このクラスは、FacesContext を使用して、メッセージが登録されている Application インスタンスにアクセスします。

2.2.2. ユーザを登録するメソッドの実装

この手順では、registerUser( ) メソッドを UserBean クラスに実装します。このメソッドは、データ ストアにユーザを追加して、ローカライズされたメッセージの FacesMessage インスタンスをキー thanksMsg_Registration で取得して FacesContext に追加し、論理結果 success を返します。

ユーザ ID が同じユーザがすでに存在する場合は、ローカライズされたメッセージの FacesMessage インスタンスをキー userIdExists で取得し、取得したインスタンスを FacesContext に追加してから null を返します。

  1. 次に示す registerUser( ) メソッドのコード行をコピーし、UserBean クラスに追加します。このコード行は、workshop-jsf-tutorial/web/Typing_Aid/UserBean_registerUser_Method.txt からコピーすることもできます。
    public String registerUser( ) {

        FacesContext context = FacesContext.getCurrentInstance( );
        ExternalContext extContext = context.getExternalContext( );
        Map appMap = extContext.getApplicationMap( );

        DataStoreBean dataStore = (DataStoreBean)appMap.get(DataStoreBean.DB_NAME);

        if(dataStore.getUser(userId) != null) {
          Object[ ] objArr = new Object[ ] { userId };
          FacesMessage message = MessageFactory.getMessage(context, "userIdExists", objArr);
          context.addMessage(null, message);

          return null;
        } else {
          dataStore.addUser(this);

          Object[ ] objArr = new Object[ ] { name };
          FacesMessage message = MessageFactory.getMessage(context, "thanksMsg_Registration", objArr);
          String msg = message.getDetail( );
          extContext.getRequestMap( ).put("thanksMsg_Registration", msg);
          return "success";
        }

    }

    このメソッドは、ユーザがすでに存在する場合、ローカライズされたメッセージを FacesContext に追加して null を返します。その結果、javaserver faces 実装によって、メッセージが追加された JSP ページが再表示されます。ページの新しいビューは作成されません。
  2. 以下の import 文を追加します。
    import javax.faces.context.FacesContext;
    import javax.faces.context.ExternalContext;
    import java.util.Map;
    import javax.faces.application.FacesMessage;
    import util.MessageFactory; 
      
  3. UserBean クラスを保存します。

2.3. ローカライズされたメッセージの定義

アプリケーションを多言語対応にするには、インターナショナライゼーション機能を使用します。ここでは、JSF コンポーネントおよび Java クラスによって使用されるプロパティ ファイル内に、テキスト定数、コンポーネントのラベルとタイトル、メッセージを定義します。

UserBean の registerUser( ) メソッドは、ローカライズされたメッセージをアプリケーション リソース バンドル ファイル application.properties からキー userIdExist または thanksMsg_Registration で取得します。

  1. WEB-INF/src/java/resources フォルダの application.properties ファイルを開き、次のコード行を追加してファイルを保存します。
  2. userIdExists=ユーザ ID {0} はすでに存在します。別のユーザ Id を指定してください。
    thanksMsg_Registration=Dear {0} さん、Workshop にご登録いただきありがとうございます。

2.4. 管理対象 Bean のコンフィグレーション

JSF フレームワークでバッキング Bean をインスタンス化して適切なスコープに格納できるようにするには、managed-bean XML 要素を使用してアプリケーション コンフィグレーション リソース ファイル faces-config.xml でコンフィグレーションする必要があります。faces-config.xml ファイルは、アプリケーションの起動時に処理されます。ページが Bean を参照すると、アプリケーション コンフィグレーション リソース ファイル内のコンフィグレーションに従って、JavaServer Faces 実装が Bean を初期化します。

UserBean には、bean タイプ ContactDetailsBean の contactDetails プロパティがあります。したがって、ここではまず ContactDetailsBean の管理対象 Bean コンフィグレーションを定義し、次に UserBean の管理対象 Bean コンフィグレーションを定義します。

2.4.1. ContactDetailsBean コンフィグレーションの宣言

  1. 必要に応じて [AppXplorer] ビューを開きます。
  2. [workshop-jsf-tutorial|web|Faces コンフィグレーション] の [管理対象 Bean] を右クリックし、[新しい管理対象 Bean] を選択します。

  3. [管理対象 Bean タグ] ダイアログの [名前] フィールドに、「contactDetails」と入力します。
    [Scope] ドロップダウン フィールドで [なし] を選択します。
    管理対象 Bean クラスに「beans.ContactDetailsBean」と入力します。
    [終了] をクリックします。



  4. これにより、ContactDetailsBean の管理対象 Bean コンフィグレーションが faces-config.xml ファイルに追加されます。

2.4.2. UserBean コンフィグレーションの宣言

  1. [Faces コンフィグレーション管理対象 Bean] を右クリックし、[新しい管理対象 Bean] を選択します。

  2. [管理対象 Bean タグ] ダイアログで、管理対象 Bean の名前として「user」と入力し、管理対象 Bean クラスとして beans.UserBean、スコープとして [session] を選択します。
  3. [次へ] をクリックします。
  4. [管理対象 Bean タグ] ダイアログで、[追加] ボタンをクリックします。[管理対象プロパティ タグ] ダイアログが表示されます。

  5. [管理対象プロパティ タグ] ダイアログの [名前] フィールドに「contactDetails」と入力します。
    [説明] フィールドに「ユーザの連絡先情報を表す」と入力します。
    [] ラジオ ボタンを選択して「#{contactDetails}」と入力します。
    [OK] をクリックします



  6. これにより、管理対象 Bean user の管理対象プロパティ contactDetails が [管理対象 Bean タグ] ダイアログに追加されます。

  7. [管理対象 Bean タグ] ダイアログで [完了] をクリックします。




    これにより、UserBean の管理対象 Bean コンフィグレーションが faces-config.xml ファイルに追加されます。

  8. [Faces コンフィグレーション管理対象 Beanuser
    ] をダブルクリックします。
    分割されたペインに、ソースと視覚的な [Faces コンフィグレーション] エディタが表示されます。


  9. user 管理対象 Bean の宣言によって、Session スコープ内に UserBean が作成されます。この Bean には、contactDetails 管理対象 Bean を参照する contactDetails プロパティが含まれています。

    contactDetails 管理対象 Bean の宣言では、ContactDetailsBean のインスタンスは作成されません。これは、この Bean がスコープ none で定義されているためです。

チュートリアルを移動するには、矢印をクリックしてください。


さらにヘルプが必要ですか。質問は Workshop ニュース グループまでお寄せください。