Web サービスを開発し、J2ME クライアントからアクセスする

このチュートリアルでは 2 つの単純な例 (「Hello World」サービスと「ログイン」サービス) を用いて、Java 2 Platform で Web サービスを開発し、WebSphere Application Server Community Edition (WASCE) サーバーおよび Tomcat サーバーにデプロイして J2ME クライアントからその Web サービスを呼び出す方法を説明します。Web サービスを開発して WASCE にデプロイする際には Eclipse IDE も使用します。さらに、このチュートリアルではもう 1 つの例として、.NET プラットフォームで開発した (ローカル・ホストではなく) リモート・ロケーションの「株価情報」サービスを J2ME クライアントを使って呼び出す方法も紹介します。

Kuntal Ganguly, Jr. Consultant, Protech Infosystems Pvt. Ltd

Kuntal Ganguly は J2EE、Web サービス (JAX-WS)、J2ME、Android アプリケーションの開発に 13 ヶ月を超える経験を持つ B.Tech (Bachelor of Technology: 科学技術学士) です。現在はカルカッタの Protech Infosystems のジュニア・コンサルタントです。彼は広範なオープンソース・ツールや商用ツール (WASCE、Eclipse、Oracle SOA Suite11g、EZlegacy、Active MQ、BIRT、DB2 Express C)、そして技術 (GWT や Android) の使用に関する専門知識を持っています。最新技術への情熱の他に、彼はクリケット、ヨガ、ボディビルなどにも関心を持っています。



2012年 1月 06日

始める前に

チュートリアルを始める前に、このチュートリアルで学習する内容、そしてこのチュートリアルを最大限に活用する方法について説明しておきます。

このチュートリアルについて

このチュートリアルでは 2 つの単純な例 (「Hello World」サービスと「ログイン」サービス) を用いて、Java 2 Platform で Web サービスを開発し、WebSphere Application Server Community Edition (WASCE) および Tomcat サーバーにデプロイして J2ME クライアントからその Web サービスを呼び出す方法を説明します。Web サービスを開発して WASCE にデプロイする際には Eclipse IDE も使用します。さらに、このチュートリアルではもう 1 つの例として、.NET プラットフォームで開発した (ローカル・ホストではなく) リモート・ロケーションの「株価情報」サービスを J2ME クライアントを使って呼び出す方法も紹介します。

チュートリアルで取り上げる Web サービスではいずれも、その Web サービスを支えるメッセージング・フレームワークとして SOAP を使用します。SOAP によって構築される疎結合の基盤は、さまざまな実装技術およびネットワーク・トランスポートを使用したデプロイメントに、極めて優れたレジリエンシー、スケーラビリティー、柔軟性をもたらします。J2ME Web サービス仕様 (JSR 172) で特定している 2 つの独立したオプション・パッケージを使用すれば、リモートの SOAP ベースまたは XML ベースの Web サービスにアクセスして XML データを構文解析することができます。完全な JSR 172 仕様は、Java Community Process からダウンロードすることができます。

目標

このチュートリアルでは、以下の方法を学びます。

  • Web サーバー (Tomcat および WASCE) をダウンロードしてインストールし (まだインストールされていない場合)、特定のサンプル・アプリケーションを正常に実装するためのマイナーな変更を加える方法
  • Web サービスを呼び出す J2ME クライアントを開発するための Sun J2ME エミュレーター (Java ME Platform SDK 3.0) をダウンロードしてインストールする方法
  • Web サービス (「Hello World」サービス) を開発およびデプロイするための Axis2 ランタイム環境を Tomcat にダウンロードしてインストールする方法
  • Eclipse IDE を使用して Web サービス (「ログイン」サービス) を開発し、WASCE にデプロイする方法
  • .Net プラットフォームで開発されてリモート・マシンでホストされているリモート Web サービス (「株価情報」サービス) に J2ME クライアントからアクセスする方法

前提条件

このチュートリアルでは、読者が Eclipse IDE の基本概念 (ビュー、エディター、パネルなど) を理解していること、ならびに Java および J2ME でプログラミングする上での基本概念を理解していることを前提とします。Eclipse、Java、および J2ME について紹介している Web ページについては、「参考文献」を参照してください。


はじめに

Web サービスとは何か?

Web サービスとは、アプリケーションの機能にネットワークでアクセスできるインターフェースのことです。Web サービスは、標準インターネット技術を使用して作成されます。

Web サービスの背後にある基本概念は、SOA (Service-Oriented Architecture) です。SOA においては、アプリケーションはもはや 1 つの巨大なプログラムではなく、複数に分割された小さなプログラムが疎結合された形となります。そして、明確に定義された標準インターフェースにより、複数のサービスが緩やかに 1 つに結合されて提供されます。このようにプログラムが疎結合されていると、わずかな作業でアーキテクチャーに対してサービスの追加や削除ができるため、アーキテクチャーには高い拡張性がもたらされます。したがって、既存のサービスを組み合わせ、再利用するという方法で、新しいサービスを作成することができます。

また、アプリケーション・サービスは Java で作成されている一方で、ブラウザーは C++ で作成されている場合や、アプリケーション・サービスは UNIX マシンにデプロイされている一方で、ブラウザーは Windows マシンにデプロイされている場合でも、標準ベースのインターフェースによって抽象化されているおかげで、問題にはなりません。プラットフォームが何であろうと関係がなくなるように、Web サービスにはプラットフォーム間の相互運用性が考慮されています。相互運用性は、Web サービスの実装によって得られる主なメリットの 1 つです。

図 1. J2ME クライアントからの Web サービス呼び出し
J2ME クライアントからの Web サービス呼び出し

