ヘッダーをスキップ
Oracle Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド
11gリリース1(11.1.1)
B52029-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

9 入力コンポーネントの使用およびフォームの定義

この章では、データの入力、値の選択、テキストの編集およびファイルのロードに使用される入力コンポーネントについて説明します。

この章に含まれる項は次のとおりです。

9.1 入力コンポーネントおよびフォームの概要

入力コンポーネントは、様々な形式のユーザー入力を受け入れます。最も一般的な形式はテキスト、数値、日付および選択リストです。これらは、フォーム内に表示され、フォームの送信時に送信されます。入力された値や選択内容は、検証および変換され、さらに処理されます。たとえば、File Explorerアプリケーションには、ユーザーによる新しいファイルの作成が可能なフォームが含まれます。図9-1に示すように、ユーザーは入力コンポーネントを使用して、名前やサイズの入力、権限の選択、キーワードおよび説明の追加を実行します。

図9-1 入力コンポーネントを使用したフォーム

入力コンポーネントを使用した入力フォーム

コマンド・コンポーネントと連携して、inputTextコンポーネントに特定のテキストを挿入するinsertTextBehaviorタグも構成できます。入力するテキストには、簡単な文字列、またはその他のコンポーネントの値(selectOneChoiceコンポーネントで選択したリスト項目など)を指定できます。

テキスト、数値、日付または色の入力に使用される標準の入力コンポーネントに加え、ADF Facesには、その他の機能を持つ入力タイプ・コンポーネントも用意されています。inputFileコンポーネントを使用すると、ユーザーはロードするファイルを参照できます。

richTextEditorコンポーネントには、異なるフォント、サイズ、行揃えおよびその他の編集機能を使用した書式設定可能な、多数の行にわたるリッチ・テキスト入力が用意されています。richTextEditorコンポーネントは、コマンド・コンポーネントとともに使用でき、特定のテキストをコンポーネントに挿入することもできます。挿入テキストは事前にフォーマットできます。

選択コンポーネントを使用すると、値を入力するかわりに、または値の入力に加えて、ユーザーが項目のリストから選択できるようになります。たとえば、selectOneChoiceコンポーネントを使用すると、ユーザーはドロップダウン・リストから入力内容を選択でき、selectOneRadioコンポーネントを使用すると、ラジオ・ボタンのグループから選択できるようになります。

リストの表示には、選択コンポーネントまたは値リスト(LOV)コンポーネントを使用できます。LOVコンポーネントは、選択リストが大きい場合に使用します。LOVコンポーネントは、ListOfValueModelクラスを使用したモデル駆動型で、APIを使用してプログラムで構成されます。選択リストは、ポップアップ・ウィンドウ内に表示されます。このウィンドウには、問合せパネルが含まれていることもあります。選択リストは値の静的リストを表示します。LOVコンポーネントの使用方法の詳細は、第11章「値リスト・コンポーネントの使用方法」を参照してください。

selectItemコンポーネントは別の選択コンポーネント内で使用され、そのコンポーネントの選択可能な個々の項目を表します。たとえば、selectOneRadioコンポーネントでは、各ラジオ・ボタンにselectItemコンポーネントを使用します。ラジオ・ボタンの選択内容がコーヒー、紅茶、牛乳の場合、コーヒー、紅茶、牛乳のそれぞれにselectItemコンポーネントを使用します。

フォーム・コンポーネントには、その他のコンポーネント用のコンテナがあります。formコンポーネントは、埋め込まれた入力コンポーネントからの値を送信できるリージョンを表します。formコンポーネントをネストさせることはできません。ただし、subformコンポーネントを使用して、form内で個別にコンポーネント値を送信できるサブリージョンを定義することで、さらに柔軟性を高められます。resetButtonコンポーネントを使用すると、ユーザーは、formまたはsubform内の入力値を簡単に以前の状態にリセットできるようになります。

すべての入力および選択コンポーネントは、ValueChangeEventおよびAttributeChangeEventイベントを送信します。対応するイベントに応じて機能を提供するには、valueChangeListenerおよびattributeChangeListenerメソッドを作成します。

すべての入力コンポーネント、選択コンポーネント(selectItemを除く)およびリッチ・テキスト・エディタ・コンポーネントには、changed属性があります。この属性がtrueに設定されていると、valueフィールドの変更時に変更インジケータ・アイコンが表示されます。インジケータを使用すると、ユーザーは、どの入力値が変更されたか、ページに複数のコンポーネントがある場合に、どのコンポーネントが便利かを簡単に確認できます。デフォルトで、変更インジケータはコンポーネントの左側に表示されます。市区町村が入力されて郵便番号が自動的に生成されるなど、別のフィールド値の変更によりフィールドの値が自動的に変更される場合には、郵便番号フィールドにも変更インジケータが表示されます。図9-2に、チェック・ボックスおよび入力コンポーネントに表示された変更済インジケータを示します。

図9-2 2つのコンポーネントの変更済インジケータ

値変更時のインジケータ

入力コンポーネントにも、ツールチップ、エラーや検証のメッセージ、およびコンテキスト依存ヘルプを表示できます。詳細は、第17章「ヒント、メッセージおよびヘルプの表示」を参照してください。

9.2 formの定義

formは、その他のコンポーネントのコンテナとして機能するコンポーネントです。フォーム内で送信アクションが発生すると、変更された入力値が送信されます。たとえば、入力コンポーネントと選択コンポーネントで構成される入力フォーム、および送信コマンド・ボタンを作成し、すべてをform内に配置できます。ユーザーが複数の入力フィールドに値を入力して送信ボタンをクリックすると、それらの新しい入力値が送信されて処理されます。

JDeveloperでJSFページを作成すると、デフォルトで、ページにformコンポーネントが自動的に挿入されます。ページにコンポーネントを追加すると、formコンポーネント内に挿入されます。


ヒント:

ページにaf:formタグがない状態で、そのページにADF Facesコンポーネントをドラッグ・アンド・ドロップすると、JDeveloperにより、コンポーネントをformコンポーネントで囲むよう要求されます。

例9-1に、2つの入力コンポーネント、およびクリックされると両方の入力値が送信されて処理される送信ボタンを示します。

例9-1 入力コンポーネントのコンテナとしてのADF Facesのform

<af:form>
  <af:panelFormLayout>
    <af:inputText value="#{myBean.firstName}"
                  label="#{First Name}"
    </af:inputText>
    <af:inputText value="#{myBean.lastName}"
                  label="#{Last Name}"
    </af:inputText>
    <f:facet name="footer">
      <af:commandButton text="Submit"/>
    </f:facet>
   </af:panelFormLayout>
</af:form>

ページに使用できるformコンポーネントは1つのみであるため、入力値を送信できる個別のリージョンを作成するには、form内にsubformを使用します。リージョンにおいて、subform内の値は、subform内のコンポーネントが値の送信を行う場合にのみ検証および処理されます。また、subform内に別のsubformをネストさせて、値を送信できるネストしたリージョンを作成することもできます。subformの詳細は、4.6項「サブフォームを使用したページでの領域の作成」を参照してください。

例9-2に、それぞれに独自の入力コンポーネントと送信ボタンを含む2つのsubformがあるformを示します。送信ボタンをクリックすると、そのsubform内の入力値のみが送信されて処理されます。

例9-2 form内のADF Facesのsubform

<af:form>
  <af:subform>
    <af:panelFormLayout>
      <af:inputText value="#{myBean.firstName}"
      </af:inputText>
      <af:inputText value="#{myBean.lastName}"
      </af:inputText>
      <f:facet name="footer">
        <af:commandButton text="Submit"/>
      </f:facet>
    </af:panelFormLayout>
  </af:subform>
  <af:subform>
    <af:panelFormLayout>
      <af:inputText value="#{myBean.primaryPhone}"
      </af:inputText>
      <af:inputText value="#{myBean.cellPhone}"
      </af:inputText>
      <f:facet name="footer">
        <af:commandButton text="Submit"/>
      </f:facet>
    </af:panelFormLayout>
  </af:subform>
</af:form>

基本的な送信ボタンの他に、form内にその他のコマンド・コンポーネントを追加して、そのform内の任意のフィールドで機能させることができます。ADF Facesには、resetButtonコンポーネントという特殊なコマンド・コンポーネントがあり、これをクリックすると、form内のすべての入力および選択コンポーネントがリセットされます。つまり、値の編集が可能なすべてのコンポーネントが、現在のモデルの値で更新されます。resetButtonコンポーネントは、検証や変換でエラーがなく、サーバーへの部分的または完全な送信が成功している以前の状態に入力コンポーネントがリセットされるHTMLのリセットとは異なります。たとえば、ユーザーが値Aを入力して送信ボタンをクリックし、値をAからBに変更してresetButtonコンポーネントをクリックすると、値Aがリストアされます。

