検証
新世代リッチ・クライアントの可能性を探る(後編)

4.サンプル実装の設計

野畠英明
ヒューレット・パッカード・ソリューションデリバリ(株)
2003/06/04

 これまで紹介してきたシナリオを追体験できるサンプルを用意した。ただし、これはあくまでもOffice XP Web Service Toolkitを利用したクライアント側の設計に注目するものであり、サーバ側の実装は最低限にとどめている。具体的には、人事管理を扱わない、基幹システムと接続しない、データベースにデータを格納しない、といった制約がある。ただメモリ上にデータを蓄積したり、メモリから参照したりするだけである。また、実システムでは必須となる認証・権限の管理も行っていない。これらの点に注意して説明を読み進んでいただきたい。

 以下にサンプルの論理的な構成を示す。

サンプル実装の論理構成
「顧客情報」や「ヒアリング」などのExcelのシートから、Office XP Web Service Toolkitによって生成されたWebサービス・プロキシを経由し、WebLogic Server側が提供するWebサービスを呼び出す。

 前回解説したように、「顧客情報」や「ヒアリング」などのExcelのシートで、「検索」/「登録」といった操作が行われたら、プロキシを通じてWebLogic Server上のWebサービスにアクセスする。Office XP Web Services Toolkitによって生成されたプロキシは、インスタンス生成時にサーバ上のWSDLを読み取り、Webサービスにアクセス可能な状態になる。この初期化の処理はかなり重いので、操作性を考えると最小限にとどめたい。そこでサンプルでは、プロキシの生成を各Webサービスへの最初のアクセス時だけで済むよう標準モジュールにプロキシ取得コードを記述してある。

 次に顧客情報管理サービスと案件管理サービスのインターフェイスについて簡単に説明する。

 顧客情報管理サービスのインターフェイスは次のとおり。

package webservice.sample.SalesSupport.CustomerManager;

import java.rmi.RemoteException;
import javax.ejb.EJBObject;
import webservice.sample.SalesSupport.*;

public interface CustomerManager extends EJBObject {
  // 顧客情報登録
  public boolean regitCustomerInfo(Customer cust)
    throws RemoteException;
  // 顧客情報取得
  public Customer getCustomerInfo(String compName)
    throws RemoteException;

}

 各メソッドは、以下のような機能を持っている。

メソッド 説明
regitCustomerInfo 「顧客情報」シートで[登録]ボタンがクリックされたときに呼び出され、顧客情報を登録する
getCustomerInfo シナリオでは利用される場面がなかったが、「顧客情報」シートで[検索]ボタンが押されたときに呼び出され、顧客情報を取得する

  案件管理サービスのインターフェイスは次のとおりである。

package webservice.sample.SalesSupport.SolutionManager;

import java.rmi.RemoteException;
import javax.ejb.EJBObject;
import webservice.sample.SalesSupport.*;

public interface SolutionManager extends EJBObject {

  // 案件情報登録
  public boolean regitSolutionInfo(Solution sol)
    throws RemoteException;

  // 案件情報取得
  public Solution getSolutionInfo(String solutionName)
    throws RemoteException;

  // 案件情報取得
  public Solution[] getSolutionList(String[] solutionName)
    throws RemoteException;

  // 案件リストの取得
  public List refresh()
    throws RemoteException;

  // ステータス取得
  public Status[] getStatus()
    throws RemoteException;

  // 受注目標
  public ExpectedOrder[] getExpectedOrder()
    throws RemoteException;

}

 各メソッドは、以下のような機能を持っている。

メソッド 説明
regitSolutionInfo 「ヒアリングシート」シートで[登録]ボタンが押されたときに呼び出され、案件情報を登録する
getSolutionInfo 「ヒアリングシート」シートで案件名を選択して[検索]ボタンが押されたときに呼び出され、案件情報を取得する
getSolutionList 「個別案件ステータス確認」シートで[参照]ボタンを押したときに呼び出され、案件情報のリストを取得する
refresh 「ヒアリングシート」シートで[最新状態に更新]ボタンが押されたときに呼び出され、会社名と案件名のリストを取得する
getStatus 「個別案件ステータス確認」シートで営業担当者を選んだときに呼び出され、案件情報(案件情報のうち、会社名、案件名、ステータスのみ)のリストを取得する
getExpectedOrder 「受注予測確認」シートで[グラフ参照]ボタンを押したときに呼び出され、当年度の受注予測を取得する

 ここで注意点として「Office XP Web Services Toolkitは万能ではない」ということを挙げておきたい。通常、プロキシを自動生成すると聞くと、すべて型付けされたオブジェクトにマッピングしてくれるものと思いがちだが、複雑な型ではIXMLDOMNodeListというDOM(Document Object Model)の型にマッピングされてしまう。DOMの詳細については、以下の記事などを参照されたい。

 そうなるとDOMによるXMLの操作になってしまうので、コーディングがかなり煩雑になる。また、Office XP Web Services Toolkitが自動生成するプロキシを使うと「SoapMapper:Restoring data into SoapMapper タイプ名 failed」というエラー・ダイアログが表示されることがある。これは、自動生成されるコードに問題があるためだ。今回の場合では、案件管理サービスのrefreshメソッドでエラーが発生する。その場合は、プロキシを手作業で書き換える必要がある(サンプルでは適切に書き換えてある)。

 また、サンプルでは、struct_Solutionクラス(案件管理サービスのWSDLから自動生成される)のInstancingプロパティを「PublicNotCreatable」に変更している。これは、別のシートのメソッドにstruct_Solutionクラスのインスタンスを渡せるようにするための実装上の都合であり、特にOffice XP Web Services ToolkitやSOAP Toolkitの都合ではない。