Web サービスのアーキテクチャーでは、サービス・プロバイダーが、サービス・レジストリーを介して提供するサービスの記述を公開します。サービス・コンシューマーはサービス・レジストリーを検索して、それぞれのニーズを満たすサービスを見つけます。サービス・コンシューマーは人間の場合もあれば、プログラムの場合もあります。

サービス・プロバイダーは、サービスという形でビジネス・プロセスを提供します。サービス・プロバイダーによって提供されるサービスは、コンシューマーによって特定のビジネスの目的を実現するために呼び出されます。こうしたサービスが提供されて、そのサービスが利用されるというプロセスは、ディレクトリー・サービスを使って実現されます。ディレクトリー・サービスは、プロバイダーとコンシューマーの間にブローカーという形で存在します。あるサービスをコンシューマーが利用できるようにする場合、そのサービスはブローカー内のディレクトリー・サービスに公開されます。ビジネスの目的を実現する必要のあるコンシューマーは、ブローカーから該当するサービスを見つけ出します。サービスが見つかると、コンシューマーはそのサービスに接続して処理ロジックを実行します。

J2ME とは何か?

J2ME (Java 2 Micro Edition) は、小型の機器用に設計された Java プラットフォームです。このプラットフォームには、小型の機器のため専用に設計された軽量の仮想マシンや、必要最小限のコア・クラス・ライブラリー、標準 java ライブラリーの軽量版などが含まれています。ワイヤレス PDA や高度な携帯電話にとって理想的なモバイル・クライアント・プラットフォームとなる J2ME は、標準 Java プログラミング言語をサポートし、J2SE (Java 2 Platform, Standard Edition) の API のサブセットに加え、機器に固有の API を備えています。MIDP (Mobile Information Device Profile) は、携帯電話上で動作する J2ME のプロファイルの 1 つです。

主要なモバイル機器ベンダー (Nokia、Motorola、Siemens、Samsung、富士通、Inventec、LG Electronics、三菱、NEC、パナソニック、Psion、RIM、シャープ、ソニーなど) はすべて、未来のスマート・デバイスに向けたコア戦略の 1 つとして Java を採用しています。SprintPCS や AT&T などの主要な通信業者でも、それぞれのネットワークで Java を搭載した機器や Java によるアプリケーションをサポートすることに力を入れています。このチュートリアルでは、MIDP アプリケーションの開発にフォーカスします。J2ME および MIDP についての詳細は、developerWorks で公開されているチュートリアル・シリーズ「J2ME 101」を参照してください (「参考文献」を参照)。

Sun J2ME Wireless Toolkit

J2ME Wireless Toolkit は、MIDP アプリケーションを構築するための包括的なツール・セットです。このツールキットはスタンドアロンで使用することも、よく使われている統合開発環境 (IDE) の多くに統合することもできます。Sun One Studio 5, Mobile Edition にバンドルされている J2ME Wireless Toolkit 3.0 には、バイト・コードの事前検証ツール、API クラス・ライブラリーの実装、およびデバイス・エミュレーターが用意されています。このエミュレーターは、実際の機器のいずれかに対応しているわけではなく、代わりに、実際の機器にはまだ実装されていない最先端の MIDP オプション・パッケージ API をサポートしています。

SUN J2ME Wireless Toolkit 3.0 の主要な特徴を以下に挙げます。

  • サード・パーティー製エミュレーターおよび Windows Mobile 搭載機器と統合することができます。
  • 機器へのデプロイメント、および機器上でのデバッグに対応しています。
  • CLDC/MIDP、CDC/FP/PBP/AGUI、および BD-J をまとめて 1 つの SDK に統合しています。
  • 新しい CLDC Hot-Spot 仮想マシンを実装しています。
  • 拡張機能により MSA 1.1 スタックを最適化して実装しています。
  • プロファイル作成をサポートしています。
  • BD-J をサポートしています (Windows のみ)。
  • JavaFX Mobile Emulator を実装しています。

構成と開発

例: Axis2 と Tomcat を使用した Web サービス

これは非常に単純な「Hello World」Web サービスの例です。このサービスは、J2ME クライアントから呼び出されると、パラメーターとして渡されたストリングを表示するだけに過ぎません。このサンプルをセットアップして実行するには、以下の知識が必要です。

Tomcat Web サーバー 5.5 以上: Tomcat サーブレット・エンジンは、Apache Software Foundation の Jakarta プロジェクトの一部として開発されたオープンソースのパッケージであり、サーブレット仕様と JSP 仕様両方の正式なリファレンス実装です。Tomcat はスタンドアロンの Web サーバーとして機能できるだけでなく、サーブレット/JSP エンジンとしての役割を果たすこともできます。Tomcat の最新リリースは、このリンクからダウンロードすることができます。

Axis2.war (Web サービス・エンジン): Axis2 は、コア・モジュールと非コア・モジュールからなるモジュール式アーキテクチャーをベースに作成されています。このコア・エンジンは、純粋な SOAP 処理エンジンであると考えられています (JAX-RPC の概念は一切コア・エンジンには実装されていません)。したがって、システムで受信されるすべてのメッセージは、SOAP メッセージに変換してからコア・エンジンに渡す必要があります。受信されるメッセージは SOAP メッセージであることも、非 SOAP メッセージ (REST、JSON、JMX など) であることもありますが、SOAP メッセージでない場合は、トランスポート・レベルで SOAP メッセージに変換されます。

Axis2 の最新リリースは、このリンクからダウンロードすることができます。Axis2 の各リリースは、以下の 4 つの主要なリリース成果物 (ディストリビューション) からなります。

  • バイナリー・ディストリビューション
  • WAR ディストリビューション
  • ソース・ディストリビューション
  • JAR ディストリビューション