9.2.1 ページへのformの追加方法

多くの場合、JDeveloperを使用してformコンポーネントを追加します。ただし、手動でのformの追加や、特定の属性値を使用したformの構成が必要な場合があります。

ページにformを追加する手順:

  1. formを作成するには、コンポーネント・パレットからページにフォーム・コンポーネントをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタで、「共通」セクションを開きます。ここでは、オプションで次の内容を設定できます。

    • defaultCommand: [Enter]キーが押され、form内にフォーカスがある場合に、アクションを起動する必要のあるコマンド・コンポーネントのID属性を指定します。

    • usesUpload: formでファイルのアップロードをサポートするかどうかを指定します。ファイルのアップロードの詳細は、9.9項「ファイルのアップロード機能の使用方法」を参照してください。

    • targetFrame: 新しいページを表示するかどうかを指定します。使用可能な値は、HTMLのターゲット属性の有効な値です。デフォルトは、_selfです。

9.2.2 ページへのsubformの追加方法

ページのセクションで値を個別に送信できることが必要な場合は、formコンポーネント内にsubformコンポーネントを追加する必要があります。

ページにsubformを追加する手順:

  1. subformを追加するには、formコンポーネントの子として、コンポーネント・パレットからページにサブフォームをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタを使用して、次の属性を設定します。

    • default: subformで値を送信済であると仮定するかどうかを指定します。デフォルト値falseに設定すると、その他のsubformコンポーネントが送信されていない場合にのみ、そのsubformコンポーネントは送信済とみなされます。trueに設定すると、そのsubformコンポーネントは値を送信済とみなされます。

    • defaultCommand: [Enter]キーが押され、form内にフォーカスがある場合に、アクションを起動する必要のあるコマンド・コンポーネントのID属性を指定します。

9.2.3 formへのリセット・ボタンの追加方法

formまたはsubformに、resetButtonコンポーネントを追加できます。リセット・ボタンは、そのformまたはsubform内のコンポーネントでのみ機能します。

ページにリセット・ボタンを追加する手順:

  1. コンポーネント・パレットからページに「Reset Button」コンポーネントをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタを使用して、次の属性を設定します。

    • disabled: ボタンを無効にするかどうかを指定します。たとえば、ボタンを無効化する必要のある特定の状況を判断するEL式を入力できます。

    • text: ボタンのテキスト・ラベルを指定します。

9.3 inputTextコンポーネントの使用方法

ピッカー、スライダ、スピン・ボックスなど、入力コンポーネントには多くのバリエーションがありますが、inputTextコンポーネントは、値入力のための基本的な入力コンポーネントです。inputTextコンポーネントは、1行の入力フィールドとして定義することも、rows属性を1より大きい値に設定してテキスト領域として定義することもできます。ただし、複数行のテキスト入力を作成する場合は、9.8項「richTextEditorコンポーネントの使用方法」で説明されているように、richTextEditorコンポーネントの使用を検討します。

secret属性をtrueに設定することで、パスワードなどの入力値を非表示にできます。その他のADF Facesコンポーネントと同じように、inputTextコンポーネントではラベル、テキストおよびメッセージがサポートされています。このコンポーネントをラベルなしで表示する場合は、simple属性をtrueに設定します。図9-3に、1行のinputTextコンポーネントを示します。

図9-3 1行のinputTextコンポーネント

inputTextコンポーネント

複数のinputTextコンポーネントを追加して、入力フォームを作成できます。図9-4に、3つのinputTextコンポーネントと「発行」コマンド・ボタンを使用した入力フォームを示します。

図9-4 inputTextコンポーネントで作成したフォーム

3つのinputTextコンポーネントでフォームが作成されています

コマンド・コンポーネントと連携して、inputTextコンポーネントに特定のテキストを挿入するinsertTextBehaviorタグも構成できます。入力するテキストには、簡単な文字列、またはその他のコンポーネントの値(selectOneChoiceコンポーネントで選択したリスト項目など)を指定できます。たとえば、図9-5は、ユーザーがすでにテキストを入力したinputTextコンポーネントを示しています。

図9-5 テキストが入力済のinputTextコンポーネント

テキストが入力済のinputText

この後、ユーザーがドロップダウン・リストから追加テキストを選択し、コマンド・ボタンをクリックすると、図9-6に示すように、inputTextコンポーネントにそのテキストが表示されます。

図9-6 テキストが挿入済のinputTextコンポーネント

テキストが挿入済のinputTextコンポーネント

9.3.1 inputTextコンポーネントの追加方法

第8章「Webページ上のコンテンツの編成」で説明されている任意のレイアウト・コンポーネントに、inputTextコンポーネントを使用できます。

inputTextコンポーネントを追加する手順:

  1. コンポーネント・パレットからページに「入力テキスト」コンポーネントをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタで、「共通」セクションを開いて次の属性を設定します。

    • label: ラベルとして使用するテキストを指定するための値を入力します。

      ラベルに使用するテキストがリソース・バンドルに格納されている場合は、フィールドのドロップダウン・メニューを使用して「テキスト・リソースの選択」を選択します。「テキスト・リソースの選択」ダイアログを使用して、リソース・バンドル内のテキスト項目を評価する式を作成します。次を参照してください。

      "#{res['home.description']}"
      
    • value: コンポーネントの値を指定します。値のELバインディングが、setメソッドではなくgetメソッドが指定されているBeanプロパティを指していて、それが値の編集が可能なコンポーネントの場合、コンポーネントは読取り専用モードでレンダリングされます。

  3. 「外観」セクションを開き、次の属性を設定します。

    • columns: フィールドに入力可能な最大の文字数を入力し、テキスト・コントロールのサイズを指定します。

    • rows: 表示される行数を入力し、テキスト・コントロールの高さを指定します。デフォルト値は1で、1行の入力フィールドが作成されます。行数は、ブラウザのデフォルトのフォント・サイズに基づいて見積られます。2以上に設定する場合は、wrap属性も設定する必要があります。

    • wrap: 複数行のテキスト・コントロールで使用されるテキストの折返しタイプを指定します。この属性は、1行のコンポーネントでは無視されます。デフォルトでは属性がsoftに設定されており、複数行のテキストは視覚的には折り返されますが、送信される値に改行は含まれません。この属性をoffに設定すると折返しは無効にされ、複数行のテキストは水平にスクロールして表示されます。hardに設定すると、行の折返しに必要な改行がテキストの値に含まれます。

    • secret: 1行のテキスト・コントロールにのみ適用されるブール値を指定します。trueに設定されている場合、secret属性により、テキストの実際の値がユーザーには非表示になります。

    • showRequired: フィールドが必須であることを視覚的に表示するかどうかを指定します。required属性をtrueに設定しても、視覚的な表示が行われることに注意してください。showRequired属性を使用するのは、別のフィールドの値が変更された場合にのみフィールドが必須になるときです。

    • changed: フィールドの値が変更された場合に、青丸を表示するかどうかを指定します。これをtrueに設定する場合は、changedDesc属性も設定する必要があります。

    • changedDesc: 変更されたアイコン上にマウスが置かれた場合に、ツールチップに表示するテキストを指定します。デフォルトで、テキストは「変更済」です。このテキストは、異なる値を指定することでオーバーライドできます。

    • accessKey: フィールドにアクセスするために押すキーを指定します。

    • labelAndAccessKey: ラベルとアクセス・キーを別々に指定するかわりに、2つを結合して、アクセス・キーがラベルの一部になるようにします。アクセス・キーとして使用する文字の前にアンパサンド(&)を付けます。

      たとえば、フィールドのラベルが「Description」で、Dをアクセス・キーにする場合は、&Descriptionと入力します。


      注意:

      値はXMLのページ・ソースに格納されるため、アンパサンド(&)文字をエスケープする必要があります。そのため、ソース・ページでは、アンパサンドを意味する文字&amp;を使用して表されます。

    • simple: ラベルを表示しない場合にtrueに設定します。

  4. 「動作」セクションを開き、次の属性を設定します。

    • required: 値が必要かどうかを指定します。trueに設定されている場合、値を入力する必要があることをユーザーに知らせるために視覚的に表示されます。値が入力されない場合、例外が発生し、コンポーネントの検証が失敗します。

    • readOnly: コントロールを、値の編集が可能なフィールドとして表示するか、出力スタイルのテキスト・コントロールとして表示するかを指定します。

    • autoSubmit: 値が変更されたらコンポーネントを自動的に送信するかどうかを指定します。autoSubmit属性の使用の詳細は、4.4項「最適化されたライフサイクルの使用」を参照してください。

    • autoTab: 現在のコンポーネントの最大長に達した場合に、フォーカスを次のタブ位置に自動的に移動するかどうかを指定します。

    • maximumLength: テキスト・コントロールに入力できる1行当たりの最大文字数を指定します。これには、改行を表す文字も含まれます。0以下に設定されている場合、maximumLength属性は無視されます。Internet Explorerのようなブラウザでは、改行は2文字として扱われます。

    • converter: コンバータ・オブジェクトを指定します。詳細は、6.3項「変換の追加」を参照してください。

    • validator: EL式を使用して、バリデータ・メソッドへのメソッド参照を指定します。詳細は、6.5項「検証の追加」を参照してください。

