ナビゲーション・ヘッダーをスキップ
Oracle ADF UIX開発者ガイド 目次へ
目次
前のページへ戻る
前へ
次のページへ進む
次へ

20. ADF UIXでのモバイル・アプリケーションの記述

Oracle ADF UIXの目標の1つは、異なるデバイスに同じページ記述テクノロジを提供することです。 このトピックでは、UIXを使用してモバイル・アプリケーションを記述する方法を説明します。

UIXは現在、Pocket PCのInternet Explorer、Palm OSのPalm Web Pro 3.0およびPalm OSのBlazer 3.0でサポートされています。 携帯電話またはポケベルは現在サポートされていません。 これらは将来iAS Wirelessと組み合せてサポートされる予定です。

ここでは、次の項目について説明します。

概要

UIXによるモバイル・アプリケーションの記述方法は、UIXによるデスクトップ・アプリケーションの記述方法とほとんど同じです。 次の例でこれを示します。

<ctrl:page xmlns="http://xmlns.oracle.com/uix/ui"
           xmlns:ctrl="http://xmlns.oracle.com/uix/controller"
           expressionLanguage="el">

  <ctrl:content xmlns:ui="http://xmlns.oracle.com/uix/ui">

   <form name="demoForm"
         xmlns="http://xmlns.oracle.com/uix/ui">
     <contents>
       <pageLayout title="New Expense">
         <privacy>
           <link text="Privacy"
                 destination="http://www.oracle.com"/>
         </privacy>
         <about>
           <link text="About"
                 destination="http://www.oracle.com"/>
         </about>
         <globalButtons>
           <globalButtonBar>
             <contents>
               <globalButton text="Home"
                             destination="http://www.oracle.com"/>
               <globalButton text="Portal"
                             destination="http://www.oracle.com"/>
             </contents>
           </globalButtonBar>
         </globalButtons>
         <corporateBranding>
           <image source="images/pdaOracle.gif"/>
         </corporateBranding>
         <pageButtons>
           <pageButtonBar>
             <contents>
               <submitButton text="OK" event="error"/>
               <submitButton text="Cancel"/>
               <submitButton text="New Expense"/>
             </contents>
           </pageButtonBar>
         </pageButtons>
         <contents>
           <labeledFieldLayout>
             <contents>
               <messageTextInput required="yes"
                                 id="amount"
                                 name="amount"
                                 prompt="Amount"/>
               <messageDateField required="yes"
                                 name="date"
                                 prompt="Date" />
               <inlineMessage  prompt="Have Receipt">
                 <contents>
                   <flowLayout>
                     <contents>
                       <radioGroup name="receipt">
                         <childData>
                           <option text="Yes" value="yesReceipt"/>
                           <option text="No" value="noReceipt"/>
                         </childData>
                       </radioGroup>
                     </contents>
                   </flowLayout>
                 </contents>
               </inlineMessage>
             </contents>
           </labeledFieldLayout>
         </contents>
       </pageLayout>
     </contents>
   </form>
 </ctrl:content>
</ctrl:page>
次のイメージは、デスクトップ・ブラウザとPDAでページがどのように表示されるか示しています。

図20-1: デスクトップ・ブラウザ
UIX XML rendered in web browser

図20-2: PDAブラウザ
UIX XML rendered in PDA

UIの考慮

異なるデバイスに同じページ記述テクノロジを提供することはUIXの目標の1つですが、これは、開発者が「一度書けばどこでも動く」ことを可能にするという意味ではありません。 その理由を次に示します。

PDA向けに設計されたページが比較的シンプルならばそれが最適に見え、デスクトップ向けに設計されたページはPDAに対しては大きすぎるように見えるのは、明らかです。 この例で示したような理由から、UIXは、異なるデバイスに同じUIXページを使用するのではなく、異なるデバイスに1つのページ記述テクノロジを提供することを目標にしているのです。

エージェント・タイプ

前述した「概要」セクションの例は、リクエストを行うデバイスによって出力が変更されることを示しています。たとえば、デスクトップ・ブラウザではページ・ボタンが繰り返され右寄せされていますが、PDAでは1回レンダリングされて左寄せされています。 デバイスは次の3つのタイプにグループ分けされます。

開発者は特定のエージェント・タイプを念頭に置いてページを記述します。 実際は多くのページが複数のエージェント・タイプで稼働しますが、これはいつもあてはまるわけではありません。 指定されたエージェント・タイプについて、Beanがサポートされていない場合や、特定の属性または子がサポートされていない場合もあります。 一般に、デスクトップ・マシンでサポートされているものはPDAでサポートされているもののスーパーセットであり、PDAでサポートされているものは携帯電話でサポートされているもののスーパーセットです。 これは、一般にデスクトップ・マシンの機能はPDAの機能のスーパーセットであり、PDAの機能は携帯電話の機能のスーパーセットであるという事実を反映しています。

