Oracle Application Server アプリケーション開発者ガイド 10gリリース2(10.1.2) B15629-01 |
|
OracleASのワイヤレス機能を使用すると、ワイヤレス・クライアントからアプリケーションにアクセスできるようになります。ワイヤレス・クライアントでは、HTTPとは異なるプロトコルおよびHTML以外のマークアップ言語を使用するため、ワイヤレス・クライアントをサポートするには、サンプル・アプリケーションに変更を加える必要があります。
この章の項目は次のとおりです。
MVC設計を使用しているアプリケーションの場合、ワイヤレス・クライアントをサポートするためにアプリケーションに加える必要のある変更はそれほど多くありません。
ActionHandler
オブジェクトのサブクラスになっているオブジェクト(図4-1を参照)を変更する必要もあります。これらのオブジェクトによって、リクエストが適切なJSPファイルに転送されます。ワイヤレス・クライアント向けのプレゼンテーション・データを作成するときには、そのデータを、ブラウザ向けのプレゼンテーション・データと同じJSPファイルに入れるか、または別のJSPファイルに入れることができます。データを別のファイルに入れる場合は、ActionHandler
オブジェクトを編集して、ワイヤレス・クライアントからのリクエストを、ワイヤレス・クライアント向けのプレゼンテーション・データを含むJSPファイルに転送できるようにする必要があります。ワイヤレス・クライアントでは標準化されたマークアップ言語を使用しないため、ワイヤレス・クライアント向けのプレゼンテーション・データを一般的なDTD仕様に基づくXMLで作成する必要があります。このXMLは、OracleASのワイヤレス機能によって、そのワイヤレス・クライアントで処理できる特定のマークアップ言語に変換されます。
HTMLの場合と同様に、アプリケーションでは、JSPファイルまたは静的ファイルからXMLを生成できます。サンプル・アプリケーションでは、プレゼンテーション・データに動的データが含まれるため、JSPファイルに含めます。
ワイヤレス・クライアント向けの汎用XMLはSimpleResult
DTDに基づいています。
図8-1〜図8-3に、サンプル・アプリケーションがシミュレータ上で動作する様子を示します。ワイヤレス・クライアントでアプリケーションが動作する様子は、デスクトップ・ブラウザのアプリケーションの場合と類似しています。
画面1では、ワイヤレス・クライアントで動作可能なアプリケーションのリストが表示されています。これは、基本的には、次のディレクトリにあるファイルのリストになります。
$OMSDK_HOME/oc4j_omsdk/omsdk/j2ee/applications/pmsdk/apps/
$OMSDK_HOME
は、OracleAS Wireless SDKのホーム・ディレクトリです。
画面2は、サンプル・アプリケーションの開始点を示しています。これは、empbft.xml
ファイルです。このファイルによって、ユーザーが従業員IDを入力するテキスト入力フィールドが表示されます。
画面3は、問合せの結果を示しています。ワイヤレス・クライアントにはスクロールバーがあります。ユーザーは、スクロールバーを使用してページを下方にスクロールし、すべての情報を表示できます。給付項目を追加または削除するには、この画面の「Menu」ボタンを選択します。
画面4は、メニューを示しています。「Add Benefits」、「Remove Benefits」「Query Other Employee」などのオプションがあります。
画面5は、ユーザーが追加可能な給付項目のリストを示しています。リクエストを発行するには、追加する給付項目を1つ選択して、「OK」を選択します。ワイヤレス・クライアントで追加または削除する項目を選択する場合、選択できる項目は1回につき1つのみであることに注意してください。
画面6は、給付項目の追加処理が正常に終了したことをユーザーに通知しています。この画面にも「Menu」オプションがあります。
画面7は、メニューを示しています。「Add More Benefits」、「Remove More Benefits」、「Query Same Employee」および「Query Other Employee」の4つのオプションがあります。
画面8は、ユーザーが給付項目を追加した後の給付項目リストを示しています。
画面9は、画面3と類似しています。ここでは、ページを下方にスクロールして、ユーザーの給付項目リストを表示しています。
ブラウザ用のアプリケーションでは、ユーザーは複数の給付項目を選択して、追加または削除することができます。一方、ワイヤレス・デバイスでは、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&clientType=wireless&empI D=<%=empId%>"></Action> <Action label="Remove More Benefits" type="SOFT1" task="GO" target="/empbft/controller?action=removeBenefitFromEmployee&clientType=wireless& ;empID=<%=empId%>"></Action> <Action label="Query Same Employee" type="SOFT1" task="GO" target="/empbft/controller?action=queryEmployee&clientType=wireless&empID=<%=em pId%>"></Action> <Action label="Query Other Employee" type="SOFT1" task="GO" target="/empbft/controller?action=queryEmployee&clientType=wireless"></Action> </SimpleText>
ユーザーが「Add More Benefits」オプションまたは「Remove More Benefits」オプションを選択した場合のリクエストは、1つの給付項目を追加または削除するときのリクエストと類似しています。このリクエストには、action
パラメータ、empID
パラメータおよびclientType
パラメータが含まれます。アプリケーションによってデータベースへの問合せが実行され、更新された給付項目リストが表示されます(画面8)。
ワイヤレス・クライアント向けのXMLプレゼンテーション・データは、HTMLを生成するJSPファイルと同じファイルに作成するか、または別のJSPファイルに作成することができます。プレゼンテーション・データを入れた場所にかかわらず、リクエストがワイヤレス・クライアントまたはデスクトップ・クライアントのいずれから発信されたものであるかをチェックする必要があります。
リクエストの発信元をチェックするには、ワイヤレス・クライアントであることを識別するためのパラメータをリクエストに挿入します。パラメータとその値を含めるときには、非表示の入力フォーム要素を使用できます。
サンプル・アプリケーションでは、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); %>
この方法を使用する場合は、リクエストの発信元(リクエストがワイヤレス・クライアントまたはデスクトップ・クライアントのいずれから発信されたものであるか)を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%>&action=addBenefitToEmployee">Add benefits to the employee</a></td></tr> <tr><td><a href="/empbft/controller?empID=<%=id%>&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) %>
別のファイルを使用する場合は、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
の値は、SessionHelper
にclientType
と定義されています。clientTypeは、パラメータの名前です。
CLIENT_TYPE_WIRELESS
の値は、SessionHelper
にwireless
と定義されています。これは、パラメータの値です。
このパラメータおよびパラメータ値は、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>
ワイヤレス・クライアントをサポートするには、ワイヤレス・クライアント向けのJSPファイルのヘッダーにいくつかの変更を加える必要があります。
JSPファイルの先頭に、そのファイルがXMLファイルであることを指定する次の行を挿入する必要があります。
<?xml version = "1.0" encoding = "ISO-8859-1"?>
ワイヤレス・クライアント向けのJSPファイルの先頭に、レスポンスのコンテンツ・タイプおよびキャラクタ・セットを設定する次の行を挿入する必要があります。
<%@ page contentType="text/vnd.oracle.mobilexml; charset=ISO-8859-1" %>
JSPのcontentType
のデフォルト値はtext/html
であり、ワイヤレス・クライアントに対応していないため、このように設定する必要があります。
トランスフォーマでは、ページをワイヤレス・クライアントが解釈できるデータに変換するときに、text/vnd.oracle.mobilexml
という値を使用します。
OracleASに送られるワイヤレス・クライアントからのリクエストは、ユーザー・エージェント・フィールドにワイヤレス・デバイスの名前が含まれることを除き、デスクトップ・ブラウザからのリクエストと同様です。ただし、ワイヤレス・デバイスからのリクエストがOracleASに到達する方法は異なります。ワイヤレス・デバイスからのリクエストは、最初にゲートウェイ(WAP、Voice、SMSなど)を通過します。そこで、リクエストはHTTPプロトコルに変換されます。その後、リクエストはゲートウェイからOracleAS Wirelessにルーティングされます。
OracleAS Wirelessでは、ワイヤレス・デバイス用アプリケーションからXMLを取得するアダプタを起動することで、リクエストを処理します。このXMLは、OracleASで定義されるスキーマに基づいています。
次に、OracleAS Wirelessではトランスフォーマを起動します。トランスフォーマはXMLを取り込んで、そのワイヤレス・クライアントに適したマークアップ言語に変換します。変換されたデータは、OracleASによってゲートウェイに送信されます。ゲートウェイでは、データをクライアントに送信する前に、(コンパクトにするために)エンコードする場合があります。
図8-4に、ワイヤレス・クライアントおよびブラウザ・クライアントによる問合せ処理のフローを示します。この図は、図6-1が複雑になったものです。
図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)。
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& clientType=wireless&empID=<%=empId%>"></Action> <Action label="Remove Benefits" type="SOFT1" task="GO" target="/empbft/controller?action=removeBenefitFromEmployee& clientType=wireless&empID=<%=empId%>"></Action> <Action label="Query Other Employee" type="SOFT1" task="GO" target="/empbft/controller?action=queryEmployee& clientType=wireless"></Action> </SimpleText> <% } // end of else (empId != null) %> </SimpleContainer> </SimpleResult>
Action
タグは、ポップアップ・メニュー(図8-1、画面4)を定義しています。ポップアップ・メニューを表示するには、「Menu」ボタンを選択します。
ワイヤレス・クライアントでの給付項目の追加処理および削除処理は、ブラウザの場合と類似しています。ワイヤレス・クライアントでのこれらの処理をサポートするには、次のような変更をアプリケーションに加える必要があります。
AddBenefitToEmployee.java
およびRemoveBenefitFromEmployee.java
を修正します。このチェックでは、問合せ処理と同じ形式を使用します。
addBenefitToEmployeeWireless.jsp
およびremoveBenefitFromEmployeeWireless.jsp
を作成します。
errorWireless.jsp
を作成します。
successWireless.jsp
を作成します。このファイルは、処理が正常に終了したことを通知するメッセージの表示のほかに、メイン・メニューに戻らなくても他の給付項目を追加または削除できるポップアップ・メニューの定義にも使用します。この機能は、ブラウザでは使用できません。この機能の詳細は、「ワイヤレス・デバイス用アプリケーションとブラウザ用アプリケーションの相違」を参照してください。
ワイヤレス・デバイス用アプリケーションを開発する場合、実際のワイヤレス・クライアントからアプリケーションを実行するための環境にアクセスできない場合があります。そのような場合は、シミュレータを使用してアプリケーションをテストすることができます。ただし、アプリケーションを本番環境にデプロイする前に、実際のワイヤレス・クライアントでアプリケーションをテストできる環境を見つけておくか、設定しておくことを強くお薦めします。
ワイヤレス・クライアントのシミュレータからアプリケーションにアクセスするには、次のように操作します。
/omsdk/rm
は、ワイヤレス・デバイス用アプリケーションを指しています。入力すると、次の2つのオプションが画面に表示されます。
このオプションを選択すると、画面にテキスト・フィールドが表示され、参照するURLを入力できます。
このオプションを選択すると、画面(図8-1、画面1)に、特定のディレクトリにあるすべてのアプリケーションのリストが表示されます。
携帯電話、PDAなど、実際のWeb対応のワイヤレス・クライアントからアプリケーションにアクセスする場合には、パブリックにアクセスできる(アプリケーションがファイアウォールの内部に存在しない)ことを確認してください。ワイヤレス・クライアントからのリクエストは、ゲートウェイを経由して送信されます。ゲートウェイは、パブリックにアクセスできるマシンのみと通信できます。
URLを入力して、「シミュレータの使用」に示す手順に従うと、使用するアプリケーションがアプリケーションのリストに表示されます。
|
Copyright © 2003, 2004, Oracle. All Rights Reserved. |
|