1) Webサービス用のプロジェクトの作成
メニューバーから[ファイル] > [新規] > [プロジェクト]を選択すると、[新規プロジェクト]ウィザードが表示されます。
[新規プロジェクト]ウィザードから[Web] > [動的 Web プロジェクト]を選択して、[次へ]をクリックします。
以下の設定項目を確認、入力してください。以下の情報を設定後、[次へ]をクリックします。
設定項目 | 設定内容 |
---|---|
プロジェクト名 | WebServiceSample6 |
ターゲット・ランタイム | Interstage Application Server V12.2 (Java EE 6) |
動的 Web モジュールバージョン | 3.0 |
構成 | Interstage Application Server V12.2 (Java EE 6) デフォルト構成 |
EARにプロジェクトを追加 | チェックしない |
[Java]ページが表示されますので、情報を確認後、[次へ]をクリックします。
設定項目 | 設定内容 |
---|---|
ビルド・パス上のソース・フォルダー | src |
デフォルト出力フォルダー | build\classes |
[Webモジュール]ページが表示されます。
以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックします。
設定項目 | 設定内容 |
---|---|
コンテキスト・ルート | WebServiceSample6 |
コンテンツ・ディレクトリー | WebContent |
web.xmlデプロイメント記述子の生成 | チェックする |
2) Webサービスの作成
2-1) データクラスの作成
国名と総人口の情報を保持し、そこから情報を取得するデータクラスを作成します。データクラスの作成は、作成したプロジェクトを選択して、右クリックでコンテキストメニューから[新規] > [クラス]を選択します。[新規Javaクラス]ウィザードが表示されます。
以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックします。
設定項目 | 設定内容 |
---|---|
ソース・フォルダー | WebServiceSample6/src |
パッケージ | sample6.webservice |
名前 | CountryData |
スーパークラスからのコンストラクター | チェックする |
以下のソースファイルが生成されます。
ソースファイル | 説明 |
---|---|
CountryData.java | データクラス |
国名と総人口を保持する処理を実装します。以下の赤字の箇所をソースに追加してください。
データクラスの実装(CountryData.java)
package sample6.webservice; public class CountryData { private String countryName; private int totalPopulation; public CountryData() { // TODO 自動生成されたコンストラクタスタブ } public CountryData(String name, int total) { setCountryName(name); setTotalPopulation(total); } public String getCountryName() { return countryName; } public void setCountryName(String countryName) { this.countryName = countryName; } public int getTotalPopulation() { return totalPopulation; } public void setTotalPopulation(int totalPopulation) { this.totalPopulation = totalPopulation; } } |
ポイント
フィールドを追加した後にクラスを選択している状態で、メニューから[ソース] > [getter および setter の生成]を選択することで、getter/setterの追加を行うことができます。
2-2) Webサービスのひな形の作成
WebサービスはJavaクラスの作成から行います。 作成したプロジェクトを選択して、右クリックでコンテキストメニューから[新規] > [クラス]を選択します。特別なJavaクラスを作成する必要はなく、ソースフォルダ、パッケージ、名前を指定してクラスを作成します。
以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックします。
設定項目 | 設定内容 |
---|---|
ソース・フォルダー | WebServiceSample6/src |
パッケージ | sample6.webservice |
名前 | PopulationRanking |
スーパークラスからのコンストラクター | チェックしない |
2-3) WebServiceアノテーションの宣言
作成したJavaクラスにWebServiceアノテーションを以下のように定義します。赤字の部分がWebServiceアノテーションの定義になります。
WebServiceアノテーションの定義
package sample6.webservice; import javax.jws.WebService; @WebService public class PopulationRanking { } |
2-4) Webサービスの実装
Webサービスとして公開したい機能のメソッドを実装します。以下の赤字の箇所をソースに追加してください。
Webサービスとして公開するメソッドの実装
package sample6.webservice; import javax.jws.WebService; @WebService public class PopulationRanking { private CountryData[] countries; public PopulationRanking(){ countries = new CountryData[]{ new CountryData("中国",1373490000), new CountryData("インド",1292710000), new CountryData("アメリカ",321600000), new CountryData("インドネシア",255460000), new CountryData("ブラジル",204460000), new CountryData("パキスタン",189870000), new CountryData("ナイジェリア",178720000), new CountryData("バングラデシュ",159860000), new CountryData("ロシア",143460000), new CountryData("日本",126980000) }; } public CountryData getCountryData(int rank){ --rank; if (9 < rank || rank < 0 ){ return null; } return countries[rank]; } } |
3) EARプロジェクトの作成
メニューバーから[ファイル] > [新規] > [プロジェクト]を選択すると、[新規プロジェクト]ウィザードが表示されます。
新規プロジェクトウィザードから[Java EE] > [エンタープライズ・アプリケーション・プロジェクト]を選択して、[次へ]をクリックします。
以下の設定項目を確認、入力してください。情報を設定後、[次へ]をクリックします。
設定項目 | 設定内容 |
---|---|
プロジェクト名 | WebServiceEARSample6 |
ターゲット・ランタイム | Interstage Application Server V12.2 (Java EE 6) |
EARバージョン | 6.0 |
構成 | Interstage Application Server V12.2 (Java EE 6) デフォルト構成 |
[エンタープライズ・アプリケーション]ページが表示されます。
以下の設定項目を確認、入力後、[完了]をクリックします。
設定項目 | 設定内容 |
---|---|
Java EE モジュール依存関係 | WebServiceSample6をチェックする |
コンテンツフォルダ | EarContent |
application.xmlデプロイメント記述子の生成 | チェックしない |
4) WSDL取得の準備
4-1) EARプロジェクトとサーバの関連付け
サーバビューでサーバを選択し、コンテキストメニューから[追加および除去]を選択します。
使用可能から作成したEARプロジェクトを選択し、[追加]をクリックします。構成済みにEARプロジェクトが追加されていることを確認してください。
以下の情報を設定後、[完了]をクリックします。
設定項目 | 設定内容 |
---|---|
構成済み | WebServiceEARSample6 |
4-2) サーバへの配備
サーバビューでサーバを選択し、コンテキストメニューから[開始]を選択します。
サーバが始動すると自動的にEARファイルが配備されます。
サーバビューで以下の情報を確認してください。
確認項目 | 確認内容 |
---|---|
サーバの状態 | 始動済み |
サーバの状況 | 同期済み |
EARファイル(WebServiceEARSample6)の状況 | 同期済み |
EARファイル配下のWARファイル(WebServiceSample6)の状況 | 同期済み |
4-3) WSDLのURL
エンドポイントのURLは、deployment descriptorにservlet-mappingを指定している場合は、そのURLになります。
今回は指定していないので、以下の形式になります。
http://ホスト名:ポート番号/コンテキストルート/Webサービス名 |
"ポート番号"は"サーバを追加する"の"HTTPポート番号"と同じ値になります。
このURLをクライアント作成時に利用します。今回はlocalhostのIJServerクラスタを利用するため、以下になります。
http://localhost:80/WebServiceSample6/PopulationRankingService?wsdl |
5) Webサービスクライアントの作成
本来であればWebアプリケーションをクライアントとして作成するための手順が必要ですが、ここではサンプルをインポートしてWebサービスクライアントとして重要なポイントを確認していきます。Webアプリケーションの作成についての詳細な手順を知りたい場合は、Webアプリケーションの"2.2 入門"を参照してください。
サンプルのインポートは次の手順で行います。
メニューから[ファイル] > [インポート]を選択します。表示されたインポートウィザードで[一般] > [既存プロジェクトをワークスペースへ]を選択します。[アーカイブ・ファイルの選択]をチェックし、[参照]ボタンを押して、以下のファイルを選択します。
<ワークベンチのインストールフォルダ>\sample\WebServiceSample6.zip
[プロジェクト]から[WebServiceClientSample6]を選択し、[完了]をクリックします。
WebServiceClientSample6プロジェクトのインポート後に、WebServiceEARSample6プロジェクトを選択して、右クリックでコンテキストメニューから[プロパティー]を選択します。
プロパティダイアログボックスの[デプロイメント・アセンブリー]を選択し、[追加]ボタンを押します。
[プロジェクト]を選択して[次へ]をクリックし、WebServiceClientSample6を選択して[完了]をクリックします。
注意
サンプルのWebServiceClientSample6プロジェクトは、localhostのIJServerクラスタでの動作を前提に作成されています。サンプルのインポート後に、サービスインタフェース(PopulationRankingService.java)内のWSDLのURLを確認して、環境に応じて修正してください。
5-1) クライアントプロジェクトの作成
Webサービスクライアントとして動的Webプロジェクトを作成します。サンプルのインポートで代替済みのため、詳細は省略します。設定項目は以下を参考にしてください。
設定項目 | 設定内容 |
---|---|
プロジェクト名 | WebServiceClientSample6 |
ターゲット・ランタイム | Interstage Application Server V12.2 (Java EE 6) |
動的 Web モジュールバージョン | 3.0 |
構成 | Interstage Application Server V12.2 (Java EE 6) デフォルト構成 |
EARにプロジェクトを追加 | チェックする |
EARプロジェクト名 | WebServiceEARSample6 |
5-2) WSDLからサービスエンドポイントインタフェースの作成
WSDLからWebサービスを呼び出すために必要なサービスエンドポイントインタフェースなどのファイルを作成する必要があります。インポートしたサンプルプロジェクトでは以下のように作成済みです。
ファイル名リストにある以下のファイルがソースフォルダ配下に作成されていることを確認してください。
ファイル名 | 備考 |
---|---|
PopulationRanking.java | サービスエンドポイントインタフェース |
PopulationRankingService.java | サービスインタフェース |
CountryData.java | データ定義クラス |
GetCountryData.java | データバインディングクラス |
GetCountryDataResponse.java | データバインディングクラス |
ObjectFactory.java | オブジェクト生成クラス |
package-info.java | パッケージ情報クラス |
ポイント
サービスエンドポイントインタフェースの作成手順
ijwsimportコマンドを使用してWSDLからサービスエンドポイントインタフェースを生成します。
コマンドプロンプトを開き、作業フォルダを作成します。
例:mkdir temp
作業フォルダに移動します。
例:cd temp
ソース出力先フォルダを作成します。
例:mkdir src
ijwsimportコマンドを使用して、作業フォルダにWebサービスクライアントに必要なソースを生成します。
ijwsimport -p <パッケージ名> -s <ソース出力先フォルダ> -keep <WSDLのURL>
例: ijwsimport -p stub -s src -keep http://localhost:80/WebServiceSample6/PopulationRankingService?wsdl
Webサービスクライアントプロジェクトのソースフォルダ配下に、4.の<ソース出力先フォルダ>のソースファイルをパッケージフォルダごとコピーします。WSDLファイルは不要です。
Webサービスクライアントプロジェクトを選択して、コンテキストメニュー > [リフレッシュ]を選択します。
作業フォルダを削除します。
上記5.および6.で追加したソースファイルでエラーが検出される場合には、引き続いて以下の手順でビルドパスの設定を行ってください。
Webサービスクライアントプロジェクトを選択して、右クリックでコンテキストメニューから[プロパティー]を選択します。
[Javaのビルド・パス] > [ライブラリー]タブ > [外部JARの追加]で以下に存在するJARファイルを追加します。
<製品インストールフォルダ>\APS\F3FMisje6\glassfish\modules\endorsed
<製品インストールフォルダ>\APS\F3FMisje6\glassfish\lib\endorsed
続けて[順序およびエクスポート]タブで、2.で追加したJARファイルを[JRE システム・ライブラリー]よりも上に移動して[OK]ボタンを押してください。
ijwsimportコマンドやWSDLのURLについては、"Interstage Application Server Java EE運用ガイド(Java EE 6編)"の"Webサービスアプリケーションの開発"の"配備とWSDLの取得・保管"を参照してください。
5-3) サーブレットクラスの作成
サーブレットクラスを作成します。インポートしたサンプルプロジェクトでは以下のような設定項目で作成済みです。
設定項目 | 設定内容 |
---|---|
Java パッケージ | sample6.webservice |
クラス名 | ServletController |
スーパークラス | javax.servlet.http.HttpServlet |
設定項目 | 設定内容 |
---|---|
名前 | ServletController |
URL マッピング | /ServletController |
設定項目 | 設定内容 |
---|---|
修飾子 | public |
どのメソッド・スタブを作成しますか? | スーパークラスからのコンストラクター |
5-4) 入出力画面の作成
入出力画面のJSPを作成します。インポートしたサンプルプロジェクトでは以下のようなファイルを作成済みです。
入力画面(default.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>世界総人口ランキング</title> </head> <body> <h1>入力画面</h1> <p>1~10の間で順位を入力してください。</p> <p></p> <form action="ServletController" method="post"> 順位:<br> <input name="rank" type="text" size="10">位<br> <p></p> <input type="submit" value="OK"> <input type="reset" value="クリア"> </form> </body> </html> |
出力画面(result.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>世界総人口ランキング</title> </head> <body> <h1>出力画面</h1> 総人口ランキング${param.rank}位は「${applicationScope.ranking.countryName}」です。<br> 総人口は${applicationScope.ranking.totalPopulation}人です。 <br> <hr> <form action="ServletController" method="post"> <input type="submit" value="入り口に戻る"> <input type="hidden" name="mode" value="top"> </form> </body> </html> |
エラー画面(error.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>世界総人口ランキング</title> </head> <body> <h1>エラー画面</h1> 指定された範囲内の順位が入力されていないか、またはサーバエラーです。<br> <br> <hr> <form action="ServletController" method="post"> <input type="submit" value="入り口に戻る"> <input type="hidden" name="mode" value="top"> </form> </body> </html> |
5-5) Dependency Injectionの指定
Webサービスを呼び出すための実装をサーブレットクラスに行います。インポートしたサンプルプロジェクトのサーブレットソースには実装済みです。
サービスインタフェースのフィールドを作成して、以下のようにWebServiceRefアノテーションを設定し、Dependency Injectionの指定を行います。
WebServiceRefアノテーションの定義
@WebServiceRef(name="service/PopulationRanking") private PopulationRankingService service; |
ポイント
J2EE1.4までのlookupメソッドの代わりに、Java EEではDependency Injectionを利用することで、オブジェクトを取得して使用することができます。(オブジェクトは実行時に自動的にJava EEコンテナによってフィールドに設定されます。)
5-6) Webサービスの呼び出し処理の実装
Webサービスの呼び出しは、以下のようにサービスエンドポイントインタフェースにオブジェクトを取得し、インタフェース経由でメソッドを呼び出します。作成したサーブレットクラスに以下のようにWebサービスの呼び出し処理を定義します。インポートしたサンプルプロジェクトのサーブレットソースには実装済みです。
Webサービスの呼び出しメソッドの定義
PopulationRanking business = service.getPopulationRankingPort(); CountryData country = business.getCountryData(rank); |
Webサービスの呼出しの実装を行ったサーブレットクラスは以下のようになります。(インポートしたプロジェクトのサーブレットソースは、この形式になっています。)
赤字の部分が実際には追加、変更する箇所になります。
サーブレットクラス(ServletController.java)
package sample6.webservice; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.ws.WebServiceRef; import stub.CountryData; import stub.PopulationRanking; import stub.PopulationRankingService; /** * Servlet implementation class ServletController */ @WebServlet("/ServletController") public class ServletController extends HttpServlet { private static final long serialVersionUID = 1L; @WebServiceRef(name="service/PopulationRanking") private PopulationRankingService service; /** * @see HttpServlet#HttpServlet() */ public ServletController() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("UTF-8"); ServletContext sc = getServletContext(); // 呼び出すファイル種別取得 String mode = request.getParameter("mode"); if (mode != null && mode.equals("top")) { // 入力画面のHTMLファイル呼出し RequestDispatcher inRd = getServletContext().getRequestDispatcher("/default.jsp"); inRd.forward(request, response); return; } int rank; // 入力チェック try{ rank = Integer.parseInt(request.getParameter("rank")); } catch (NumberFormatException e){ RequestDispatcher errRd = sc.getRequestDispatcher("/error.jsp"); errRd.forward(request, response); return; } PopulationRanking business = service.getPopulationRankingPort(); CountryData country = business.getCountryData(rank); //取得した値の確認 if (country == null){ RequestDispatcher errRd = sc.getRequestDispatcher("/error.jsp"); errRd.forward(request, response); return; } sc.setAttribute("ranking", country); RequestDispatcher outRd = sc.getRequestDispatcher("/result.jsp"); outRd.forward(request, response); } } |
6) アプリケーションの動作確認
6-1) プロジェクトとサーバの関連付け
クライアント作成の準備として実施しているため、実施する必要はありません。
6-2) ブレークポイントの設定
Webサービスクラス(PopulationRanking.java)のgetCountryData()メソッドの先頭行にブレークポイントを設定します。ブレークポイントは、エディタの左側のルーラー部分をダブルクリックして、設定または解除します。
6-3) サーバの起動
サーバビューでサーバを選択し、コンテキストメニューから[デバッグ]または[デバッグで再始動]または[接続(デバッグ始動)/ログイン]を選択します。
ポイント
デバッガを使用せず単純にアプリケーションを起動したい場合には、コンテキストメニューから[開始]を選択します。
サーバビューに配備先となるサーバが登録されていない場合は、サーバを追加する必要があります。サーバを追加する方法については、"6.2.7 アプリケーションの動作確認"を参照してください。
サーバが始動する際に自動的にEARファイルが配備されます。
サーバビューで以下の情報を確認してください。
確認項目 | 確認内容 |
---|---|
サーバの状態 | デバッグ |
サーバの状況 | 同期済み |
EARファイル(WebServiceEARSample6)の状況 | 同期済み |
EARファイル配下のWARファイル(WebServiceSample6)の状況 | 同期済み |
EARファイル配下のWARファイル(WebServiceClientSample6)の状況 | 同期済み |
6-4) アプリケーションの実行
サーバビューで、配備されているWebプロジェクト(WebServiceClientSample6)を選択して、コンテキストメニューから[Webブラウザ]を選択します。Webブラウザが起動されて、入力画面が開きます。
設定項目 | 設定内容(例) |
---|---|
入力画面のURL | http://localhost/WebServiceClientSample6/ |
[順位:]の入力フィールドに人口ランキングの順位を入力して、[OK]をクリックします。
注意
接続確認のURLに指定されるポート番号については、"6.2.7 アプリケーションの動作確認"のHTTPポート番号を参照してください。
ポイント
プロジェクトを選択し、コンテキストメニューから[実行] > [サーバーで実行]または[デバッグ] > [サーバーでデバッグ]を選択することで、サーバの追加、プロジェクトの追加、サーバの起動、クライアントの起動をまとめて行うことができます。
また、クライアントとして使用するWebブラウザは、メニュー [ウィンドウ] > [Web ブラウザ] から変更することができます。
6-5) アプリケーションのデバッグ
アプリケーションが動作し、ブレークポイントで中断されます。変数ビューの表示を確認します。メニューから[実行] > [ステップ・オーバー]を選択し、変数ビューでプログラムの状況を確認します。
デバッグについては、"6.2.7.1 デバッグする"を参照してください。
ポイント
変数ビューでは値の確認だけでなく、変更も行うことができます。
デバッガで中断している処理は、メニューから[実行] > [再開]を選択することで再開され、サーバ側での処理が終了し、Webブラウザに出力画面が表示されます。入力した順位の国名と総人口が表示されることを確認してください。
7) 運用環境へのアプリケーションの配布
このアプリケーションを運用環境に配布するには、EARファイルを作成する必要があります。作成したEARファイルは、サーバの配備機能を利用して、サーバに配備します。
7-1) アプリケーションのエクスポート
EARファイルの作成は、エクスポートウィザードから行います。エクスポートウィザードを起動するには、[ファイル] > [エクスポート]を選択します。[エクスポート]ウィザードから[Java EE] > [EARファイル]を選択し、[次へ]をクリックします。
[EARエクスポート]ページが表示されます。
以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックします。
設定項目 | 設定内容 |
---|---|
EAR プロジェクト | エンタープライズアプリケーションプロジェクトを指定します。 |
宛先 | EARファイルの作成先を指定します。 |
"Interstage Application Server V12.2 (Java EE 6)"の場合、[エクスポート]ウィザードの[特定のサーバー・ランタイムに最適化]の指定は、エクスポート結果に影響しません。
7-2) 運用環境への配布
運用環境への配備はサーバの配備機能を利用します。asadminコマンドを使い、WARファイルを配備してください。