9.3.2 inputTextコンポーネントへのテキストの挿入機能の追加方法

inputTextコンポーネントにテキストを挿入できるようにするには、テキストの挿入に使用されるコマンド・コンポーネントの子としてinsertTextBehaviorタグを追加します。

テキスト挿入動作を追加する手順:

  1. 9.3.1項「inputTextコンポーネントの追加方法」の説明に従い、inputTextコンポーネントを作成します。clientComponent属性をtrueに設定します。

  2. テキストを挿入するためにユーザーがクリックするコマンド・コンポーネントを追加します。手順は、18.2.1項「コマンド・ボタンおよびコマンド・リンクの使用方法」を参照してください。

  3. コンポーネント・パレットの「操作」セクションを開き、「テキスト挿入動作」をコマンド・コンポーネントの子としてドラッグ・アンド・ドロップします。

  4. テキスト挿入動作ダイアログで、次の内容を入力します。

    • for: ドロップダウン矢印を使用して「編集」を選択し、テキストを挿入するinputTextコンポーネントに移動して選択します。

    • value: 挿入するテキストの値を入力します。静的テキストを挿入する場合は、そのテキストを入力します。ユーザーが別のコンポーネントの値(selectOneChoiceコンポーネントの値など)を挿入できるようにする場合は、その値に解決されるEL式を入力します。例9-3に、ドロップダウン・リストの値または静的テキストの値を挿入できるinputTextコンポーネントのページ・コードを示します。

      例9-3 insertTextBehaviorタグの使用

      <af:inputText clientComponent="true" id="idInputText" label="String value"
                    value="#{demoInput.value}" rows="10" columns="60"/>
      <af:selectOneChoice id="targetChoice" autoSubmit="true"
                          value="#{demoInput.choiceInsertText}"
                          label="Select text to insert">
        <af:selectItem label="Some Text." value="Some Text."/>
        <af:selectItem label="0123456789" value="0123456789"/>
        <af:selectItem label="~!@#$%^*" value="~!@#$%^*"/>
        <af:selectItem label="Two Lines" value="\\nLine 1\\nLine 2"/>
      </af:selectOneChoice>
      <af:commandButton text="Insert Selected Text" id="firstButton"
                        partialTriggers="targetChoice">
        <af:insertTextBehavior for="idInputText"
                               value="#{demoInput.choiceInsertText}"/>
      </af:commandButton>
      <af:commandButton text="Insert Static Text">
        <af:insertTextBehavior for="idInputText"
                               value="Some Static Text."/>
      </commandButton>
      
  5. デフォルトでは、コマンド・コンポーネントをクリックしてアクション・イベントがトリガーされるとテキストが挿入されます。ただし、プロパティ・インスペクタでtriggerType属性のドロップダウン・メニューからイベントを選択することで、これを別のクライアント・イベントに変更できます。

9.4 数値入力コンポーネントの使用方法

スライダ・コンポーネントを使用すると、スライダ上の位置が値に対応している1つまたは2つのマーカーがあるスライダを作成できます。スライダの値が表示され、一方にはマイナス・アイコンが、もう一方にはプラス・アイコンがあります。ユーザーはマーカーを選択し、スライダ上を移動させて値を選択します。図9-7(水平レイアウト)および図9-8(垂直レイアウト)に示すように、inputNumberSliderコンポーネントにはマーカーが1つあり、ユーザーはスライダから値を1つ選択できます。

図9-7 水平レイアウトのinputNumberSlider

水平のinputSlider

図9-8 垂直レイアウトのinputNumberSlider

垂直のinputNumberSlider

図9-9に示すように、inputRangeSliderコンポーネントにはマーカーが2つあり、ユーザーは範囲のエンド・ポイントを選択できます。

図9-9 水平レイアウトのinputRangeSlider

水平のinputRangeSlider

図9-10に示すように、inputNumberSpinboxは、数値用の入力フィールド、および入力フィールドの現在の値を増減させるための上矢印キーと下矢印キーのセットを作成する入力コンポーネントです。

図9-10 inputNumberSpinbox

スピン・ボックスを使用して数値のリストをスクロールします

9.4.1 inputNumberSliderまたはinputRangeSliderコンポーネントの追加方法

inputNumberSliderまたはinputRangeSliderコンポーネントを追加する際には、表示される数値の範囲と増分を決定できます。

inputNumberSliderまたはinputRangeSliderコンポーネントを追加する手順:

  1. コンポーネント・パレットからページに数値入力スライダまたは範囲入力スライダ・コンポーネントをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタで、「共通」セクションを開いて、次の属性を設定します(inputRangeSliderコンポーネントの場合は、「データ」セクションも開きます)。

    • label: コンポーネントのラベルを指定します。

    • minimum: 選択可能な最小値を指定します。この値は、スライダの開始値です。

    • maximum: 選択可能な最大値を指定します。この値は、スライダの終了値です。

    • minimumIncrement: 最小の増分値を指定します。これは、ユーザーがプラスまたはマイナスのアイコンをクリックすると適用される増分です。

    • majorIncrement: 大きい方の2つの目盛り間の距離を指定し、ラベル付きの値が表示されるようにします。たとえば、図9-9inputRangeSliderコンポーネントのmajorIncrement値は5.0です。0未満の場合、大きい方の増分値は表示されません。

    • minorIncrement: 小さい方の2つの目盛り間の距離を指定します。0未満の場合、小さい方の増分値は表示されません。

    • value: コンポーネントの値を指定します。値のELバインディングが、setメソッドではなくgetメソッドが指定されているBeanプロパティを指している場合、コンポーネントは読取り専用モードでレンダリングされます。

  3. 「外観」セクションを開き、次の属性を設定します。

9.4.2 inputNumberSpinboxコンポーネントの追加方法

inputNumberSpinboxコンポーネントを使用すると、ユーザーは一連の数値をスクロールして値を選択できるようになります。

inputNumberSpinboxコンポーネントを追加する手順:

  1. コンポーネント・パレットからページに「入力数値スピンボックス」コンポーネントをドラッグ・アンド・ドロップします。

  2. 「データ」セクションを開き、次の属性を設定します。

    • value: コンポーネントの値を指定します。値のELバインディングが、setメソッドではなくgetメソッドが指定されているBeanプロパティを指している場合、コンポーネントは読取り専用モードでレンダリングされます。

    • minimum: 入力フィールドで許可される最小値を指定します。

    • maximum: 入力フィールドで許可される最大値を指定します。

    • stepSize: スピン・ボックスが入力フィールドの数値を増減する際の増分を指定します。

  3. 「外観」セクションを開き、属性を設定します。これらの属性設定の詳細は、9.3.1項「inputTextコンポーネントの追加方法」を参照してください。

9.5 カラー・チューザおよび日付チューザの使用方法

inputColorコンポーネントを使用すると、色のコードを入力するためのテキスト入力フィールドと、パレットから色を選択するためのボタンを作成できます。デフォルトの色のコード形式は16進の色の形式です。ただし、ColorConverterクラスを使用して書式設定をオーバーライドできます。

デフォルトで、inputColorコンポーネントにより、ユーザーがパレットから色を選択できるようにするchooseColorコンポーネントが開かれます。図9-11に、ポップアップ・ダイアログのchooseColorコンポーネントが含まれるinputColorコンポーネントを示します。

図9-11 ポップアップのchooseColorコンポーネントが含まれるinputColorコンポーネント

chooseColorピッカーが含まれるinputColorコンポーネント

inputDateコンポーネントを使用すると、図9-12に示すように、日付を入力するためのテキスト入力フィールドと、ポップアップ・カレンダから日付を選択するためのボタンを作成できます。デフォルトの日付フォーマットは、現在のロケールに適切な省略の日付フォーマットです。たとえば、米語(ENU)のデフォルトの書式はmm/dd/yyです。ただし、この書式は日時コンバータを使用してオーバーライドできます(コンバータの使用方法の詳細は、6.3項「変換の追加」を参照してください)。

図9-12 inputDateコンポーネント

日付入力コンポーネント