サンプルのセットアップ方法

 サンプルの設計について述べたので、次にサンプルのセットアップ方法を示す。

■サーバ側のセットアップ

 WebLogic Serverのインスタンスは、前編と同様にExamples Serverを利用する。これ以降、WebLogic Serverを前編同様に以下の設定でインストール・起動したという前提で解説していく。

設定項目 本記事での想定
BEAホーム C:\bea
標準インストールかカスタムインストールか 標準インストールを選ぶ。これによりExamples Serverがインストールされるので、それを使う
製品インストール・ディレクトリの指定(以降では%WL_HOME%と表記する) C:\bea\weblogic700
WebLogic Serverインストール時の設定項目

 サンプルを実行するには、Webサービスをビルドする必要がある。Sample.jarを次のリンクからダウンロードし、適当なフォルダで次のように展開してほしい。

Sample.jarのダウンロード

C:\work2> C:\bea\jdk131_06\bin\jar xvf sample.jar

 例えばC:\work2以下に展開した場合なら、次のような構造になるはずだ。

パス ファイル
C:\work2 build.xml
C:\work2\CM ejb-jar.xml
C:\work2\SM ejb-jar.xml
C:\work2\webservice\sample
\SalesSupport
Status.java
Solution.java
ExpectedOrder.java
Customer.java
C:\work2\webservice\sample
\SalesSupport\CustomerManager
CustomerManager.java
CustomerManagerBean.java
CustomerManagerHome.java
C:\work2\webservice\sample
\SalesSupport\SolutionManager
SolutionManager.java
SolutionManagerBean.java
SolutionManagerHome.java
List.java

 ここで1つ注意点がある。Build.xmlには、WebLogicのインストール・パスに依存する部分があるので、下記の「WL_HOME」の部分を%WL_HOME%(実際のパス)で書き換えてほしい。

  <!-- WL_HOMEを環境に合わせた値に置き換えてください -->
  <property file="WL_HOME/samples/server/src/examples.properties"/>

 ファイルの配置が完了したら、Webサービスをビルドする。これにはコマンド・プロンプトを起動し、%WL_HOME%\samples\server\config\examplesにあるsetExamplesEnv.cmdを実行し、ビルドに必要な環境変数を設定した上で、カレント・ディレクトリをC:\work2に移動し、antコマンドでサービスをビルドする。

%WL_HOME%\samples\server\config\examples>setExamplesEnv.cmd
C:\work2>ant

 antコマンドが終了して、最後に「BUILD SUCCESSFUL」と表示されれば成功である。

 これでWebサービスの実装がビルドされ、WebLogic Serverのフォルダに配置されるので、自動的にWebサービスが利用可能になるはずである。利用可能になったかどうかは、Examples Server起動時のコマンド・プロンプト・ウィンドウで、サービスのアクティブ化完了のメッセージを確認してほしい。以下のようなメッセージが表示されていれば成功である。

<2003/xx/xx xx:xx:xx:JST> <Notice> <Application Poller> <149400> <Activating application: _appsdir_webservices_SalesSupport_ear><2003/xx/xx xx:xx:xx:JST> <Notice> <Application Poller> <149404> <examplesServer 上の アプリケーション _appsdir_webservices_SalesSupport_ear を アクティブ化 -実行中です。><2003/xx/xx xx:xx:xx:JST> <Notice> <Application Poller> <149404> <examplesServer 上の アプリケーション _appsdir_webservices_SalesSupport_ear を アクティブ化 -実行中です。><2003/xx/xx xx:xx:xx:JST> <Notice> <Application Poller> <149404> <examplesServer 上の アプリケーション _appsdir_webservices_SalesSupport_ear を アクティブ化 -実行中です。><2003/xx/xx xx:xx:xx:JST> <Notice> <Application Poller> <149404> <examplesServer 上の アプリケーション _appsdir_webservices_SalesSupport_ear を アクティブ化 -実行中です。><2003/xx/xx xx:xx:xx:JST> <Notice> <Application Poller> <149404> <examplesServer 上の アプリケーション _appsdir_webservices_SalesSupport_ear を アクティブ化 -完了しました。>