Axis2 WAR ディストリビューションは、Tomcat、Jboss、Weblogic などのアプリケーション・サーバーに Axis2 をデプロイする場合に便利です。Axis2 WAR ファイルをアプリケーション・サーバーにデプロイして、ブラウザーにサーバー・アドレスを入力するだけで、Axis2 が機能しているかどうかを確認することができます。例えば Axis2 WAR ファイルが Apache Tomcat にデプロイされているとしたら、ブラウザーに URL として「http://localhost:8080/axis2」と入力すると、Axis2 が稼働中になっているかどうかがわかります。

環境のセットアップ

  1. JDK 1.5 (またはそれ以降のバージョン) をシステムにインストールします。
  2. Axis2 ファイル (war バージョン) をダウンロードした後、この zip ファイルを任意のローカル・ディレクトリーに解凍します。すると、axis2.war ファイルが解凍されるので、このファイルをコピーして <TOMCAT_HOME>webapps\ ディレクトリーに貼り付けた後、Tomcat を起動してください。これにより、コンソールには以下の出力が表示されるはずです。
図 2. Tomcat 起動時のコンソール
Tomcat 起動時のコンソール

Tomcat の起動が完了したら、カレント・ディレクトリーを <TOMCAT_HOME>webapps\ に変更します。このディレクトリー内に、axis2 という名前の新しいディレクトリーが作成されていれば、axis2.war ファイルが正常にデプロイされたことになります。

  1. Java Micro Edition SDK 3.0 をダウンロードしてインストールします。

Web サービスの構築: コード・ファースト手法 (ボトムアップ型 Web サービス)

Web サービスの分野が初めてという方は、Java コードを作成するだけで済む POJO による手法から始めるのが最善です。この手法で作成した Java クラスは Web サービスとして公開することができ、そのサービスは通常の Web サービスとして利用することができます。したがって、ここではまず始めにコードについて説明してから、Java クラスを使用して Axis2 対応の Web サービスを作成する方法を説明していきます。コード・ファースト手法では、サービス実装クラス (つまり、サービスを提供するクラス) を作成するところから取り掛かります。そこでまず始めに、サービスを呼び出して名前を入力すると、「Hello …」というメッセージを表示する、単純な Web サービスを作成します。

このサービス・クラスはパッケージ名を持たないという前提にします。したがって、このクラスのコードは以下のようになります。

リスト 1. HelloWorld.java
public class HelloWorld { 
public String sayHello(String name) { 
return "Hello " + name; 
}
}
  1. 上記に示すような、ストリングを返す HelloWorld.java ファイルを作成し、このコードをコンパイルします (以下の図を参照)。
図 3. HelloWorld.java のコンパイル
HelloWorld.java のコンパイル
  1. HelloWorld.class ファイルを見つけてから、カレント・ディレクトリーを <TOMCAT_HOME>\webapps\axis2\WEB-INF に変更します。
  2. WEB-INF ディレクトリー内に、「pojo」という名前のディレクトリーを作成します。
  3. HelloWorld.class ファイルを pojo ディレクトリーにコピーします。
  4. Tomcat が起動されていない場合は、起動してください。
    http://localhost:8080/axis2/services/listServices にアクセスします。すると、表示されるページには、「HelloWorld」というサービスが、利用可能なサービスの 1 つとして以下の図のように示されるはずです。
図 4. 利用可能な Axis2 Web サービスの一覧
利用可能な Axis2 Web サービスの一覧

ローカル・ホストから Axis2 エンジンの「HelloWorld」Web サービスにアクセスするには、ブラウザーで以下の URL を入力します。

http://localhost:8080/axis2/services/Helloworld

上記の URL にナビゲートすると、サービス記述、そして sayHello(String name) メソッドが表示されます。このメソッドをリモートの Java ME Midlet から呼び出すことになります。

WSDL を表示するには、URL に「http://localhost:8080/axis2/services/Helloworld?WSDL」と入力します。

J2ME クライアントのセットアップ

Web サービスを呼び出すには、常にクライアントが必要です。それが Web クライアントであれ、モバイル・クライアントであれ、クライアントは Web サービスのエンドポイント・インターフェースを認識していなければなりません。この問題は、スタブを作成してクライアント・アプリケーションに組み込むことで解決することができます。

スタブ用クラスの生成

スタブ用の Java クラスを生成するには、サービスの WSDL (Web Service Description Language) 記述が必要です。

Java ME SDK には、WSDL データを読み取ってスタブ用の Java クラスを生成する「wscompile」というツールが用意されています。スタブ用クラスは、リモート・サービスのローカル・プロキシーの役割を果たします。つまり、スタブ用クラスのメソッドを呼び出すことによって、リモート・メソッドが呼び出されることになります。

  1. 以下に記載する config.xml ファイルを作成してください (「HelloWorld」Web サービス用)。

    (wsdl のロケーションは、サービスの URL と一致していなければなりません (URL の末尾には「?WSDL」を追加します)。packageName は、生成されるファイルを集めたパッケージです。)
リスト 2. config.xml
<?xml version="1.0"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl location=" http://localhost:8080/axis2/services/HelloWorld?wsdl" 
                                            packageName="rpcdemo" />
</configuration>
  1. このファイルを <J2ME_SDK_HOME>\bin\ ディレクトリーに保存します。
  2. 次に、スタブを生成するために以下のコマンドを実行します。

\Java_ME_platform_SDK_3.0\bin\wscompile.exe -gen -cldc1.1 config.xml

このコマンドを実行すると、以下の図に示す出力が表示されます (Web サービスが、引数あるいは戻り値として、float 型または double 型を使用する場合は、-cldc1.1 を指定する必要があります。また、このコマンドを実行する間は、サーバー (Tomcat) が稼働中でなければなりません)。