日時コンバータを追加して、日付と時間の両方を表示するように構成すると、ユーザーが時間を入力するための追加のコントロールのある日付ピッカーがモーダル・ダイアログとして表示されます。また、コンバータがタイムゾーンを表示するように構成されている場合、図9-13に示すように、ダイアログ内にタイムゾーン・ドロップダウン・リストが表示され、inputDateコンポーネントにより、選択したタイムゾーンが入力ボックスの上に表示されます。

図9-13 日時コンバータが使用されている場合のモーダル・ダイアログ

日時用のモーダル・ダイアログ

9.5.1 inputColorコンポーネントの追加方法

inputColorコンポーネントを使用すると、ユーザーによる入力テキスト・フィールドへの値の入力や、カラー・チューザからの色の選択が可能になります。

inputColorコンポーネントを追加する手順:

  1. コンポーネント・パレットからページに色入力コンポーネントをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタで、「共通」セクションを開いて次の属性を設定します。

    • label: コンポーネントのラベルを指定します。

    • compact: 図9-14に示すように、入力テキスト・フィールドを表示しない場合はtrueに設定します。

      図9-14 CompactモードのinputColorコンポーネント

      compactモードのinputColorコンポーネント
  3. 「データ」セクションを開き、次の属性を設定します。

    • value: コンポーネントの値を指定します。値のELバインディングが、setメソッドではなくgetメソッドが指定されているBeanプロパティを指している場合、コンポーネントは読取り専用モードでレンダリングされます。

    • colorData: 標準のカラー・パレットに表示される色のリストを指定します。表示される色の数は、49(7色x7色)、64(8色x8色)および121(11色x11色)です。この属性に設定される数値により、width属性の有効な値が決定されます。たとえば、colorData属性を49に設定した場合、幅は7にする必要があります。数と幅が一致しない場合、リストの余分な色要素が無視されるか、不足の色要素が色なしで表示されます。色のリストは、クライアント側ではタイプTrColorの配列であることが必要です。

    • customColorData: カスタム定義の色のリストを指定します。色の数は7、8、11のいずれかです。色のリストは、クライアント側ではタイプTrColorの配列であることが必要です。サーバー側では、java.awt.Colorオブジェクトのリストであるか、16進の色の文字列であることが必要です。

    • defaultColor: #000000など、16進の色のコードを使用してデフォルトの色を指定します。

  4. 「外観」セクションを開き、次の属性を設定します。

    • width: セルにおける標準のパレットの幅を指定します。有効な値は7、8および11で、colorDataおよびcustomColorData属性の値に対応します。

    • customVisible: 「カスタム・カラー」ボタンおよびカスタム・カラー行を表示するかどうかを指定します。trueに設定すると、「カスタム・カラー」ボタンおよびカスタム・カラー行がレンダリングされます。

    • defaultVisible: 「デフォルト」ボタンを表示するかどうかを指定します。trueに設定すると、「デフォルト」ボタンがレンダリングされます。「デフォルト」ボタンを使用すると、ユーザーはdefaultColor属性の値として、簡単に色のセットを選択できるようになります。

    • lastUsedVisible: 「最終使用」ボタンを表示するかどうかを指定します。trueに設定すると、「最終使用」ボタンがレンダリングされ、ユーザーは前回使用した色を選択できるようになります。

  5. 「動作」セクションを開き、次の属性を設定します。

    • chooseId: 色の値の選択に使用できるchooseColorコンポーネントのIDを指定します。設定しない場合、inputColorコンポーネントには、chooseColorコンポーネントが使用された独自のデフォルトのポップアップ・ダイアログが使用されます。

9.5.2 inputDateコンポーネントの追加方法

inputDateコンポーネントを使用すると、ユーザーは日付の入力または選択を実行できます。

inputDateコンポーネントを追加する手順:

  1. コンポーネント・パレットからページに日付入力コンポーネントをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタの「共通」セクションで、次の属性を設定します。

    • label: コンポーネントのラベルを指定します。

    • value: コンポーネントの値を指定します。値のELバインディングが、setメソッドではなくgetメソッドが指定されているBeanプロパティを指している場合、コンポーネントは読取り専用モードでレンダリングされます。

  3. 「データ」セクションを開き、次の属性を設定します。

    • minValue: 日付値に許可される最小値を指定します。タグで固定値に設定されている場合、ISO 8601の日付として解析されます。ISO 8601の日付は、yyyy-MM-dd(2002-02-15など)の形式です。この他すべての使用方法では、java.util.Dateオブジェクトが必要です。

    • maxValue: 日付値に許可される最大値を指定します。タグで固定値に設定されている場合、ISO 8601の日付として解析されます。ISO 8601の日付は、yyyy-MM-dd(2002-02-15など)の形式です。この他すべての使用方法では、java.util.Dateオブジェクトが必要です。

    • disableDays: org.apache.myfaces.trinidad.model.DateListProviderインタフェースの実装へのバインディングを指定します。getDateListメソッドでは、無効の状態でレンダリングされる個々のjava.util.Dateオブジェクトのリストが生成されます。日付は、指定されたベース・カレンダのコンテキストに存在する必要があります。


      パフォーマンスのヒント:

      このバインディングには、定期的なラウンドトリップが必要です。特定の曜日(土曜日および日曜日など)のみを無効にする場合は、disableDaysOfWeek属性を使用します。

    • disableDaysOfWeek: 各週に無効の状態でレンダリングする必要のある曜日を空白で区切ったリストで指定します。リストには、sunmontuewedthufrisatの1つ以上の略語を含める必要があります。デフォルトでは、すべての曜日が有効です。

    • disableMonths: 各年に無効の状態でレンダリングする必要のある月を空白で区切ったリストで指定します。リストには、jan、feb、mar、apr、may、jun、jul、aug、sep、oct、nov、decの1つ以上の略語を含める必要があります。デフォルトでは、すべての月が有効です。

  4. 「動作」セクションを開き、chooseIdの属性を設定します。日付の値の選択に使用できるchooseDateコンポーネントのIDを指定します。設定しない場合、inputDateコンポーネントには、chooseDateコンポーネントが使用された独自のポップアップ・ダイアログが使用されます。

9.6 選択コンポーネントの使用方法

選択コンポーネントを使用すると、ユーザーは項目のリストやグループから、単一または複数の値を選択できるようになります。ADF Facesには、単純なブール・ラジオ・ボタンから、ユーザーが複数の項目を選択できるリスト・ボックスまで、様々な選択コンポーネントがあります。選択コンポーネント内の項目のリストは、複数のselectItemコンポーネントで構成されています。

selectItemコンポーネントを除くすべての選択コンポーネントは、ValueChangeEventおよびAttributeChangeEventイベントを送信します。selectItemコンポーネントは、AttributeChangeEventイベントのみを送信します。これらのイベント用に、valueChangeListenerハンドラまたはattributeChangeListenerハンドラ(あるいはその両方)を作成する必要があります。

selectOneRadioコンポーネントを使用すると、図9-15に示すように、ユーザーは一連のラジオ・ボタンとして表示された項目のセットから値を1つ選択できるコンポーネントを作成できます。

図9-15 selectOneRadioコンポーネント

selectOneRadioコンポーネント

selectBooleanRadioコンポーネントを使用すると、同じgroup属性を使用して、selectBooleanRadioボタンをグループ化できます。図9-16に示すように、ラジオ・ボタンはページの任意の場所に配置でき、同じgroup値を共有するその他のラジオ・ボタンと一緒に配置する必要はありません。ページ内での物理的な配置にかかわらず、同じgroup値のラジオ・ボタンの選択は相互に排他的になります。

図9-16 selectBooleanRadioコンポーネント

selectBooleanRadioコンポーネント

selectOneRadio同様、selectBooleanCheckboxコンポーネントも選択済の状態と未選択の状態が切り替わります(図9-17を参照)。

図9-17 selectBooleanCheckboxコンポーネント

selectBooleanCheckboxコンポーネント

selectManyCheckboxコンポーネントを使用すると、図9-18に示すように、ユーザーが一連のチェック・ボックスから複数の値を選択できるコンポーネントを作成できます。

図9-18 selectManyCheckboxコンポーネント

selectManyCheckboxコンポーネント

selectOneListboxコンポーネントを使用すると、図9-19に示すように、ユーザーは影付きのボックスに表示された項目のリストから値を1つ選択できるコンポーネントを作成できます。

図9-19 selectOneListboxコンポーネント

selectOneListboxコンポーネント

selectManyListboxコンポーネントを使用すると、ユーザーが、項目のリストから複数の値を選択できるコンポーネントを作成できます。図9-20に示すように、このコンポーネントには、チェック・ボックスのリストの先頭に表示される「すべて」チェック・ボックスが含まれます。