■クライアント側のセットアップ

 クライアント側は特別なインストール作業は必要ない。Office XP Web Services ToolkitまたはSOAP Toolkit 3.0がインストールされていて、Excelが動く環境であれば、以下のファイルを開くだけだ。

ファイル名 説明
SalesSupport.xls 営業担当者用クライアント。次のシートを含む「顧客情報」「ヒアリングシート」「ヒアリングシート(マスタ)」
SalesSupportManager.xls マネージャ用クライアント。次のシートを含む。「個別案件ステータス確認」「受注予測確認」「ヒアリングシート(マスタ)」「目標値(担当者ごと)」

SalesSupport.xlsのダウンロード
SpalesSupportManager.xlsのダウンロード

 ただし、1つだけ注意点がある。このクライアントを動かすためには、セキュリティ・レベルを「高」ではなく「中」に設定しておく必要があることだ。具体的には、Excelの[ツール]−[マクロ]−[セキュリティ]メニューを選び、[セキュリティ レベル]タブで「中」に設定する。各組織のセキュリティ・ポリシーがあると思うので、設定を変更した場合は、サンプルを実行し終わったら適宜元の設定に戻していただきたい。

最後に

 ここで改めて、Webアプリケーションに対し、OfficeをWebサービス・クライアントとして利用するメリットをまとめておこう。

  • Officeのユーザー・インターフェイスを生かせる。Excelであれば、入力しながらカーソルキーによってセル間を移動できる、業務画面の切り替えをシート切り替えで手軽に行えるなど。

  • Officeの豊富な機能を生かせる。Excelであれば、多彩なグラフ作成、ピボットテーブル、計算式など。サーバ側ですでにOfficeにある機能を作りこむ必要はない。

  • 対象部門・対象業務を限定することでスモール・スタートが可能。必要最小限の既存システムをWebサービス化し、段階的に導入していくことができる。また、Webサービスの柔軟性を生かして機能を段階的に拡張していくことも可能(ただし、柔軟性を生かすためには工夫が必要)。

  • クライアント側だけでサービスのインテグレーションやビジネスロジックの構築が可能なので、拡張性が高く、カスタマイズが容易。全社的に統一すべきことをWebサービスとして、個別に工夫、融通を利かせたいことをクライアントで、といったように最適な組み合わせを選択できる。

  • データの入力やすでに取得したデータの参照がオフラインでも可能。

  • データをファイル(docファイルやxlsファイル)として保存できるため、サーバと切り離してデータを流通させられる(Webサービスを外部に公開していない場合でも、取引先にそのまま、あるいは一部を送ることが可能)。

 あえて注意点を挙げるとすれば、この利用形態はRPCのモデルを使っているので、Webサービスとはいうものの、密結合のモデルに近いということだろう。システム設計では、この点をよく理解して作業にかかる必要がある。

 以上、前編・後編の2回に分けて、OfficeをWebサービス・クライアントとして利用することで何ができるのかということについて、技術的な側面と、それを応用した業務的な側面の2方向から解説してきた。ここで業務の例としては、営業支援という題材を通して具体的なシナリオを想定してみた。

 本稿では、営業支援システムを題材としたため、主に社内システムで利用するものといった印象を持った読者がいるかもしれない。だが、これはASPなどの社外向けサービス提供にも応用可能であり、適用分野は広いと考えている。要は発想しだいである。例えば、日ごろ解決すべきなのに、どうしようもないとあきらめてしまっている問題・課題を、Webサービスの応用という観点からもう1度見直すことで、多彩な活用法が生み出されてくるのではないだろうか。技術主導ではなく、発想主導であるべきだ。まずはOfficeという身近な道具との組み合わせで考えてみてはいかがだろう。

 本稿が読者の発想への刺激となり、Webサービス活用の参考になれば幸いである。End of Article

 

 INDEX
  新世代リッチ・クライアントの可能性を探る(前編)
    1.本稿の目的と想定する技術・環境
    2.簡単なサンプルの作成と実行
   
  新世代リッチ・クライアントの可能性を探る(後編)
     1.営業支援システムを作る
     2.営業支援システムの利用シナリオ(1)
     3.営業支援システムの利用シナリオ(2)
   4.サンプル実装の設計
 
 検証


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間