ヘッダーをスキップ

Oracle Application Server アプリケーション開発者ガイド
10gリリース2(10.1.2)
B15629-01
目次
目次
索引
索引

戻る 次へ

8
ワイヤレス・クライアントのサポート

OracleASのワイヤレス機能を使用すると、ワイヤレス・クライアントからアプリケーションにアクセスできるようになります。ワイヤレス・クライアントでは、HTTPとは異なるプロトコルおよびHTML以外のマークアップ言語を使用するため、ワイヤレス・クライアントをサポートするには、サンプル・アプリケーションに変更を加える必要があります。

この章の項目は次のとおりです。

8.1 アプリケーションに加える必要のある変更

MVC設計を使用しているアプリケーションの場合、ワイヤレス・クライアントをサポートするためにアプリケーションに加える必要のある変更はそれほど多くありません。

8.2 ワイヤレス・クライアント向けのプレゼンテーション・データ

ワイヤレス・クライアントでは標準化されたマークアップ言語を使用しないため、ワイヤレス・クライアント向けのプレゼンテーション・データを一般的なDTD仕様に基づくXMLで作成する必要があります。このXMLは、OracleASのワイヤレス機能によって、そのワイヤレス・クライアントで処理できる特定のマークアップ言語に変換されます。

HTMLの場合と同様に、アプリケーションでは、JSPファイルまたは静的ファイルからXMLを生成できます。サンプル・アプリケーションでは、プレゼンテーション・データに動的データが含まれるため、JSPファイルに含めます。

関連項目

第5章「プレゼンテーション・ページの作成」 

ワイヤレス・クライアント向けの汎用XMLはSimpleResult DTDに基づいています。

関連項目

DTDおよびその要素の使用方法の詳細は、『Oracle Application Server Wireless開発者ガイド』を参照してください。 

8.2.1 ワイヤレス・デバイス用アプリケーションの画面

図8-1図8-3に、サンプル・アプリケーションがシミュレータ上で動作する様子を示します。ワイヤレス・クライアントでアプリケーションが動作する様子は、デスクトップ・ブラウザのアプリケーションの場合と類似しています。

図8-1    ワイヤレス・デバイス用アプリケーションの画面(1/3)


画像の説明

画面1では、ワイヤレス・クライアントで動作可能なアプリケーションのリストが表示されています。これは、基本的には、次のディレクトリにあるファイルのリストになります。

$OMSDK_HOME/oc4j_omsdk/omsdk/j2ee/applications/pmsdk/apps/

$OMSDK_HOMEは、OracleAS Wireless SDKのホーム・ディレクトリです。

画面2は、サンプル・アプリケーションの開始点を示しています。これは、empbft.xmlファイルです。このファイルによって、ユーザーが従業員IDを入力するテキスト入力フィールドが表示されます。

画面3は、問合せの結果を示しています。ワイヤレス・クライアントにはスクロールバーがあります。ユーザーは、スクロールバーを使用してページを下方にスクロールし、すべての情報を表示できます。給付項目を追加または削除するには、この画面の「Menu」ボタンを選択します。

図8-2    ワイヤレス・デバイス用アプリケーションの画面(2/3)


画像の説明

画面4は、メニューを示しています。「Add Benefits」、「Remove Benefits」「Query Other Employee」などのオプションがあります。

画面5は、ユーザーが追加可能な給付項目のリストを示しています。リクエストを発行するには、追加する給付項目を1つ選択して、「OK」を選択します。ワイヤレス・クライアントで追加または削除する項目を選択する場合、選択できる項目は1回につき1つのみであることに注意してください。

関連項目

「ワイヤレス・デバイス用アプリケーションとブラウザ用アプリケーションの相違」 

画面6は、給付項目の追加処理が正常に終了したことをユーザーに通知しています。この画面にも「Menu」オプションがあります。

図8-3    ワイヤレス・デバイス用アプリケーションの画面(3/3)


画像の説明

画面7は、メニューを示しています。「Add More Benefits」、「Remove More Benefits」、「Query Same Employee」および「Query Other Employee」の4つのオプションがあります。

画面8は、ユーザーが給付項目を追加した後の給付項目リストを示しています。

