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画面のサイズは携帯電話画面のサイズより大きくなります。
  • ユーザー入力: ユーザーにとっては、PDAよりデスクトップでデータを入力した方が簡単であり、携帯電話でデータを入力するのは非常に困難です。

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

エージェント・タイプ

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

  • Agent.TYPE_DESKTOP: デスクトップやラップトップなどの画面サイズが大きいデバイス
  • Agent.TYPE_PDA: PDAなどの画面サイズが中くらいのデバイス
  • Agent.TYPE_PHONE: 携帯電話やポケベルなどの画面サイズが小さいデバイス

開発者は特定のエージェント・タイプを念頭に置いてページを記述します。 実際は多くのページが複数のエージェント・タイプで稼働しますが、これはいつもあてはまるわけではありません。 指定されたエージェント・タイプについて、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でサポートされていない属性または子(あるいはその両方)すべての情報が含まれています。

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

  • AddTableRow
  • ApplicationSwitcher
  • BrowseMenu
  • ContentContainer
  • FileUpload
  • HGrid
  • Shuttle
  • SideBar
  • SideNav
  • StyledItem
  • StyledList
  • SubTabBar
  • TotalRow
  • Tree

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

  • Footer
  • QuickLinks
  • StyleSheet

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

  • HideShow
  • HideShowHeader
  • SubTabLayout
  • Tip

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

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

  • DateField: アプリケーションが個別のカレンダ・ページに移動する必要があります。 このため、PDAでは、DateFieldは、クラスoracle.cabo.servlet.event.mobile.DateEventHandlerで処理可能な日付イベントを送信します。UIXサーブレットを使用しないPDAの場合、ユーティリティ・クラスoracle.cabo.servlet.event.mobile.DateEventUtilsを使用します。次に例を示します。
    <ctrl:page xmlns="http://xmlns.oracle.com/uix/ui"
               xmlns:ctrl="http://xmlns.oracle.com/uix/controller"
               expressionLanguage="el">
      <ctrl:content>
        <form name="demoForm">
          <contents>
            <messageDateField required="yes" name="p_date" prompt="Date" value="${uix.eventResult.p_date}"/>
          </contents>
        </form>
      </ctrl:content>
      <ctrl:handlers>
       <ctrl:event name="date cancel" >
         <ctrl:instance class="oracle.cabo.servlet.event.mobile.DateEventHandler"
                        method="getEventHandler" />
       </ctrl:event>
      </ctrl:handlers>
    </ctrl:page>
    
  • LovInput: アプリケーションが個別のListOfValuesページとの間で移動する必要があります。 PDAでは、LovInputは、destination属性の値が含まれる追加のuriパラメータとともにlovFilterイベントを送信します。 サーバー上のこの宛先にフォワードする必要があります。
  • ListOfValues: アプリケーションがLovInputページとの間で移動する必要があります。 サーバー上のlistOfValuesページへフォワードしたり、このページからlovInputページへのリダイレクトする必要があります。 フォワード先およびリダイレクト先はアプリケーションによって異なります。 PDAでは、ListOfValuesページの検索はサポートされていません。
次に示す他のコンポーネントにも大きい相違点があります。
  • Frame: 所有ページとしてレンダリング。
  • FrameBorderLayout: フレームへのリンクのリスト。
  • LovField: ボタンのないテキストフィールド。
  • MessageBox: 索引付けされた子をレンダリングしない。
  • PageLayout: 多数の子がサポートされない。

パラメータのデコード

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に設定する必要があります。