図9-20 selectManyListboxコンポーネント

selectManyListboxコンポーネント

selectOneChoiceコンポーネントを使用すると、ユーザーが項目のドロップダウン・リストから値を1つ選択できるメニュー形式のコンポーネントを作成できます。selectOneChoiceコンポーネントは、ドロップダウン・リストの項目が比較的少ない場合に使用します。多数の項目が必要な場合は、inputComboboxListOfValuesコンポーネントを使用することをお薦めします。詳細は、第11章「値リスト・コンポーネントの使用方法」を参照してください。

図9-21に、selectOneChoiceコンポーネントを示します。

図9-21 selectOneChoiceコンポーネント

selectOneChoiceコンポーネント

図9-22に示すように、selectOneChoiceコンポーネントは、コンパクト・モードで表示されるように構成できます。コンパクト・モードでは、入力フィールドが小さなアイコンに置き換えられます。

図9-22 コンパクト・モードのselectOneChoiceコンポーネント

コンパクト・モードのselectOneChoice。

ユーザーがアイコンをクリックすると、図9-23に示されているようにドロップダウン・リストが表示されます。

図9-23 コンパクト・モードのselectOneChoiceコンポーネントのリスト

コンパクト・モードのselectOneChoiceコンポーネントのリスト

selectManyChoiceコンポーネントを使用すると、ユーザーが項目のドロップダウン・リストから複数の値を選択できるメニュー形式のドロップダウン・コンポーネントを作成できます。このコンポーネントは、選択項目のリストの先頭に表示される「すべて」選択項目を含めるように構成できます。図9-24に示すように、選択肢の数が15より多い場合は、スクロールバーが表示されます。

図9-24 selectManyChoiceコンポーネント

selectManyChoiceコンポーネント

次のコンポーネントの場合、コントロールの上にラベルを表示させるには、これらをpanelFormLayoutコンポーネント内に配置します。

次のコンポーネントでは、セキュリティ上の理由から、属性disabledimmediatereadOnlyrequiredrequireMessageDetailおよびvalueをクライアント上のJavaScriptから設定することはできません(詳細は、3.6.3項「セキュア・プロパティと分離プロパティについて」を参照してください)。

9.6.1 選択コンポーネントの使用方法

選択コンポーネントの追加手順は、どのコンポーネントでも同じです。まず、選択コンポーネントを追加して属性を構成します。次に、リスト内の個々の項目用に任意の数のselectItemコンポーネントを追加して構成します。

選択コンポーネントを使用する手順:

  1. コンポーネント・パレットからページに選択コンポーネントをドラッグ・アンド・ドロップします。

  2. selectBooleanCheckboxおよびselectBooleanRadioコンポーネント以外のすべての選択コンポーネントで、マネージドBeanの値にバインドするか、静的リストを作成するかを選択するダイアログが開きます。ダイアログの2番目のページで、次のプロパティを設定できます。

    • label: リストのラベルを入力します。

    • requiredMessageDetail: ユーザーが選択を行わない場合に表示するメッセージを入力します。メッセージの詳細は、17.3項「検証および変換用のヒントとエラー・メッセージの表示」を参照してください。

    • validator: マネージドBeanの検証メソッドに解決されるEL式を入力します(詳細は、第6章「入力の検証および変換」を参照してください)。

    • value: コンポーネントの値を指定します。値のELバインディングが、setメソッドではなくgetメソッドが指定されているBeanプロパティを指している場合、コンポーネントは読取り専用モードでレンダリングされます。

    • valueChangeListener: 値変更イベントを処理するマネージドBeanのリスナーに解決されるEL式を入力します。

  3. プロパティ・インスペクタの「外観」セクションを開き、表9-1に説明されている属性を設定します。ここで説明するのは、選択コンポーネントに固有の属性のみであることに注意してください。多くの属性は、テキスト入力コンポーネントと同じです。詳細は、9.3.1項「inputTextコンポーネントの追加方法」を参照してください。

    表9-1 選択コンポーネントの外観属性

    コンポーネント 属性

    selectOneRadioselectManyCheckbox

    layout: verticalに設定すると、ボタンまたはチェック・ボックスが縦に表示されます。horizontalに設定すると、単一の水平な線に表示されます。

    selectManyListbox

    size: リストに表示する項目の数に設定します。リスト内の項目数がsize属性の値より大きい場合は、スクロール・バーが表示されます。

    selectManyListboxselectManyChoice

    selectAllVisible: trueに設定すると、ユーザーがリスト内のすべての項目を選択できる「すべて」選択が表示されます。

    selectOneChoice

    mode: compactに設定すると、ユーザーがドロップダウン・アイコンをクリックした場合にのみコンポーネントが表示されます。

    selectOneRadioselectOneListboxselectOneChoice

    unselectedLabel: nullの値を表すオプションのテキストを入力します。これは、何も選択されないことを意味します。unselectedLabelが設定されておらず、コンポーネントに値が選択されていない場合、ラベルおよび値の文字列が空のオプションは、選択ボックスの最初のオプションとしてレンダリングされます(空のオプションが定義されていない場合)。unselectedLabel値を定義する場合は、required属性をtrueに設定する必要があることに注意してください。設定しないと、リストに空のオプションが2つ表示されます。オプションが正しく選択されていても、unselectedLabelが設定されなければ、空のオプションはレンダリングされません。


  4. プロパティ・インスペクタの「動作」セクションを開き、表9-2に説明されている属性を設定します。ここで説明するのは、選択コンポーネントに固有の属性のみであることに注意してください。多くの属性は、テキスト入力コンポーネントと同じです。詳細は、9.3.1項「inputTextコンポーネントの追加方法」を参照してください。

    表9-2 選択コンポーネントの動作属性

    コンポーネント 属性

    ブール選択コンポーネントを除くすべて

    valuePassThru: クライアントに値をパススルーするかどうかを指定します。valuePassThrufalseの場合、値とオプションの値は、クライアントに送信される前に索引に変換されます。そのため、valuePassThrufalseで、値またはオプション(あるいはその両方)にカスタム・オブジェクトを使用している場合は、独自のコンバータを作成する必要はありません。クライアント側の実際の値を把握する必要がある場合は、valuePassThrutrueに設定できます。これにより、カスタム・コンバータがある場合には使用して、クライアントに値がパススルーされます。カスタム・オブジェクトを使用している場合は、カスタム・コンバータが必要です。デフォルトは、falseです。

    選択コンポーネントがADFモデル・バインディングを使用している場合、この値は無視されます。

    selectBooleanRadio

    group: 同じgroup値を持つその他すべてのselectBooleanRadioコンポーネントに対して相互に排他的であるグループの名前を入力します。


  5. ブール・コンポーネントの場合は、ブール・コンポーネントの子として、任意の数のselectItemコンポーネントをドラッグ・アンド・ドロップします。これらはリストの項目を表します(その他の選択コンポーネントの場合は、手順2のダイアログにより自動的に追加されます)。

  6. selectItemコンポーネントが選択された状態で、プロパティ・インスペクタの「共通」セクションを開き、設定されていない場合はvalue属性に値を入力します。これが送信される値です。

  7. 「外観」セクションを開き、設定されていない場合はlabel属性の値を入力します。これがリストに表示されるテキストです。

  8. 項目が無効化された状態でリストに表示されるようにする場合は、「動作」セクションを開いて、disabled属性をtrueに設定します。

9.7 シャトル・コンポーネントの使用方法

selectManyShuttleおよびselectOrderShuttleコンポーネントを使用すると、ユーザーが一方のリスト・ボックスからもう一方のリスト・ボックスに項目を移動するための2つのリスト・ボックスおよびボタンを作成できます。ユーザーは、先行(Available values)リスト・ボックスと後続(Selected values)リスト・ボックスの間を移動させる単一の項目または複数の項目を選択できます。どちらのコンポーネントでも、コントロールの上にラベルを表示する場合には、それらをpanelFormLayoutコンポーネント内に配置します。

図9-25に、selectManyShuttleコンポーネントを示します。

図9-25 selectManyShuttleコンポーネント

selectManyShuttleコンポーネント

図9-26に示すように、selectOrdershuttleコンポーネントには、ユーザーが「選択した値」リスト・ボックスの値を並べ替えるために使用する上矢印および下矢印ボタンを追加で含めることができます。リストを並べ替えると、ValueChangeEventイベントが送信されます。readOnly属性をtrueに設定した場合は、並べ替える値が、後続リスト(「選択した値」)に表示される選択済の値であることを確認します。

図9-26 selectOrderShuttleコンポーネント

selectOrderShuttleコンポーネント