図 5. スタブの生成
スタブの生成
  1. コマンドの実行が完了すると、<J2ME_SDK_HOME>bin\ ディレクトリー内に rpcdemo ディレクトリーが自動的に作成され、そこに生成されたファイルのなかに、このスタブ用クラスに対応する HelloWorldPortType_Stub.java ファイルが見つかるはずです。

クライアント・プロジェクトの作成

  1. Java ME SDK プラットフォームで、以下の図に示すようにプロジェクトを作成してください (「Create Hello MIDlet (Hello MIDlet の作成)」のチェック・マークは外します)。
図 6. Sun Java ME SDK 3.0 での新規プロジェクトの作成
Sun Java ME SDK 3.0 での新規プロジェクトの作成
  1. 「Test」プロジェクト内に、「rpcdemo」という名前のパッケージを作成し (図 7 を参照)、<J2ME_SDK_HOME>bin\rpcdemo\ ディレクトリーにある、スタブ用の Java ファイルを「rpcdemo」パッケージ内にコピー・アンド・ペースします (図 8 を参照)。
図 7. Sun Java ME SDK 3.0 でのパッケージの作成
Sun Java ME SDK 3.0 でのパッケージの作成
図 8. スタブ用のファイルの追加
スタブ用のファイルの追加
  1. 「rpcdemo」パッケージ内に、今度は「HelloMid」という名前の新規 Midlet を作成し (図 9 を参照)、以下の順でコードを作成します。
    • フォームを作成します。
    • フォームにテキスト・フィールドを追加します。
    • スタブ用のオブジェクトを作成します。
    • object._setProperty() という形式の関数を使用して、エンドポイント・インターフェースを指定します。
    • object.method(parameters) という形式で、サービス・メソッドを呼び出します。
    • 戻り値を処理して表示します。
図 9. Sun Java ME SDK 3.0 での Midlet の作成
Sun Java ME SDK 3.0 での Midlet の作成
リスト 3. HelloMid.java
package rpcdemo;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.*;
import java.rmi.RemoteException;
public class HelloMid extends MIDlet implements Runnable, CommandListener {
Display display;
private Form f;
private TextField tf;
private Command sendCom = new Command("Send", Command.ITEM, 1);
private Command exitCom = new Command("Exit", Command.EXIT, 1);
String name = "";
public void startApp() {
display = Display.getDisplay(this);
f = new Form("Hello Client");
tf = new TextField("Send:", "", 30, TextField.ANY);
f.append(tf);
f.addCommand(sendCom);
f.addCommand(exitCom);
f.setCommandListener(this);
display.setCurrent(f);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable d) {
if (c == sendCom) {
name = tf.getString();
/* Start a new thread so that the remote invocation won't block the process */
new Thread(this).start();
}
if (c == exitCom) {
notifyDestroyed();
destroyApp(true);
}
}
public void run() {
try {
/* Create Stub and set URL for the service*/
HelloWorldPortType_Stub service = new HelloWorldPortType_Stub();
service._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, 
               "http://localhost:8080/axis2/services/HelloWorld");
	      
println("Connecting...");
String msg = service.sayHello(name);
println(msg);
} catch (Exception e) {
println(e.toString());
}
}
private void println(String s) {
f.append(s + "\n");
}
}
  1. 最後にプロジェクトをビルドします (コンソールにビルド成功のメッセージが表示されます)。ビルドが完了したら、「Run (実行)」ボタンをクリックして J2ME エミュレーターを実行します (図 10 を参照)。
図 10. Sun Java ME SDK 3.0 の J2ME エミュレーター
Sun Java ME SDK 3.0 の J2ME エミュレーター
  1. Menu (メニュー)」ボタンを選択して、「Qwerty」を選択します。次に、「ABC」(エミュレーター自体から文字を入力する場合) または「Virtual (仮想)」(キーボードから文字を入力する場合) を選択します。そして最後に、自分の名前を入力します (この例では「KUNTAL GANGULY」)。図 11 を参照してください。
図 11. J2ME エミュレーターでのストリングの入力
J2ME エミュレーターでのストリングの入力
  1. 「Menu (メニュー)」から「Send (送信)」を選択します (図 12 を参照)。
図 12. エミュレーターで「Send (送信)」を選択する
エミュレーターで「Send (送信)」を選択する
  1. 以下の図のような画面が表示されます。
図 13. エミュレーターの画面での出力
エミュレーターの画面での出力

これで、「Hello World」Web サービスの例は完了です。次のセクションでは、WebSphere Application Server Community Edition にデプロイされた Web サービスに、J2ME クライアントからアクセスする方法を説明します。


WASCE にデプロイされた Web サービスに J2ME クライアントからアクセスする

はじめに

このセクションでは Eclipse IDE を使って開発した「ログイン」Web サービスを WebSphere Application Server Community Edition (WASCE) にデプロイし、この Web サービスにアクセスする方法を説明します。この例では、J2ME クライアントが「ログイン」Web サービスを介してデータベース (この例の場合、MySQL) にアクセスします (注: J2ME は、単独では直接データベースにアクセスすることはできません)。手順を開始する前に、WASCE と Eclipse IDE について簡単に説明しておきます。

Websphere Application Server Community Edition (WASCE): IBM WebSphere Application Server Community Edition は、IBM WebSphere Application Server ファミリーのメンバーです。WASCE は、Apache Software Foundation のオープンソース・アプリケーション・サーバー・プロジェクトである Apache Geronimo をベースとした軽量のJava EE (Java Platform Enterprise Edition) アプリケーション・サーバーとなっています。WASCE のコミュニティーは、Java EE ソリューションの設計、開発、デプロイに携わる人々や企業、さらには Java EE ソリューションを利用する人々や企業に至るまであらゆる人々や企業で構成されています。WASCE の最新バージョンは、http://www.ibm.com/developerworks/downloads/ws/wasce/ にアクセスして入手してください。