画面9は、画面3と類似しています。ここでは、ページを下方にスクロールして、ユーザーの給付項目リストを表示しています。

8.2.2 ワイヤレス・デバイス用アプリケーションとブラウザ用アプリケーションの相違

ブラウザ用のアプリケーションでは、ユーザーは複数の給付項目を選択して、追加または削除することができます。一方、ワイヤレス・デバイスでは、1回に選択できるのは1つの項目のみです。ユーザーが複数の項目を追加または削除できるように、アプリケーションには、「Add More Benefits」および「Remove More Benefits」というオプションが用意されています。これによって、ユーザーは別の給付項目を選択して追加または削除することができます(画面7)。これらのオプションは、ブラウザ用のアプリケーションでは必要でないため、使用できません。

これらのオプションは、successWireless.jspから使用できます。アプリケーションで1つの給付項目の追加または削除が正常に終了すると、このファイルが表示されます(画面6)。この画面には、処理が正常に終了したことを通知するメッセージが表示されます。画面の「Menu」を選択すると、「Add More Benefits」および「Remove More Benefits」オプションが表示されます。

// from successWireless.jsp
<SimpleText>
   <SimpleTextItem>Operation completed successfully.</SimpleTextItem>
   <Action label="Add More Benefits" type="SOFT1" task="GO"
target="/empbft/controller?action=addBenefitToEmployee&amp;clientType=wireless&amp;empI
D=<%=empId%>"></Action>

   <Action label="Remove More Benefits" type="SOFT1" task="GO"
target="/empbft/controller?action=removeBenefitFromEmployee&amp;clientType=wireless&amp
;empID=<%=empId%>"></Action>

   <Action label="Query Same Employee" type="SOFT1" task="GO"
target="/empbft/controller?action=queryEmployee&amp;clientType=wireless&amp;empID=<%=em
pId%>"></Action>

   <Action label="Query Other Employee" type="SOFT1" task="GO"
target="/empbft/controller?action=queryEmployee&amp;clientType=wireless"></Action>
</SimpleText>

ユーザーが「Add More Benefits」オプションまたは「Remove More Benefits」オプションを選択した場合のリクエストは、1つの給付項目を追加または削除するときのリクエストと類似しています。このリクエストには、actionパラメータ、empIDパラメータおよびclientTypeパラメータが含まれます。アプリケーションによってデータベースへの問合せが実行され、更新された給付項目リストが表示されます(画面8)。

8.3 ワイヤレス・クライアント向けのプレゼンテーション・データの格納場所について

ワイヤレス・クライアント向けのXMLプレゼンテーション・データは、HTMLを生成するJSPファイルと同じファイルに作成するか、または別のJSPファイルに作成することができます。プレゼンテーション・データを入れた場所にかかわらず、リクエストがワイヤレス・クライアントまたはデスクトップ・クライアントのいずれから発信されたものであるかをチェックする必要があります。

8.3.1 リクエストの発信元のチェック

リクエストの発信元をチェックするには、ワイヤレス・クライアントであることを識別するためのパラメータをリクエストに挿入します。パラメータとその値を含めるときには、非表示の入力フォーム要素を使用できます。

サンプル・アプリケーションでは、clientTypeというパラメータ名およびwirelessというパラメータ値を使用して、ワイヤレス・クライアントを識別します。ワイヤレス・クライアントからのリクエストには、このパラメータが含められます。たとえば、このアプリケーションの中でワイヤレス・クライアントに最初に表示されるempbft.xmlファイルでは、次のようになっています。

// empbft.xml
<?xml version = "1.0" encoding = "ISO-8859-1"?>
<SimpleResult>
  <SimpleContainer>
    <SimpleForm title="Query Employee" target="/empbft/controller">
       <SimpleFormItem name="empID" format="*N">Enter Emp ID: </SimpleFormItem>
       <SimpleFormItem name="action" type="hidden" value="queryEmployee" />
       <SimpleFormItem name="clientType" type="hidden" value="wireless" />
    </SimpleForm>
  </SimpleContainer>
</SimpleResult>

これにより、他のパラメータの場合と同様にして、サーブレットまたはJSPにclientTypeパラメータがあるかどうかをチェックできます。

サーブレットの場合