その他のselectManyコンポーネント同様、これらのコンポーネントのvalue属性は、含まれているselectItemコンポーネントのうちの1つの値に対応する値のリストまたは配列であることが必要です。あるselectItemsの値がリストまたは配列に存在する場合、項目は後続リストに表示されます。selectManyListboxコンポーネントをselectManyShuttleに直接変換できます。これにより、valueによってリスト・ボックスに選択される項目が決まるのではなく、selectOrderShuttleコンポーネントの後続リストにどの項目が表示されるかが影響を受けます。

その他の選択コンポーネント同様、項目のリストまたは配列は、selectManyShuttleまたはselectOrderShuttleコンポーネントにネストしているselectItemコンポーネントで構成されています。例9-4に、ユーザーがファイル・タイプのリストから上位5つのファイル・タイプを選択できるselectOrderShuttleコンポーネントのサンプルを示します。

例9-4 selectOrderShuttleのJSFページ・コード

<af:selectOrderShuttle value="#{helpBean.topFive}"
    leadingHeader="#{explorerBundle['help.availableFileTypes']}"
    trailingHeader="#{explorerBundle['help.top5']}"
    simple="true">
  <af:selectItem label="XLS"/>
  <af:selectItem label="DOC"/>
  <af:selectItem label="PPT"/>
  <af:selectItem label="PDF"/>
  <af:selectItem label="Java"/>
  <af:selectItem label="JWS"/>
  <af:selectItem label="TXT"/>
  <af:selectItem label="HTML"/>
  <af:selectItem label="XML"/>
  <af:selectItem label="JS"/>
  <af:selectItem label="PNG"/>
  <af:selectItem label="BMP"/>
  <af:selectItem label="GIF"/>
  <af:selectItem label="CSS"/>
  <af:selectItem label="JPR"/>
  <af:selectItem label="JSPX"/>
  <f:validator validatorId="shuttle-validator"/>
</af:selectOrderShuttle>

selectOrdershuttleコンポーネントのreorderOnly属性をtrueに設定すると、移動機能が無効にされ、「選択した値」リスト・ボックスのみが表示されます。図9-27に示すように、ユーザーは、リスト・ボックス内の項目の並替えのみを実行できます。

図9-27 並替え専用モードのselectOrderShuttleコンポーネント

reorderOnlyモードのselectOrderShuttleコンポーネント

9.7.1 selectManyShuttleまたはselectOrderShuttleコンポーネントの追加方法

シャトル・コンポーネントの追加手順は、どちらのコンポーネントも同じです。まず、選択コンポーネントを追加して属性を構成します。次に、リスト内の個々の項目用に任意の数のselectItemコンポーネントを追加して構成します。

selectManyShuttleまたはselectOrderShuttleコンポーネントを追加する手順:

  1. コンポーネント・パレットからページにシャトル・コンポーネントをドラッグ・アンド・ドロップします。

  2. マネージドBeanの値にバインドするか、静的リストを作成するかを選択するダイアログが表示されます。ダイアログの2番目のページで、次のプロパティを設定できます。

    • label: リストのラベルを入力します。

    • requiredMessageDetail: ユーザーが選択を行わない場合に表示するメッセージを入力します。メッセージの詳細は、17.3項「検証および変換用のヒントとエラー・メッセージの表示」を参照してください。

    • size: リストの表示サイズ(項目の数)を指定します。指定するサイズは、10〜20項目の範囲である必要があります。属性が設定されていない場合、または10より小さい値の場合、サイズはデフォルトまたは最小値の10になります。指定された属性値が20項目より多い場合、サイズは最大値の20になります。

    • validator: マネージドBeanの検証メソッドに解決されるEL式を入力します。

    • value: コンポーネントの値を指定します。値のELバインディングが、setメソッドではなくgetメソッドが指定されているBeanプロパティを指している場合、コンポーネントは読取り専用モードでレンダリングされます。

    • valueChangeListener: 値変更イベントを処理するマネージドBeanのリスナーに解決されるEL式を入力します。

  3. 「外観」セクションを開き、次のプロパティを設定します。

    • layout: コンポーネントを水平または垂直レイアウトのどちらにするかを指定します。デフォルトは水平で、先行および後続のリスト・ボックスは相互に隣り合って表示されます。垂直に設定すると、先行のリスト・ボックスは後続のリスト・ボックスの上に表示されます。

    • leadingHeader: シャトル・コンポーネントの先行リストのヘッダー・テキストを指定します。

    • leadingDescShown: trueに設定すると、先行のリスト・ボックスの下部に選択された項目の説明が表示されます。

    • trailingHeader: シャトル・コンポーネントの後続リストのヘッダーを指定します。

    • trailingDescShown: trueに設定すると、後続のリスト・ボックスの下部に選択された項目の説明が表示されます。

  4. 「動作」セクションを開き、オプションで次の属性を設定します。

    • valuePassThru: クライアントに値をパススルーするかどうかを指定します。valuePassThrufalseの場合、値とオプションの値は、クライアントに送信される前に索引に変換されます。そのため、valuePassThrufalseで、値またはオプション(あるいはその両方)にカスタム・オブジェクトを使用している場合は、独自のコンバータを作成する必要はありません。クライアント側の実際の値を把握する必要がある場合は、valuePassThrutrueに設定できます。これにより、カスタム・コンバータがある場合には使用して、クライアントに値がパススルーされます。カスタム・オブジェクトを使用している場合は、カスタム・コンバータが必要です。デフォルトは、falseです。

    • reorderOnlyselectOrderShuttleコンポーネントのみ): シャトル・コンポーネントを並替え専用モードにするかどうかを指定します。このモードでは、ユーザーは値リストの順序を変更できますが、追加や削除はできません。

  5. 構造ウィンドウでselectItemコンポーネントの1つを選択し、プロパティ・インスペクタで必要な属性を設定します。


    ヒント:

    先行または後続のリスト・ボックスに説明を表示することを選択した場合は、各selectItemコンポーネントのshortDesc属性に値を設定する必要があります。

9.7.2 選択イベントのクライアント・リスナーの使用方法について

項目選択のイベントに対応して処理を実行するJavaScriptコードを作成することで、ユーザーが一方のリストからもう一方のリストに項目を移動する前に、選択されたそれぞれの項目に関する情報をユーザーに提供できます。たとえば、コードで項目に関する追加の情報を取得し、ユーザーが項目を移動するかどうかの選択を支援するポップアップとして表示できます。図9-28に、selectManyShuttleコンポーネントを示します。このコンポーネントで、ユーザーはMeyersを選択しており、ポップアップでこの選択に関する追加の情報が提供されています。

図9-28 selectionListenerが含まれるselectManyShuttle

selectionListenerが含まれるselectManyShuttle

この機能は、selectManyShuttleまたはselectOrderShuttleコンポーネントにクライアント・リスナーを追加し、このイベントを処理するJavaScriptメソッドを作成して実装します。JavaScriptコードは、ユーザーがリストから項目を選択すると実行されます。イベントのクライアント・リスナーの詳細は、3.2項「クライアント・イベントのリスニング」を参照してください。

選択イベントを処理するシャトル・コンポーネントにクライアント・リスナーを追加する方法:

  1. コンポーネント・パレットの「操作」セクションからクライアント・リスナーをドラッグし、シャトル・コンポーネントの子としてドロップします。

  2. 「クライアント・リスナーの挿入」ダイアログで、「メソッド」フィールドに関数名(次の手順でこの関数を実装します)を入力し、タイプ・ドロップダウンから「propertyChange」を選択します。

    たとえば、関数としてshowDetailsを入力した場合、JDeveloperにより、例9-5に太字で示されたコードが入力されます。

    例9-5 選択を登録するためのclientListenerの使用

    <af:selectManyShuttle value="#{demoInput.manyListValue1}"
         valuePassThru="true" ...>
         <af:clientListener type="propertyChange" method="showDetails"/>
         <af:selectItem label="coffee" value="bean" />
          ...
    </af:selectManyShuttle>
    

    このコードにより、showDetails関数は、プロパティ値が変更されるたびにコールされます。

  3. JavaScriptで、前の手順で入力された関数を実装します。この関数により、次の操作が実行されます。

    • イベントのソースを取得して、シャトル・コンポーネントを取得します。

    • クライアントJavaScript APIコールを使用して、選択した項目の情報を取得します。

例9-6では、AdfShuttleUtils.getLastSelectionChangeをコールして、最後に選択された項目の値が取得されています。

例9-6 選択の処理に使用されるJavaScriptメソッドshowDetailsのサンプル