Eclipse IDE: 統合開発環境 (Integrated Development Environment: IDE) とは、コンピューター・プログラムを作成、編集、コンパイル、実行するためのオール・イン・ワン・ツールのことで、なかでも Eclipse は極めて優れた統合開発環境を提供します。www.eclipse.org で、Eclipse の最新リリースを調べてください (このチュートリアルでは Eclipse3.4 を使用しています)。

MySQL: MySQL ソフトウェアは、マルチスレッドおよびマルチユーザーに対応した非常に高速で堅牢な SQL (Structured Query Language) データベース・サーバーです。MySQL サーバーはミッション・クリティカルな高負荷の本番システム用というだけではなく、大規模にデプロイされるソフトウェアの組み込みデータベースを意図して作られています。MySQL は MySQL AB の登録商標です。MySQL インストール・パッケージは、http://dev.mysql.com/downloads/ からダウンロードすることができます。

Eclipse WTP (Web Tools Platform): Eclipse WTP は、Eclipse プロジェクトで作成されたソフトウェアに加え、他のオープンソース・プロジェクトによるサード・パーティー製ソフトウェアで構成されています。このプラグインによって構築される環境では、J2EE ベースのアプリケーションを簡単に開発することができます。このプラグインの zip ファイルは、http://www.eclipse.org/webtools/ からダウンロードすることができます。ダウンロードしたファイルは、eclipse ディレクトリー (Eclipse IDE をダウンロードして解凍した場所) に解凍し、IDE を再起動してください。

WebSphere Application Server Community Edition Eclipse Plug-in (WEP): Eclipse 内で WASCE を扱うには、WEP をインストールする必要があります。WEP は、WASCE を使用した Eclipse での Web アプリケーション開発を容易にするためのアダプターです。このプラグインの zip ファイルは http://public.dhe.ibm.com/software/websphere/wasce/updates/ からダウンロードすることができます。ダウンロードしたファイルは、eclipse ディレクトリー (Eclipse IDE をダウンロードして解凍した場所) に解凍し、Eclipse IDE を再起動してください。

このプラグインは、インターネットから直接インストールすることもできます。その場合には、以下の手順に従ってください。

  1. Eclipse を起動します。
  2. 「Help (ヘルプ)」 > 「Software Updates (ソフトウェア更新)」の順に選択します。
  3. Available Software (使用可能なソフトウェア)」タブを選択し、「Add Site (サイトの追加)」ボタンをクリックします。URL として、「http://public.dhe.ibm.com/software/websphere/wasce/updates/」を入力します。
  4. Eclipse を再起動します。

環境を構築する

  1. MySQL コネクターの jar ファイル (mysql-connector-java-3.0.17-ga-bin または mysql-connector-java-5.1.13) をダウンロードします。この jar ファイルを <JAVA_HOME>jdk1.7\lib ディレクトリーにコピー・アンド・ペーストして、CLASSPATH 環境変数にそのパスを設定します (以下を参照)。
図 14. CLASSPATH 環境変数の設定
CLASSPATH 環境変数の設定
  1. 以下に示す logintab テーブルを作成します。
リスト 4. テーブル DDL の作成
CREATE TABLE 'logintab' (
  'username' varchar(30) default NULL,
  'password' varchar(20) default NULL,
  'profession' varchar(40) default NULL
);
図 15. mysql テーブルの取得
mysql テーブルの取得

Eclipse および WASCE を使用して「ログイン」Web サービスを開発、デプロイする

  1. Eclipse WTP プラグインをインストールします。
  2. <JAVA_HOME> 内に lib ディレクトリーを作成し、<JAVA_HOME>jdk1.7\lib 内の tool.jar ファイルを <JAVA_HOME>lib にコピー・アンド・ペーストします。
  3. Eclipse で WASCE を構成します。WEP をインストールした後、Eclipse を再起動して「Window (ウィンドウ)」 > 「Open Perspective (パースペクティブを開く)」 > 「Other (その他)」の順に選択します。以下の図に示されているように「Java EE (default) (Java EE (デフォルト))」を選択して、「OK」をクリックします。
図 16. Eclipse でのパースペクティブの変更
Eclipse でのパースペクティブの変更
  1. これで、画面の下部に「Servers (サーバー)」タブが表示されるようになります (図 17 を参照)」。このタブの空白のスペースを右クリックして、以下の図に示すように「New (新規)」 > 「Server (サーバー)」の順に選択します。この操作により、新規サーバーがタブに追加されます。何らかの理由で「Servers (サーバー)」タブが表示されない場合は、「Window (ウィンドウ)」 > 「Show View (ビューの表示)」に進んで「Servers (サーバー)」ビューを選択してください。
図 17. 新規サーバーのインスタンス化
新規サーバーのインスタンス化
  1. 以下に示すように、「IBM WASCE v2.1 Server」を選択し、「Next (次へ)」をクリックします。
図 18. WASCE v2.1 サーバーの選択
WASCE v2.1 サーバーの選択
  1. JRE を指定し、「Browse (参照)」をクリックして WASCE をインストールした場所を指定します (図 19 を参照)。「Next (次へ)」をクリックします。
図 19. サーバー・ランタイム環境の設定
サーバー・ランタイム環境の設定
  1. WASCE サーバー管理者のユーザー ID (デフォルトは「system」) とパスワード (デフォルトは「manager」) を設定します。以下の図のように設定した後、「Next (次へ)」をクリックします。
図 20. localhost とその RMI ポートの設定
localhost とその RMI ポートの設定