開発者は<agent>タグによってUIX XMLでエージェント・タイプを決定します。 次に例を示します。


<ctrl:page xmlns="http://xmlns.oracle.com/uix/ui"
           xmlns:ctrl="http://xmlns.oracle.com/uix/controller">
  <ctrl:content>
    <dataScope>
      <contents>
        <flowLayout>
         <contents>
           <styledText styleClass="OraInstructionText" text="You are looking at this on a "/>
           <styledText styleClass="OraInstructionText" >
             <boundAttribute name="text">
               <if>
                 <agent type="desktop"/>
                 <fixed text="desktop or laptop."/>
                 <if>
                   <agent type="pda"/>
                   <fixed text="pda."/>
                   <fixed text="um, well, let's see, not a desktop machine, laptop, or pda. You're wild!"/>
                 </if>
               </if>
             </boundAttribute>
           </styledText>
          </contents>
        </flowLayout>
      </contents>
    </dataScope>
  </ctrl:content>
</ctrl:page>

ターゲットとしてのPDA

スクリプト

開発者はJavaScriptサポートに依存することはできません。 PDAブラウザはJavaScriptをサポートする方向ですが、多くのブラウザはまだサポートしていません。スクリプトBeanはJavaScript対応ブラウザにおけるユーザーの操作性を強化するためにサポートされていますが、スクリプトが有効でないためにアプリケーションがエラーを起こすことは回避すべきです。

通常これは、クライアント側の検証を行う場合にJavaScriptに依存しないことを意味します。 開発者はいつもサーバー側の検証を行っているはずですが、これはモバイル・アプリケーションにとって絶対的に必要なものです。

コンポーネントのサポート

次に示すリストは、デスクトップ・マシンとPDAでサポートされているものの違いを表しています。 これは完全なリストではありません。 コンポーネント固有のドキュメントには、PDAでサポートされていない属性または子(あるいはその両方)すべての情報が含まれています。

次のコンポーネントはサポートされていません。 コンポーネントもその子もレンダリングされず、警告がエラー・ログに記述されます。

次のコンポーネントは無視されます。 これらはページの正しい動作に不可欠ではないため、警告はログに記述されません。

次のコンポーネントはそれ自身では何もレンダリングしませんが、索引付けされた子をレンダリングします。

次のコンポーネントはPDAでサポートされています。 ただしそれらの動作は、言及する価値が十分にあるほど、デスクトップ・マシンでの動作とはかけ離れています。

ほとんどのPDAブラウザでは複数のウィンドウを使用することはできません。そのため、PDAでは、次のコンポーネントでページ・ナビゲーションを行います。

次に示す他のコンポーネントにも大きい相違点があります。

パラメータのデコード

PDAの制限によって、複数のパラメータが1つのパラメータとしてエンコードされる場合があるため、デコードが必要になります。 UIXサーブレットを使用している開発者は、自動的にパラメータがデコードされるため、この点を心配する必要はありません。 それ以外の場合、開発者にはパラメータをデコードするためのいくつかのオプションがあります。

javax.servlet.ServletRequestを使用している場合、開発者はこれを使用してoracle.cabo.share.data.ServletRequestParametersのインスタンスを作成し、ServletRequestで見つかったパラメータにアクセスする任意のメソッドをそのインスタンスでコールします。 たとえば、ServletRequestのインスタンスが「request」と仮定するとコードは次のようになります。


     String fooValue = request.getParameter("foo");
     ....
これは、次のコードで置き換えられます。

     ServletRequestParameters params = new ServletRequestParameters(request)
     String fooValue = params.getParameter("foo");
     ....
「request」を使用してjava.util.Dictionaryを取得する方法もあります。 次に例を示します。

     Dictionary d = ServletRequestParameters.createRequestDictionary(request);
     String fooValue = (String)d.get("foo");
開発者はjava.util.Dictionaryで開始してDictionaryが返されるようにすることもできます。 たとえば、Dictionaryのインスタンスが「dictionary」と仮定します。

     Dictionary d = ServletRequestParameters.createRequestDictionary(dictionary);
     String fooValue = (String)d.get("foo");

HTTPキャッシュ・ヘッダー

PalmのWeb Browser 2.0は、HTTPレスポンスとともにキャッシュ情報が送信されない場合、キャッシュされたバージョンのページを使用します。 これは、サポートされている他のどのブラウザとも異なります。他のブラウザでは、キャッシュ情報が送信されない場合にキャッシュされたバージョンが使用されることはありません。 UIXサーブレットを使用していない開発者は、ページが変更された場合、Cache-ControlというHTTPレスポンス・ヘッダーをno-cacheに設定する必要があります。