String client = req.getParameter(SessionHelper.CLIENT_TYPE_PARAMETER);
boolean wireless =
          client != null && client.equals(SessionHelper.CLIENT_TYPE_WIRELESS);

JSPの場合

<%
  String client = request.getParameter(SessionHelper.CLIENT_TYPE_PARAMETER);
  boolean wireless =
            client != null && client.equals(SessionHelper.CLIENT_TYPE_WIRELESS);
%>

8.3.2 プレゼンテーション・データを同じJSPファイルに入れる場合

この方法を使用する場合は、リクエストの発信元(リクエストがワイヤレス・クライアントまたはデスクトップ・クライアントのいずれから発信されたものであるか)をJSPファイル自体でチェックします。これにより、発信元に応じてHTMLまたはXMLを生成することができます。次に、例を示します。

// import classes for both wireless and browsers
<%@ page import="java.util.*" %>
<%@ page import="empbft.component.employee.ejb.*" %>
<%@ page import="empbft.component.employee.helper.*" %>
<%@ page import="empbft.util.*" %>

// check the client type that sent the request
<%
  String client = request.getParameter(SessionHelper.CLIENT_TYPE_PARAMETER);
  boolean wireless = ( (client != null) &&
                 client.equals(SessionHelper.CLIENT_TYPE_WIRELESS) );
  if (wireless)
  {
%>
    <?xml version = "1.0" encoding = "ISO-8859-1"?>
    <%@ page contentType="text/vnd.oracle.mobilexml; charset=ISO-8859-1" %>
    <SimpleResult>
      <SimpleContainer>
        <SimpleForm title="Query Employee" target="/empbft/controller">
           <SimpleFormItem name="empID" format="*N">Enter Emp ID:
                                                       </SimpleFormItem>
           <SimpleFormItem name="action" type="hidden" value="queryEmployee" />
           <SimpleFormItem name="clientType" type="hidden" value="wireless" />
        </SimpleForm>
      </SimpleContainer>
    </SimpleResult>
<%
  } else {
%>
    <%@ page contentType="text/html;charset=ISO-8859-1"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <link rel="stylesheet" href="css/blaf.css" type="text/css">
    <title>Query Employee</title>
    </head>
    <body>
    <h2>Employee Benefit Application</h2>
<%
  String empId = request.getParameter(SessionHelper.EMP_ID_PARAMETER);
  if (empId == null)
  {
%>
<h4>Query Employee</h4>
<form method=get action="/empbft/controller">
<input type=hidden name=action value=queryEmployee>
<table>
  <tr>
    <td>Employee ID:</td>
    <td><input type=text name=empID size=4></td>
    <td><input type=submit value="Query Employee"></td>
  </tr>
</table>
<h4>Actions</h4>
<a href="/empbft/">Home</a><br>
</form>
<%
  } else {
    int id = Integer.parseInt(empId);
    EmployeeManager mgr = SessionHelper.getEmployeeManager(request);
    EmployeeModel emp = mgr.getEmployeeDetails(id);
%>
<h4>Employee Details</h4>
<table>
<tr><td>Employee ID: </td><td colspan=3><b><%=id%></b></td></tr>
<tr><td>First Name: </td><td><b><%=emp.getFirstName()%></b></td><td>Last Name: 
</td><td><b><%=emp.getLastName()%></b></td></tr>
<tr><td>Email: </td><td><b><%=emp.getEmail()%></b></td><td>Phone Number: 
</td><td><b><%=emp.getPhoneNumber()%></b></td></tr>
<tr><td>Hire Date: </td><td><b><%=emp.getHireDate().toString()%></b></td><td>Job: 
</td><td><b><%=emp.getJobId()%></b></td></tr>
</table>
<h4>Elected Benefits</h4>
<table>
  <%
    Collection benefits = emp.getBenefits();
    if (benefits == null || benefits.size() == 0) {
  %>
      <tr><td>None</td></tr>
  <%
    } else {
      Iterator it = benefits.iterator();
      while (it.hasNext()) {
        BenefitItem item = (BenefitItem)it.next();
  %>
        <tr><td><%=item.getName()%></td></tr>
  <%
      } // end of while
    } // end of if
  %>
</table>
<h4>Actions</h4>
<table>
<tr><td><a href="/empbft/controller?empID=<%=id%>&amp;action=addBenefitToEmployee">Add 
benefits to the employee</a></td></tr>
<tr><td><a 
href="/empbft/controller?empID=<%=id%>&amp;action=removeBenefitFromEmployee">Remove 
benefits from the employee</a></td></tr>
<tr><td><a href="/empbft/controller?action=queryEmployee">Query other 
employee</a></td></tr>
<tr><td><a href="/empbft/">Home</a><br></td></tr>
</table>
<%
    } // end of else (empId != null)
%>
</body>
</html>
<%
} // end of else (wireless)
%>