function showDetails(event)
{
  if(AdfRichSelectManyShuttle.SELECTION == event.getPropertyName())
  {
    var shuttleComponent = event.getSource();
    var lastChangedValue =    AdfShuttleUtils.getLastSelectionChange(shuttleComponent, event.getOldValue());
    var side = AdfShuttleUtils.getSide(shuttleComponent, lastChangedValue);
    if(AdfShuttleUtils.isSelected(shuttleComponent, lastChangedValue))
    {
      //do something...
    }
    else
    {
      //do something else
    }
    if(AdfShuttleUtils.isLeading(shuttleComponent, lastChangedValue))
    {
      //queue a custom event (see serverListener) to call a java method on the server
    }
  }
}

9.8 richTextEditorコンポーネントの使用方法

richTextEditorコンポーネントは、書式設定されたテキストを使用できる入力フィールドを提供します。ラベル、テキストおよびメッセージもサポートされています。ユーザーは、フォント名、サイズ、スタイルの変更、順序付けられたリストの作成、およびテキストの両端の調整を実行でき、その他の様々な機能も使用できます。richTextEditorコンポーネントは、HTMLソース・ファイルの編集にも使用できます。2つのコマンド・ボタンを使用して、標準の書式設定されたテキストの編集とHTMLソース・ファイルの編集を相互に切り替えられます。図9-29に、標準のリッチ・テキスト編集モードのリッチ・テキスト・エディタ・コンポーネントを示します。

図9-29 標準の編集モードのrichTextEditorコンポーネント

編集モードのrichTextEditorコンポーネント

図9-30に、ソース・コード編集モードのエディタを示します。

図9-30 ソース編集モードのrichTextEditor

ソース・モードのrichTextEditor

次にサポートされているその他の機能を示します。

リッチ・テキスト・エディタの値(入力されたテキスト)は、整形式XHTMLフラグメントです。値の書式設定を可能にするために、ブラウザ固有の要件で値の一部が変更される場合があります。また、セキュリティ上の理由から、スクリプト関連タグや属性などの一部の機能が削除されます。このコンポーネントにより、ユーザーによる最小限の変更のみが記録されるという保証はありません。エディタでXHTMLドキュメントを編集しているため、次の要素が変更される可能性があります。

エディタでサポートされているのは、次の例外を除いて4つのHTMLタグのみです。

richTextEditorコンポーネントでは、コンテンツを取得するタグ(appletiframeobjectimgおよびaなど)もサポートされています。ブラウザで許可されているのは同じドメインのコンテンツとの対話のみであるため、iframeタグの場合は、コンテンツがページのその他の部分と対話できないようにする必要があります。ただし、ページのこの部分はアプリケーションの管理外です。

richTextEditorコンポーネントではpxemなどのフォント単位はサポートされていませんが、HTML仕様に説明されているように1〜7のフォント・サイズはサポートされています。埋込みタグや未知のタグ(<foo>など)はサポートされていません。

クライアント側では、richTextEditorコンポーネントで、getValueおよびsetValueメソッドがサポートされていません。クライアント上のコンポーネントの値が、サーバー上の値と同一であるという保証はありません。そのため、richTextEditorでは、クライアント側のコンバータおよびバリデータがサポートされていません。それでも、サーバー側のコンバータおよびバリデータは機能します。

リッチ・テキスト・エディタでは、ValueChangeEventおよびAttributeChangeEventイベントが送信されます。必要に応じて、これらのイベント用にvalueChangeListenerおよびattributeChangeListenerハンドラを作成します。

コマンド・コンポーネントと連携して、richTextEditorコンポーネントに特定のテキストを挿入するrichTextEditorInsertBehaviorタグも構成できます。入力するテキストには、簡単な文字列、またはマネージドBeanなどに保持されている事前フォーマット済テキストを指定できます。

richTextEditorコンポーネントを追加する手順:

  1. コンポーネント・パレットからページにリッチ・テキスト・エディタ・コンポーネントをドラッグ・アンド・ドロップします。

  2. プロパティ・インスペクタの「共通」セクションを開き、value属性を設定します。

  3. プロパティ・インスペクタの「外観」セクションを開き、次の設定を行います。

    • rows: 表示される文字の概数で編集ウィンドウの高さを指定します。

    • columns: 表示される文字の概数で編集ウィンドウの幅を指定します。

    • label: コンポーネントのラベルを指定します。

  4. 「動作」セクションを開き、次の設定を行います。

    • editMode: WYSIWYGまたはソース・モードを使用してエディタを表示するかどうかを選択します。

    • contentDelivery: コンポーネントが最初にレンダリングされる際に、エディタ内のデータをフェッチするかどうかを指定します。contentDelivery属性の値がimmediateの場合、レンダリングされる際に、データがフェッチされてコンポーネントに表示されます。値がlazyに設定されている場合は、データがフェッチされて後続のリクエスト中にクライアントに送信されます。詳細は、10.1.1項「コンテンツの配信」を参照してください。


ヒント:

richTextEditorコンポーネントの幅は、全幅または100%に設定できます。ただし、これが確実に機能するのは、エディタがジオメトリ管理の親コンポーネントに配置されている場合のみです。panelFormLayoutまたはpanelGroupLayoutなどの配置レイアウト・コンテナに配置されていると、機能しない場合があります。詳細は、8.2.1項「ジオメトリ管理およびコンポーネントの拡大」を参照してください。

9.8.1 richTextEditorコンポーネントへのテキストの挿入機能の追加方法

richTextEditorコンポーネントにテキストを挿入できるようにするには、テキストの挿入に使用されるコマンド・コンポーネントの子としてrichTextEditorInsertBehaviorタグを追加します。

テキスト挿入動作を追加する手順:

  1. 9.3.1項「inputTextコンポーネントの追加方法」の説明に従い、richTextEditorコンポーネントを作成します。clientComponent属性をtrueに設定します。

  2. テキストを挿入するためにユーザーがクリックするコマンド・コンポーネントを追加します。手順は、18.2.1項「コマンド・ボタンおよびコマンド・リンクの使用方法」を参照してください。

  3. コンポーネント・パレットの「操作」セクションを開き、「リッチ・テキスト・エディタの挿入動作」をコマンド・コンポーネントの子としてドラッグ・アンド・ドロップします。

  4. リッチ・テキスト・エディタの挿入動作ダイアログで、次の内容を入力します。

    • for: ドロップダウン矢印を使用して「編集」を選択し、テキストを挿入するrichTextEditorコンポーネントに移動して選択します。

    • value: 挿入するテキストの値を入力します。静的テキストを挿入する場合は、そのテキストを入力します。ユーザーが別のコンポーネントの値(selectOneChoiceコンポーネントの値など)を挿入できるようにする場合は、その値に解決されるEL式を入力します。ユーザーに事前フォーマット済テキストを入力させる場合は、そのテキストに解決されるEL式を入力します。たとえば、例9-7は、demoInputマネージドBeanの属性の値としての事前フォーマット済テキストを示しています。

      例9-7 マネージドBeanの事前フォーマット済テキスト

      private static final String _RICH_INSERT_VALUE =
        "<p align=\"center\" style=\"border: 1px solid gray;
              margin: 5px; padding: 5px;\">" +
        "<font size=\"4\"><span style=\"\">Store Hours</span></font><br/>\n" +
        "<font size=\"1\">Monday through Friday 'til 8:00 pm</font><br/>\n" +
        "<font size=\"1\">Saturday &amp; Sunday 'til 5:00 pm</font>" +
        "</p>";
      

      例9-8に、テキストがrichTextEditorInsertBehaviorタグからどのように参照されるかを示します。

      例9-8 richTextEditorInsertBehaviorタグの使用

      <af:richTextEditor id="idRichTextEditor" label="Rich text value"
                         value="#{demoInput.richValue2}"/>
      . . .
      </af:richTextEditor>
      <af:commandButton text="Insert Template Text">
        <af:richTextEditorInsertBehavior for="idRichTextEditor"
                                         value="#{demoInput.richInsertValue}"/>
      </af:commandButton>
      
  5. デフォルトでは、コマンド・コンポーネントをクリックしてアクション・イベントがトリガーされるとテキストが挿入されます。ただし、triggerType属性のドロップダウン・メニューからイベントを選択することで、これを別のクライアント・イベントに変更できます。

9.9 ファイルのアップロード機能の使用方法

inputFileコンポーネントを使用すると、ユーザーにファイルのアップロード機能および更新機能を提供できます。このコンポーネントを使用すると、ユーザーはローカル・ファイルを選択して、サーバーの選択可能な場所にアップロードできます。サーバーからユーザーにファイルをダウンロードするには、18.3.1項「ファイルをダウンロードするためのコマンド・コンポーネントの使用方法」を参照してください。

