前回までのエントリでJBIを使ったSOAアプリケーションのメイン部分を開発することができました。
せっかくなので,プレゼンテーションの部分を作って,エンド・ツー・エンドのアプリケーションに仕上げてみたいと思います。BPELのエントリポイントを呼び出せれば何でも良いのですが,Java EE 5から標準で組み込まれることになったJSF (Java Server Faces)を使ってみたいと思います。
(*) NetBeans Enterprise PackにはSun Java Studio Creator 2のようなWYSIWIGのWeb画面編集環境が無いので,エディタでちょろっと作ってみたいと思います。
Sun Java Studio Creator 2には,WebサービスをベースにJSFアプリケーションをWYSIWIGで開発する機能がありますので,興味のある方は
チュートリアルを参考にチャレンジしてみていただければと思います。
また,現在NetBeans 5.5にSun Java Studio Creator 2の機能を組み込むためのプラグイン
Creator Packが開発中とのことですので,そのうちNetBeans Enterprise PackでJSFのWYSIWIG開発環境が使えるようになるでしょう。
1. プロジェクトの作成
[File]-[New Project]から,[Web]-[Web Application]を選択します。
Project Name: "PricingWebApp"を入力して[Next],Frameworksとして"Java Server Faces"をチェックしてプロジェクトを生成します。
2. Webサービスクライアントの生成
プロジェクトPricingWebAppで右クリック,[New]-[File/Folder]から,[Web Service]-[Web Service Client]を選択します。
Local Fileとして,前々回のエントリでローカルファイルとして保存,編集したBooksPricingProcessWebServiceBean.wsdlを指定します。
Package Name: "bpclient"とでもしておきましょう。
そうすると,プロジェクト配下に[Web Service References]-[BooksPricingProcessWebServiceBean]というノードが作成されます。
3. JSF Managed Beanの開発
JSFのManaged Beanというのは,画面の入出力にマッピングされるプロパティを管理したり,画面イベントに対応するアクション処理をアクションメソッドとして実装したりする,JavaBeansの一種だと思っていただければよいと思います。
(1) Managed Beanの生成
プロジェクトPricingWebAppで右クリック,[New]-[JSF Managed Bean]を選択します。
- Class Name: PricingManagedBean
- Package Name: webapp
として,Managed Beanの雛形を生成します。
すると,PricingWebAppプロジェクトの[Configuration Files]-[faces-config.xml]に以下のような設定が追加されます。
<managed-bean>
<managed-bean-name>PricingManagedBean</managed-bean-name>
<managed-bean-class>webapp.PricingManagedBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
これにより,JSFページから,"PricingManagedBean"という名前で,このインスタンスにアクセスできるようになります。
(2) プロパティの追加
Managed Beanのメンバ変数として,以下の3つを追加します。
private String productId = "SUNW-001";
private String productName = null;
private java.math.BigDecimal price = null;
そして,ソースコードエディタ上で右クリック,[Refactor]-[Encapsulate Fields]を選択すると,これらのメンバ変数に対するsetter, getterを自動生成することが出来ます。
(3) アクションメソッドの実装
ソースコードエディタ上で,まず,以下のようなメソッドを実装します。
public String findBooksData(){
return null;
}
次に,return文の前の行で右クリック,[Web Service Client Resources]-[Call Web Service Operation]から,BooksPricingProcessWebServiceBeanのfindBookPriceを選択すると,Webサービスのクライアントコードが自動生成されます。これを修正して,以下のような実装にします。
try { // Call Web Service Operation
bpclient.BooksPricingProcessWebServiceBeanService service =
new bpclient.BooksPricingProcessWebServiceBeanService();
bpclient.BooksPricingProcessWebServiceBean port =
service.getBooksPricingProcessWebServiceBeanPort();
bpclient.BooksData result = port.findBookPrice(this.productId);
this.setProductName(result.getProductName());
this.setPrice(result.getPrice());
return "findBooksData_success";
} catch (Exception ex) {
// TODO handle custom exceptions here
}
return null;
4. JSFページの開発プロジェクトを生成したときにwelcomeJSF.jspというページが出来ていると思いますので,これにコードを追加して,以下のようなJSFページを作ります。
<f:view>
<h1><h:outputText value="Java Server Faces" /></h1>
<h:form>
<h:inputText value="#{PricingManagedBean.productId}"/>
<h:commandButton value="Submit" action="#{PricingManagedBean.findBooksData}"/>
</h:form>
<hr>
<table border="1">
<thead>
<tr>
<th>Product Id</th>
<th>Product Name</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td><h:outputText value="#{PricingManagedBean.productId}"/></td>
<td><h:outputText value="#{PricingManagedBean.productName}"/></td>
<td><h:outputText value="#{PricingManagedBean.price}"/></td>
</tr>
</tbody>
</table>
</f:view>
内容を簡単に解説します。
- 4行目<h:inputText>: 入力フィールドの値を,PricingManagedBeanのプロパティproductIdとしてセットします。
- 5行目<h:commandButton>: アクションメソッドとしてPricingManagedBean#findBooksDataを呼び出します。
- 18-20行目<h:outputText>: PricingManagedBeanの各プロパティを表示します。
5. JSFアプリケーションの実行
プロジェクトPricingWebAppで右クリック,[Run Project]を選択すると,プロジェクトがディプロイされた上で,ブラウザ上でJSP Pageが開きます。 "Java Server Faces Welcome Page"というリンクをクリックしましょう。
入力フィールドには,Managed Beanで実装したproductIdの初期値"SUNW-001"が入っています。
出力フィールドにも,Managed Beanで実装した初期値が表示されます。productName, priceとしてnullを指定したので空欄になっています。

Submitボタンを押すと,BPELで定義されたプロセスをWebサービスで呼び出した結果が,出力フィールドに表示されます。
Trackback URL: http://blogs.sun.com/wajima/entry/bpel_on_jbi_by_netbeans2