8.3.3 プレゼンテーション・データを別のファイルに入れる場合

別のファイルを使用する場合は、ActionHandlerのサブクラスを編集して、リクエストの発信元をチェックし、リクエストを適切なJSPファイルに転送できるようにします。次に、例を示します。

public void performAction(HttpServletRequest req, HttpServletResponse res)
    throws ServletException
{
   String client = req.getParameter(SessionHelper.CLIENT_TYPE_PARAMETER);
   boolean wireless =
           client != null && client.equals(SessionHelper.CLIENT_TYPE_WIRELESS);
   String empIdString = req.getParameter(SessionHelper.EMP_ID_PARAMETER);
   boolean validEmpId = true;
   if (empIdString != null) {
      int empId = Integer.parseInt(empIdString);
      validEmpId = (empId >= 100 && empId <= 206) ? true : false;
   }

   // Forward to appropriate page
   if (wireless) {
      if (validEmpId) {
         forward(req, res, "/queryEmployeeWireless.jsp");
      } else {
         forward(req, res, "/errorWireless.jsp");
      }
   } else {
      if (validEmpId) {
         forward(req, res, "/queryEmployee.jsp");
      } else {
         forward(req, res, "/error.jsp");
      }
   }
}

CLIENT_TYPE_PARAMETERの値は、SessionHelperclientTypeと定義されています。clientTypeは、パラメータの名前です。

CLIENT_TYPE_WIRELESSの値は、SessionHelperwirelessと定義されています。これは、パラメータの値です。

このパラメータおよびパラメータ値は、empbft.xmlに定義されています。このファイルは、ワイヤレス・デバイス用のID入力ページに対応しています。これによって、ユーザーはテキスト入力フィールドに番号を入力できます。

// empbft.xml
<?xml version = "1.0" encoding = "ISO-8859-1"?>
<SimpleResult>
  <SimpleContainer>
    <SimpleForm title="Query Employee" target="/empbft/controller">
       <SimpleFormItem name="empID" format="*N">Enter Emp ID: </SimpleFormItem>
       <SimpleFormItem name="action" type="hidden" value="queryEmployee" />
       <SimpleFormItem name="clientType" type="hidden" value="wireless" />
    </SimpleForm>
  </SimpleContainer>
</SimpleResult>

8.4 ワイヤレス・クライアント向けのJSPファイルのヘッダー情報

ワイヤレス・クライアントをサポートするには、ワイヤレス・クライアント向けのJSPファイルのヘッダーにいくつかの変更を加える必要があります。

8.4.1 XMLタイプの設定

JSPファイルの先頭に、そのファイルがXMLファイルであることを指定する次の行を挿入する必要があります。

<?xml version = "1.0" encoding = "ISO-8859-1"?>

8.4.2 コンテンツ・タイプの設定

ワイヤレス・クライアント向けのJSPファイルの先頭に、レスポンスのコンテンツ・タイプおよびキャラクタ・セットを設定する次の行を挿入する必要があります。

<%@ page contentType="text/vnd.oracle.mobilexml; charset=ISO-8859-1" %>

JSPのcontentTypeのデフォルト値はtext/htmlであり、ワイヤレス・クライアントに対応していないため、このように設定する必要があります。

トランスフォーマでは、ページをワイヤレス・クライアントが解釈できるデータに変換するときに、text/vnd.oracle.mobilexmlという値を使用します。

8.5 処理の詳細について