Add and Remove Projects (プロジェクトの追加および除去)」ウィンドウでは、単に「Finish (終了)」をクリックします。これで、WASCE が Eclipse 内で機能するように構成されました。「Servers (サーバー)」タブには上記の手順で指定したサーバーが以下の図のように表示されているはずです。サーバーの起動停止をするには、以下の図に示されている、それぞれに対応する「Start the server (サーバーを始動)」ボタンや「Stop the server (サーバーを停止)」ボタンを使用します。サーバーを起動すると、「State (状況)」列の値が「Started (始動済み)」に変わります。

図 21. WASCE サーバーの起動
WASCE サーバーの起動

注: カスタム・デプロイメント環境プロファイルの作成中に、JVM が永続世代ヒープのスペースを使い果たすと、「PermGen Space」エラーが発生します (PermGen は、仮想マシン内の永続世代オブジェクト (クラス名、内在化ストリング、ガーベッジ・コレクションの対象にならないオブジェクトなど) です)。この場合の簡単な解決方法は、メモリーを多く使うことになりますが、以下のようにしてこれらのオブジェクトの最大スペースを拡大することです。

この解決方法では、まず Eclipse を終了します。コマンド・プロンプトでカレント・ディレクトリーを Eclipse のインストール・ディレクトリーに変更し、以下のコマンドを入力します。

一般的な構文:

eclipse [normal arguments] -vmargs -XX:PermSize=64M -XX:MaxPermSize=128M 
[more VMargs]
eclipse.exe -vmargs -Duser.language=en -Xms128M -
        Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

Web サービスをセットアップする

  1. Eclipse を起動し、「JavaEE」パースペクティブで「File (ファイル)」 > 「New (新規)」 > 「Other (その他)」 > 「Dynamic Web Project (動的 Web プロジェクト)」の順に選択します。以下の 2 つの図に、この操作を示します。
図 22. Eclipse での新規プロジェクトの作成
Eclipse での新規プロジェクトの作成
図 23. 動的 Web プロジェクトの選択
動的 Web プロジェクトの選択
  1. 「LoginService」という名前のプロジェクトを作成します。このプロジェクトでは、「Target runtime (ターゲット・ランタイム)」環境には「IBM WASCE v2.1 2」を選択し、「Configuration (構成)」としては「Default Configuration for IBM WASCE v2.1 2 (IBM WASCE v2.1 2 デフォルト構成)」を選択します (図 24 を参照)。
図 24. プロジェクトの名前とランタイムの指定
プロジェクトの名前とランタイムの指定
  1. 「Project Explorer (プロジェクト・エクスプローラー)」タブで「LoginService」プロジェクトを展開し、「Java Resource: src (Java リソース: src)」を選択して、図 25 に示すような操作をすることで「com.ibm.wasce.login」というパッケージを作成します。
図 25. Eclipse での新規パッケージの作成
Eclipse での新規パッケージの作成
  1. 次は、図 26 に示すような操作をすることで「com.ibm.wasce.login」パッケージ内にインターフェース (LoginSEI) を作成します。このインターフェースには、Web サービス・アノテーションとメソッドを追加します。追加するメソッドは、パラメーターとしてユーザー名とパスワードを受け取り、ストリングを返すメソッドです。
図 26. Eclipse での新規インターフェースの作成
Eclipse での新規インターフェースの作成
リスト 5. LoginSEI.java
package com.ibm.wasce.login;

import javax.jws.WebService;

@WebService (name="LoginSEI",targetNamespace="http://login.wasce.ibm.com")

public interface LoginSEI {

public String loginDB(String Username, String userpass);
}
  1. 「com.ibm.wasce.login」パッケージ内に、今度は「login」という名前のクラスを作成します (図 27 を参照)。
図 27. Eclipse での新規クラス・ファイルの作成
Eclipse での新規クラス・ファイルの作成
リスト 6. login.java
package com.ibm.wasce.login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.jws.WebService;

import com.ibm.wasce.login.LoginSEI;
@WebService (serviceName = "LoginService",portName = "LogPort",
		endpointInterface = "com.ibm.wasce.login.LoginSEI",
		targetNamespace = "http://login.wasce.ibm.com")

public class login implements LoginSEI{

	
	
Connection conn = null;
Statement st=null;
ResultSet rs=null;
String url = "jdbc:mysql://localhost:3306/";
String dbName = "test";
String driver = "com.mysql.jdbc.Driver";
String userName = "root"; 
String password = "secret";
String s="";
String m="";
public String loginDB(String username,String userpass){
     
    
    

    
try {
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(url+dbName,userName,password);

String strQuery="select * from logintab where username='"+username+"' and  
                                                password='"+userpass+"'";
           
st = conn.createStatement();
rs = st.executeQuery(strQuery);
          
rs.next();
System.out.println("SUCCESS");
s=rs.getString(1);
m=rs.getString(3);
          
    } catch (SQLException e) {
return("User is NOT registered");
        
    }

    catch (Exception e)
    {
       
System.err.println ("CANNOT CONNECT TO DATABASE.....");
    }
return ("WELCOME   '  "+ s+"  '     Your Profession:    "+m);
	      
         
    }
	
}
  1. web.xml を編集して、<web-app> .. </web-app> の中に以下のコードを追加します。
リスト 7. web.xml
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.ibm.wasce.login.login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/LOGIN</url-pattern>
</servlet-mapping>
  1. ここでプロジェクトを保存します。続いてこのプロジェクトを選択して右クリックし、表示されるメニューから以下の図に示すように「Run As (実行)」 > 「Run on Server (サーバーで実行)」の順に選択します。
図 28. サーバーでの実行
サーバーでの実行
  1. 「LoginService」を選択し、「Add (追加)」をクリックしたから、「Finish (終了)」をクリックします (図 29 を参照)。
