JAX-WS (Java API for XML Web Services) 2.0、JSR 224 は、Java EE 5 プラットフォームの重要な部分です。 JAX-RPC (Java API for XML-based RPC 1.1) の追加リリースである JAX-WS は、Java テクノロジを使用した Web サービスの開発作業を簡素化します。 また、SOAP 1.1、SOAP 1.2、XML のような複数のプロトコルをサポートし、HTTP など追加のプロトコルをサポートするための機能を提供することによって、JAX RPC 1.1 における問題の一部が解決されています。 JAX-WS は、データバインディングのために JAXB 2.0 を使用し、生成されたサービスエンドポイントインタフェースを制御するためのカスタマイズをサポートしています。 また、注釈のサポートによって、JAX-WS は Web サービスの開発を簡素化し、実行時の JAR ファイルのサイズを削減します。
このドキュメントでは、IDE を使用して JAX-WS Web サービスを開発し、Java SE アプリケーションの Java クラス、Web アプリケーションのサーブレット、または Web アプリケーションの JSP ページという、3 つの異なるクライアントで利用する基本的な手順を学ぶことができます。 このドキュメントで作成するこれら 3 つのクライアントは別々のアプリケーションですが、すべて同じ Web サービスを利用します。
注: Tomcat Web サーバーへ配備することも可能ですが、Tomcat Web サーバーには Web コンテナしかないので、次の節で EJB モジュール ではなく Web アプリケーションを作成してください。 JSR-109 Web サービスと異なり、JAX-WS Web サービス は Tomcat Web コンテナに正しく配備できます。
Web サービスの作成
この課題の目標は、使用する配備コンテナにふさわしいプロジェクトを作成することです。 プロジェクトを作成したら、そこに Web サービスを作成します。
コンテナの選択
Web サービスは、Web コンテナまたは EJB コンテナのどちらかに配備できます。 どちらにするかは、実装の選択に依存します。 たとえば、Web コンテナだけを持つ Tomcat Web サーバーへの配備を予定している場合は、EJB モジュールではなく、Web アプリケーションの作成を選択するようにします。
Web サービスに「CalculatorWS」という名前を付け、「パッケージ」に「org.me.calculator」と入力し、「完了」をクリックします。
新しい Web サービスが「プロジェクト」ウィンドウに表示されます。 たとえば、Web アプリケーションの場合、「プロジェクト」ウィンドウは次のように表示されます。
このサーバーに必要な配備記述子があれば、IDE によって自動的に作成されます。 Sun Java System Application Server の場合は、配備記述子は必要ありません。 Tomcat Web サーバーに配備される Web サーバーの場合は、sun-jaxws.xml と、web.xml の WSServlet 項目とが追加されます。
@WebMethod
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
// TODO implement operation
return 0;
}
この add メソッドを次のように変更します (太字部分が変更箇所)。
@WebMethod
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
int k = i + j;
return k;
}
まとめ
この課題では、Web サービスにコードを追加しました。
Web サービスの配備とテスト
Web コンテナに Web サービスを配備すると、IDE によって、このサービスが期待どおりに機能するかを確認するテストができます。 この目的のために、Sun Java System Application Server によって提供される Tester アプリケーションが IDE に統合されています。 Tomcat Web サーバーにも同様のツールがあります。 ただし、Sun Java System Application Server の Tester ページでは値の入力とテストが可能ですが、Tomcat Web サーバーではできません。 後者の場合、Web サービスが配備されているかどうかの確認だけはできますが、値のテストはできません。 EJB モジュールが正常に配備されているかどうかをテストする機能は、今のところ利用できません。
Sun Java System Application Server に Web アプリケーションを配備した場合は、IDE によって、アプリケーションサーバーの起動、アプリケーションの構築、およびブラウザでテスト用ページの表示が行われます。 Tomcat Web サーバーの場合と、EJB モジュールを配備した場合は、次のように異なります。
Tomcat Web サーバーに配備した場合は、代わりに次のように表示されます。この画面は、Web サービスが正常に配備されたことを示しています。
EJB モジュールが正常に配備された場合は、「出力」ウィンドウに次のメッセージが表示されます。
Deployment of application CalculatorWSApplication completed successfully
Enable of CalculatorWSApplication in target server completed successfully
>Enable of application in all targets completed successfully
All operations completed successfully
run-deploy:
run:
BUILD SUCCESSFUL
Sun Java System Application Server に配備した場合は、次に示すように、テスト用ページに 2 つの数を入力します。
2 つの数の合計が次のように表示されます。
まとめ
この課題では、Web サービスの配備とテストを行いました。
Web サービスの消費
Web サービスの配備が終わったので、この Web サービスの add メソッドを利用するクライアントを作成する必要があります。 ここでは、Java SE アプリケーションの Java クラス、Web アプリケーションのサーブレット、および Web アプリケーションの JSP ページという 3 つのクライアントを作成します。
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ClientServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
try { // Web サービスオペレーションを呼び出す
org.me.calculator.client.CalculatorWSService service = new org.me.calculator.client.CalculatorWSService();
org.me.calculator.client.CalculatorWS port = service.getCalculatorWSPort();
// TODO ここで WS オペレーションの引数を初期化
int arg0 = 0;
int arg1 = 0;
// TODO ここで結果を処理
int result = port.add(arg0, arg1);
System.out.println("Result = " + result);
} catch (Exception ex) {
// TODO ここでカスタム例外を処理
}
out.println("</body>");
out.println("</html>");
out.close();
}
arg0 および arg1 の値を、たとえば 3 および 4 など、ほかの数字に変更します。
System.out.println 文を out.println に変更します。
例外がスローされたときに出力する行を追加します。
この try/catch ブロックは、次のようになります (強調部分は新規または変更の箇所)。
try { // Web サービスオペレーションを呼び出す
org.me.calculator.client.CalculatorWSService service = new org.me.calculator.client.CalculatorWSService();
org.me.calculator.client.CalculatorWSApplication port = service.getCalculatorWSApplicationPort();
// TODO ここで WS オペレーションの引数を初期化
int arg0 = 3;
int arg1 = 4;
// TODO ここで結果を処理
int result = port.add(arg0, arg1);
out.println("<p>Result: " + result);
} catch (Exception ex) {
out.println("<p>Exception: " + ex);
}