OracleASに送られるワイヤレス・クライアントからのリクエストは、ユーザー・エージェント・フィールドにワイヤレス・デバイスの名前が含まれることを除き、デスクトップ・ブラウザからのリクエストと同様です。ただし、ワイヤレス・デバイスからのリクエストがOracleASに到達する方法は異なります。ワイヤレス・デバイスからのリクエストは、最初にゲートウェイ(WAP、Voice、SMSなど)を通過します。そこで、リクエストはHTTPプロトコルに変換されます。その後、リクエストはゲートウェイからOracleAS Wirelessにルーティングされます。

OracleAS Wirelessでは、ワイヤレス・デバイス用アプリケーションからXMLを取得するアダプタを起動することで、リクエストを処理します。このXMLは、OracleASで定義されるスキーマに基づいています。

次に、OracleAS Wirelessではトランスフォーマを起動します。トランスフォーマはXMLを取り込んで、そのワイヤレス・クライアントに適したマークアップ言語に変換します。変換されたデータは、OracleASによってゲートウェイに送信されます。ゲートウェイでは、データをクライアントに送信する前に、(コンパクトにするために)エンコードする場合があります。

関連項目

『Oracle Application Server Wireless開発者ガイド』と『Oracle Application Server Wireless管理者ガイド』 

8.5.1 問合せ処理

図8-4に、ワイヤレス・クライアントおよびブラウザ・クライアントによる問合せ処理のフローを示します。この図は、図6-1が複雑になったものです。

図8-4    問合せ処理


画像の説明

図8-4には、2つのイベント・シーケンスがあります。シーケンスの1つは、ブラウザから発信されたリクエストの処理です。このシーケンスの手順は、図中では「B」と表されています。もう1つのシーケンスは、ワイヤレス・クライアントから発信されたリクエストの処理です。このシーケンスの手順は、図中では「W」と表されています。

ブラウザからのリクエストを処理する手順は、「従業員の問合せ処理」で説明しています。この項では、ワイヤレス・クライアントからのリクエストを処理する手順について説明します。

W1: サーバーから、actionパラメータおよびempIDパラメータの付いたリクエストがコントローラに送信されます。actionパラメータにはqueryEmployeeが設定され、empIDパラメータにはユーザーが入力した従業員IDが設定されています。

W2: QueryEmployee.javaによって、clientTypeパラメータがチェックされ、リクエストがワイヤレス・クライアントまたはブラウザのいずれから発信されたものであるかが確認されます。このパラメータは、アプリケーションからワイヤレス・クライアントに送信されるXMLファイルにのみ設定されています。ブラウザからのリクエストには、このパラメータは設定されません。また、QueryEmployee.javaによって、従業員IDが有効であるかどうかもチェックされます。

W3: QueryEmployee.javaによって、リクエストがqueryEmployeeWireless.jspに転送されます。

W4: queryEmployeeWireless.jspは、queryEmployee.jspと類似しています。queryEmployeeWireless.jspによって、従業員データが取得および表示されます。どちらのファイルの取得メソッドも同じものです。異なる点は、使用されているタグのみです(ブラウザの場合はHTML、ワイヤレス・クライアントの場合はXML)。

8.5.2 queryEmployeeWireless.jsp

queryEmployeeWireless.jspは、次のようになっています。

// queryEmployeeWireless.jsp
<?xml version = "1.0" encoding = "ISO-8859-1"?> 
<%@ page contentType="text/vnd.oracle.mobilexml; charset=ISO-8859-1" %> 
<%@ page import="java.util.*" %>
<%@ page import="empbft.component.employee.ejb.*" %>
<%@ page import="empbft.component.employee.helper.*" %>
<%@ page import="empbft.util.*" %>
<SimpleResult>
   <SimpleContainer>