図 29. サーバーへのプロジェクトのデプロイ
サーバーへのプロジェクトのデプロイ
  1. ブラウザーを開いて http://localhost:8080/LoginService/LOGIN にアクセスし、「LoginService」を表示します (図 30 を参照)。
図 30. デプロイされたサービスの表示
デプロイされたサービスの表示
  1. WSDL を確認するには、http://localhost:8080/LoginService/LOGIN?WSDL にアクセスしてください。

J2ME クライアントをセットアップする

このセクションでは、J2ME クライアントから、WASCE にデプロイされた「LoginService」Web サービスを利用する方法を説明します。この例では、http://localhost:8080/LoginService/LOGIN にアクセスして「LoginService」Web サービスを表示します。

上記の URL にナビゲートすると、サービスと loginDB(String username, String userpass) メソッドが表示されます。このメソッドをリモートの Java ME Midlet から呼び出すことになります。

スタブ・クラスを生成する

クライアント・スタブを生成する方法は、前の「Hello World」Web サービスの例で説明した方法と同様です。ただし、config.xml ファイルで、WSDL の URL を http://localhost:8080/LoginService/LOGIN?WSDL に変更し、packageName を LoginStubs (任意のパッケージ名にすることができます) に変更してください。

クライアント・プロジェクトを作成する

クライアント・プロジェクトは、前の「Hello World」Web サービスの例と同じ方法で作成します。

  • Java ME SDK プラットフォームを起動して、プロジェクトを作成します (「Create Hello MIDlet (Hello MIDlet の作成)」のチェック・マークは外します)。
  • 「LogClient」という名前のプロジェクトを作成し、そのプロジェクト内に、「LoginStubs」パッケージを作成します。<J2ME_SDK_HOME>bin\LoginStubs\ ディレクトリー内のすべてのスタブ用の Java ファイルをコピーして、「LoginStubs」パッケージに貼り付けます。
  • 「LoginStubs」パッケージ内に新しい Midlet (LogMid) を作成し、以下の内容を追加します。
    • フォームを作成します。
    • フォームに「username (ユーザー名)」と「password (パスワード)」という 2 つのテキスト・フィールドを追加します。
    • スタブ用のオブジェクトを作成します。
    • object._setProperty() という形式の関数を使用してエンドポイント・インターフェースを指定します。
    • object.method(parameter,parameter) という形式で、サービス・メソッドを呼び出します。
    • 戻り値を処理して表示します。
リスト 8. LogMid.java
package LoginStubs;

   import javax.microedition.midlet.*;
   import javax.microedition.lcdui.*;
   import java.io.*;
   import java.util.*;
   import java.rmi.RemoteException;

public class LogMid extends MIDlet implements Runnable, CommandListener {

Display display;
private Form f;
private TextField tf,cf;
private Command sendCommand = new Command("Send", Command.ITEM, 1);
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
String name = "";
String pass = "";

public void startApp() {

display = Display.getDisplay(this);
f = new Form("Login Client");
tf = new TextField("Username:", "", 30, TextField.ANY);
cf = new TextField("Password:", "", 30, TextField.PASSWORD);
f.append(tf);
f.append(cf);
f.addCommand(sendCommand);
f.addCommand(exitCommand);
f.setCommandListener(this);
display.setCurrent(f);

	  }

public void pauseApp() {}

public void destroyApp(boolean unconditional) {}

public void commandAction(Command c, Displayable d) {

if (c == sendCommand) {
name = tf.getString();
pass = cf.getString();
  /* Start a new thread so that the remote invocation won't block the process.*/
new Thread(this).start();
	    }
if (c == exitCommand) {
notifyDestroyed();
destroyApp(true);
	    }
	  }

public void run() {
try {
/* Create Stub and set URL for the service*/
 LoginSEI_Stub service = new LoginSEI_Stub();
 service._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, 
                        "http://localhost:8080/LoginService/LOGIN");

println("Connecting...");
String msg = service.loginDB(name,pass);
println(msg);
	      	    } catch (Exception e) {
println(e.toString());
        }
    }

private void println(String s) {
f.append(s + "\n");
    }
        }
  • 最後にプロジェクトをビルドします (コンソールにビルド成功のメッセージが表示されます)。ビルドが完了したら、「Run (実行)」ボタンをクリックして J2ME エミュレーターを実行します。
  • J2ME エミュレーターが立ち上がった図 31 の画面で、「Menu (メニュー)」ボタンを選択して、「Qwerty」を選択します。次に「ABC」(エミュレーター自体から文字を入力する場合) または「Virtual (仮想)」(キーボードから文字を入力する場合) を選択します。そして最後に、アクセスしたい Profession (職業) に対応するユーザー名とパスワード (この例の場合、ユーザー名は「Partha」、パスワードは「goswami」) を入力し、「Menu (メニュー)」から「SEND (送信)」を選択します。
図 31. Sun Java ME SDK 3.0 の J2ME エミュレーターを実行しているときの表示
Sun Java ME SDK 3.0 の J2ME エミュレーターを実行しているときの表示

以下のような画面が表示されます (図 32 を参照)。

図32. ログインするためにユーザー名とパスワードを入力して送信した後に表示される画面
図32. ログインするためにユーザー名とパスワードを入力して送信した後に表示される画面

これで、「ログイン」Web サービスの例は完了です。


J2ME クライアントから .NET Web サービスにアクセスする

はじめに

このセクションでは、J2ME クライアントから (localhost ではなく) インターネットですでにホストされている Web サービスを利用する方法を説明します。

この例では、.NET プラットフォーム上に作成された「株価情報」Web サービスにアクセスします。

このリンクをクリックして、http://www.webservicex.net/stockquote.asm にアクセスしてください。

上記の URL にナビゲートすると、サービス記述、そして getQuote(String name) メソッドが表示されます。このメソッドをリモートの Java ME Midlet から呼び出すことになります。