inputFileコンポーネントにより、ファイルのアップロード時に標準のValueChangeEventイベントが送信され、ロード・プロセスが透過的に管理されます。inputFileコンポーネントのvalueプロパティは、ファイルのアップロード時に、org.apache.myfaces.trinidad.model.UploadedFileクラスのインスタンスに設定されます。

アップロード・プロセスを開始するには、図9-31に示すように、コマンド・ボタンなどのアクション・コンポーネントを作成します。

図9-31 inputFileコンポーネント

inputFileコンポーネント

入力フィールドの値がnull以外の場合は、最初のロードが成功した後またはその値が初期値として指定された後に、更新ボタンを作成できます。図9-32に示されているように、このボタンは「参照」ボタンのかわりに表示されます。

図9-32 更新モードのinputFileコンポーネント

更新モードのinputFileコンポーネント

readOnlyプロパティをtrueに設定すると、特定のファイルのみをロードできるようにコンポーネントを指定することもできます。図9-33に示すように、このモードでは、指定されたファイルのみをロードできます。

図9-33 読取り専用モードのinputFileコンポーネント

読取り専用モードのinputFileコンポーネント

セキュリティ上の理由から、次の属性をクライアントから設定することはできません。

inputFileコンポーネントはh:formタグまたはaf:formタグに配置できますが、どちらの場合にも、ファイルのアップロードをサポートするためにformタグを設定する必要があります。JSFの基本的なHTML h:formを使用する場合は、enctypemultipart/form-dataに設定します。これにより、リクエストがマルチパート・リクエストになり、サーバーへのファイルのアップロードがサポートされます。ADF Facesのaf:formタグを使用している場合は、usesUploadtrueに設定します。これにより、enctypeをmultipart/form-dataに設定するのと同じ機能が実行され、ファイルのアップロードがサポートされます。

リッチ・クライアント・フレームワークでは、ファイルの一般的なアップロードが実行されます。アップロード後にファイルを処理(たとえば、xmlファイル、pdfファイルなどの処理)するには、actionListenerまたはアクション・メソッドを作成する必要があります。

inputFileコンポーネントのvalueは、org.apache.myfaces.trinidad.model.UploadedFileインタフェースのインスタンスです。このAPIを使用すると、ファイル名、MIMEタイプ、サイズだけでなく、ファイルの実際のバイト・ストリームを取得できます。


注意:

APIを使用して、ファイルのアップロード元に関するパス情報をクライアントから取得することはできません。

アップロードされたファイルは、ファイルシステムにファイルとして格納される場合もありますが、メモリーに格納される場合もあります。このAPIではこの違いが表に出ません。フィルタを使用すると、リクエストの完了後にUploadedFileコンテンツがクリーンアップされます。このため、リクエスト全体でUploadedFileオブジェクトを有効にキャッシュすることができません。ファイルを保持する必要がある場合には、リクエストが完了する前に永続記憶域にコピーする必要があります。

たとえば、例9-9に示すように、ファイルを保存するかわりに、マネージドBeanをValueChangeEventイベントへのレスポンスとして使用し、ファイルのアップロードが成功したという内容のメッセージを追加します。

例9-9 アップロード・メッセージを表示するためのvalueChangeListenerの使用

JSF Page Code ----->
<af:form usesUpload="true">
  <af:inputFile label="Upload:"
                valueChangeListener="#{managedBean.fileUploaded}"/>
  <af:commandButton text="Begin"/>
</af:form>

Managed Bean Code ---->
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import org.apache.myfaces.trinidad.model.UploadedFile;

public class ABackingBean
{
  ...
  public void fileUploaded(ValueChangeEvent event)
  {
    UploadedFile file = (UploadedFile) event.getNewValue();
    if (file != null)
    {
      FacesContext context = FacesContext.getCurrentInstance();
      FacesMessage message = new FacesMessage(
         "Successfully uploaded file " + file.getFilename() +
         " (" + file.getLength() + " bytes)");
      context.addMessage(event.getComponent().getClientId(context), message);
      // Here's where we could call file.getInputStream()
    }
  }
}

また、例9-10に示すように、値をマネージドBeanに直接バインドすることでアップロードを処理できます。

例9-10 マネージドBeanへの値のバインド

JSF Page Code ---->
<af:form usesUpload="true">
  <af:inputFile label="Upload:" value="#{managedBean.file}"/>
  <af:commandButton text="Begin" action="#{managedBean.doUpload}"/>
</af:form>

Managed Bean Code ---->
import org.apache.myfaces.trinidad.model.UploadedFile;public class AManagedBean
{
  public UploadedFile getFile()
  {
    return _file;
  }
  public void setFile(UploadedFile file)
  {
    _file = file;
  }

  public String doUpload()
  {
    UploadedFile file = getFile();
    // ... and process it in some way
  }
  private UploadedFile _file;

}

9.9.1 inputFileコンポーネントの使用方法

Javaクラスは、inputFileコンポーネントにバインドする必要があります。このクラスにより、アップロードしたファイルの値が含まれます。

inputFileコンポーネントを追加する手順:

  1. 入力ファイルの値を保持するJavaクラスを作成します。org.apache.myfaces.trinidad.model.UploadedFileインタフェースのインスタンスであることが必要です。

  2. コンポーネント・パレットからページに入力ファイル・コンポーネントをドラッグ・アンド・ドロップします。

  3. value属性を手順1で作成したクラスに設定します。

  4. ページにコマンド・コンポーネントをドラッグ・アンド・ドロップします。これは、アップロード・プロセスの開始に使用されます。

  5. コマンド・コンポーネントが選択された状態で、actionListener属性を、アップロード後にファイルを処理するリスナーに設定します。

9.9.2 一時的なファイルの格納について

ADF Facesではアップロードされるファイルが(ディスクまたはメモリーに)一時的に格納されるため、アップロード・ファイルでハード・ドライブやメモリーを一杯にしようとするDoS攻撃を未然に防ぐため、デフォルトでは、許容される着信アップロード・リクエストのサイズが制限されています。デフォルトでは、1つのリクエストで最初の100KBがメモリーに格納されます。これが一杯になると、ディスク領域が使用されます。この場合も、デフォルトでは、すべてのファイルに対し、1つのリクエストで2,000KBのディスク領域に制限されます。これらの制限を超えると、フィルタによりEOFExceptionがスローされます。

デフォルトで、ファイルはjava.io.File.createTempFile()メソッドが使用する一時ディレクトリに格納されます。これは、通常、システム・プロパティjava.io.tmpdirによって定義されます。一部のアプリケーションには明らかに不十分であるため、例9-11に示すように、3つのサーブレット・コンテキスト初期化パラメータを使用して、これらの値を構成できます。

例9-11 ファイルのアップロード・サイズおよびディレクトリを定義するパラメータ

  <context-param>
    <!-- Maximum memory per request (in bytes) -->
    <param-name>org.apache.myfaces.trinidad.UPLOAD_MAX_MEMORY</param-name>
    <!-- Use 500K -->
    <param-value>512000</param-value>
  </context-param>
  <context-param>
    <!-- Maximum disk space per request (in bytes) -->
    <param-name>org.apache.myfaces.trinidad.UPLOAD_MAX_DISK_SPACE</param-name>
    <!-- Use 5,000K -->
    <param-value>5120000</param-value>
  </context-param>
  <context-param>
    <!-- directory to store temporary files -->
    <param-name>org.apache.myfaces.trinidad.UPLOAD_TEMP_DIR</param-name>
    <!-- Use a TrinidadUploads subdirectory of /tmp -->
    <param-value>/tmp/TrinidadUploads/</param-value>
  </context-param>
  <!-- This filter is always required;  one of its functions is
          file upload. -->
  <filter>
    <filter-name>trinidad</filter-name>
    <filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class>
  </filter>

org.apache.myfaces.trinidad.webapp.UploadedFileProcessorクラス全体をtrinidad-config.xml構成ファイルの<uploaded-file-processor>要素に置き換えることで、ファイルのアップロード・プロセスをカスタマイズできます。UploadedFileProcessorクラスを置き換えると、例9-11にリストされているパラメータは無関係になり、デフォルトのUploadedFileProcessorクラスによってのみ処理されます。

<uploaded-file-processor>要素は、oracle.adf.view.rich.webapp.UploadedFileProcessorインタフェースを実装するクラスの名前である必要があります。このAPIにより、個々のアップロード・ファイルが着信リクエストから取得される際に処理され、そのコンテンツを残りのリクエストで使用できるようになります。大部分のアプリケーションは、デフォルトのUploadedFileProcessorクラスで十分ですが、大規模ファイルのアップロードをサポートする必要のあるアプリケーションでは、リクエスト中にADF Facesで一時記憶域を処理するかわりに、ファイルをただちに最終的な宛先に格納することでパフォーマンスを向上させます。