<%
  String empId = request.getParameter(SessionHelper.EMP_ID_PARAMETER);
  if (empId == null)
  {
%>
     <SimpleForm title="Query Employee" target="/empbft/controller">
       <SimpleFormItem name="empID" format="*N">Enter Emp ID: </SimpleFormItem>
       <SimpleFormItem name="action" type="hidden" value="queryEmployee" />
       <SimpleFormItem name="clientType" type="hidden" value="wireless" />
     </SimpleForm>
<%
  } else {
    int id = Integer.parseInt(empId);
    EmployeeManager mgr = SessionHelper.getEmployeeManager(request);
    EmployeeModel emp = mgr.getEmployeeDetails(id);
%>
     <SimpleText>
       <SimpleTextItem>Emp ID: <%=empId%></SimpleTextItem>
       <SimpleTextItem>First Name: <%=emp.getFirstName()%></SimpleTextItem>
       <SimpleTextItem>Last Name: <%=emp.getLastName()%></SimpleTextItem>
       <SimpleTextItem>Email: <%=emp.getEmail()%></SimpleTextItem>
       <SimpleTextItem>Phone: <%=emp.getPhoneNumber()%></SimpleTextItem>
       <SimpleTextItem>Hire: <%=emp.getHireDate()%></SimpleTextItem>
       <SimpleTextItem>Job: <%=emp.getJobId()%></SimpleTextItem>
       <SimpleTextItem>Elected Benefits: </SimpleTextItem>
<%
    Collection benefits = emp.getBenefits();
    if (benefits == null || benefits.size() == 0) {
%>
       <SimpleTextItem>None</SimpleTextItem>
<%
    } else {
      Iterator it = benefits.iterator();
      while (it.hasNext()) {
        BenefitItem item = (BenefitItem)it.next();
%>
       <SimpleTextItem><%=item.getName()%></SimpleTextItem>
<%
      } // end of while
    } // end of if
%>
     <Action label="Add Benefits" type="SOFT1" task="GO"
           target="/empbft/controller?action=addBenefitToEmployee&amp;
                    clientType=wireless&amp;empID=<%=empId%>"></Action>
     <Action label="Remove Benefits" type="SOFT1" task="GO"
             target="/empbft/controller?action=removeBenefitFromEmployee&amp;
             clientType=wireless&amp;empID=<%=empId%>"></Action>
     <Action label="Query Other Employee" type="SOFT1" task="GO"
                  target="/empbft/controller?action=queryEmployee&amp;
                  clientType=wireless"></Action>
     </SimpleText>
<%
    } // end of else (empId != null)
%>
   </SimpleContainer>
</SimpleResult>


Actionタグは、ポップアップ・メニュー(図8-1、画面4)を定義しています。ポップアップ・メニューを表示するには、「Menu」ボタンを選択します。

8.5.3 給付項目の追加処理および削除処理

ワイヤレス・クライアントでの給付項目の追加処理および削除処理は、ブラウザの場合と類似しています。ワイヤレス・クライアントでのこれらの処理をサポートするには、次のような変更をアプリケーションに加える必要があります。

8.6 アプリケーションへのアクセス

ワイヤレス・デバイス用アプリケーションを開発する場合、実際のワイヤレス・クライアントからアプリケーションを実行するための環境にアクセスできない場合があります。そのような場合は、シミュレータを使用してアプリケーションをテストすることができます。ただし、アプリケーションを本番環境にデプロイする前に、実際のワイヤレス・クライアントでアプリケーションをテストできる環境を見つけておくか、設定しておくことを強くお薦めします。

8.6.1 シミュレータの使用

ワイヤレス・クライアントのシミュレータからアプリケーションにアクセスするには、次のように操作します。

  1. 次のURLをシミュレータに入力します。

    http://<host>:<port>/omsdk/rm
    
    
    

/omsdk/rmは、ワイヤレス・デバイス用アプリケーションを指しています。入力すると、次の2つのオプションが画面に表示されます。

  1. 「Samples」を選択します。

  2. アプリケーションのリストの中から、目的のアプリケーションを選択して起動します。

8.6.2 実際のワイヤレス・クライアントの使用

携帯電話、PDAなど、実際のWeb対応のワイヤレス・クライアントからアプリケーションにアクセスする場合には、パブリックにアクセスできる(アプリケーションがファイアウォールの内部に存在しない)ことを確認してください。ワイヤレス・クライアントからのリクエストは、ゲートウェイを経由して送信されます。ゲートウェイは、パブリックにアクセスできるマシンのみと通信できます。

URLを入力して、「シミュレータの使用」に示す手順に従うと、使用するアプリケーションがアプリケーションのリストに表示されます。


戻る 次へ
Oracle
Copyright © 2003, 2004, Oracle.

All Rights Reserved.
目次
目次
索引
索引