図 33. 株価情報をホストする「株価情報」Web サービス
株価情報をホストする「株価情報」Web サービス

Web ページの右側にある「Service Description (サービス記述)」リンクをクリックすると、「株価情報」Web サービスの WSDL が表示されます。このサービスはすでにデプロイされていてアクティブになっているので、ここで必要となる作業は、クライアントを作成し、スタブからサービスを呼び出すことだけです。

スタブ・クラスを生成する

クライアント・スタブを生成する方法は、前の「Hello World」Web サービスの例で説明した方法と同様です。ただし、config.xml ファイルで、WSDL の URL を http://www.webservicex.net/stockquote.asmx?wsdl に変更し、packageName を stockdemo (任意のパッケージ名にすることができます) に変更してください。

クライアント・プロジェクトを作成する

  • Java ME SDK プラットフォームを起動して、プロジェクトを作成します (「Create Hello MIDlet (Hello MIDlet の作成)」のチェック・マークは外します)。
  • 「Quote」という名前のプロジェクトを作成し、そのプロジェクト内に、「stockdemo」という名前のパッケージを作成します。<J2ME_SDK_HOME>bin\stockdemo\ ディレクトリー内のすべてのスタブ・ファイルをコピーして、「stockdemo」パッケージに貼り付けます。
  • 「stockdemo」パッケージ内に新しい Midlet (StockMid) を作成し、以下のコードを追加します。
リスト 9. StockMid.java
package stockdemo;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.*;
import java.rmi.RemoteException;

public class StockMid extends MIDlet implements Runnable, CommandListener {
Display display;
private Form f;
private TextField tf;
private Command sendCommand = new Command("Send", Command.ITEM, 1);
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
String name = "";
public void startApp() {
display = Display.getDisplay(this);
f = new Form("Stock Client");
tf = new TextField("Stock Quote:", "", 30, TextField.ANY);
f.append(tf);
f.addCommand(sendCommand);
f.addCommand(exitCommand);
f.setCommandListener(this);
display.setCurrent(f);
	  }
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable d) {
if (c == sendCommand) {
name = tf.getString();
/* Start a new thread so that the remote invocation won't block the process.*/
new Thread(this).start();
	    }
if (c == exitCommand) {
notifyDestroyed();
destroyApp(true);
	    }
	  }
public void run() {
	    try {
/* Create Stub and set URL for the service*/
 StockQuoteSoap_Stub service = new StockQuoteSoap_Stub();
 service._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, 
                    "http://www.webservicex.net/stockquote.asmx");

println("Stock Quote for:"+tf.getString());
String msg = service.getQuote(name);
println(msg);
	      	    } catch (Exception e) {
println(e.toString());
        }
    }

private void println(String s) {
f.append(s + "\n");
    }
        }
  • 最後にプロジェクトをビルドします (コンソールにビルド成功のメッセージが表示されます)。ビルドが完了したら、「Run (実行)」ボタンをクリックして J2ME エミュレーターを実行します。
  • エミュレーターで「Menu (メニュー)」ボタンを選択して、「Qwerty」を選択します。次に「ABC」(エミュレーター自体から文字を入力する場合) または「Virtual (仮想)」(キーボードから文字を入力する場合) を選択します。そして最後に、アクセスしたい株価情報の名前または銘柄記号を入力し (この例の場合、IBM)、「Menu (メニュー)」から「SEND (送信)」を選択します (図 34 を参照)。
図 34. エミュレーターでの株式銘柄の入力
エミュレーターでの株式銘柄の入力
  • 株価情報が XML フォーマットで表示されます (図 35 を参照)。
図 35. XML フォーマットでの特定の株価情報の表示
XML フォーマットでの特定の株価情報の表示

これで、「株価情報」Web サービスの例は完了です。


結論とまとめ

結論

以上の 3 つの例で、J2ME を使用して SOA の方法論に従った疎結合方式で最近の技術を利用する方法を概説しました。

まとめ

このチュートリアルでは、Eclipse IDE と Sun WTK を使用する方法を説明しました。また、Web サービスを開発して、さまざまなサーバーにデプロイし、Sun WTK で開発した J2ME クライアントから Web サービスを利用する方法も説明しました。これらの無料のツールを使用することで、Java 開発者は携帯電話向け J2ME アプリケーションの開発方法について短時間で学習してプロトタイプを作成することができます。


ダウンロード

内容ファイル名サイズ
Sample files for this tutorialCode.zip14KB

参考文献

  • Java クライアントで Web サービスを呼ぶ」(developerWorks、2003年11月) では、Java Web サービス・クライアント・コードを作成するさまざまな方法を説明しています。
  • Eclipse: A Brief Introduction」: Eclipse の基本的なアーキテクチャーとそのコンポーネント、そして標準ユーザー・インターフェースの概要を簡潔に説明するとともに、Eclipse ベースの製品の概要を紹介しています。
  • An Introduction to the Eclipse IDE」: Eclipse IDE の多種多様なコンポーネントを使用してプロジェクトを構築する方法を学んでください。
  • Eclipse オンライン・ヘルプ: このヘルプ・ガイドを有用なリソースとして参考にしてください。
  • Notes on the Eclipse Plug-in Architecture」: プラグインについて、そして Eclipse ワークベンチでプラグインを生成する仕組みとは関係なく、プラグイン拡張を定義し、処理する方法について深く理解してください。
  • JSR 172: J2METM Web Services Specification: この仕様の目的は、J2ME から Web サービスへの標準アクセスを提供するオプション・パッケージを定義することです。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services
ArticleID=782731
ArticleTitle=Web サービスを開発し、J2ME クライアントからアクセスする
publish-date=01062012