Web アプリケーションへの JavaServer Faces の統合

Java Server Faces (JSF) は、NetUI (<netui> タグ ライブラリ) にネイティブなユーザ インタフェース技術を補完するために使用できる web ユーザ インタフェース技術です。

Web プロジェクトでの JSF の有効化

デフォルトの JSF 実装をインストールするには、JSF ファセットを web プロジェクトに追加します。([プロジェクト|プロパティ|プロジェクト・ファセット|プロジェクト・ファセットの追加/除去] を選択し、[JSF] の横のチェックを付けます)。

JSF ファセットを追加すると、JSF Reference Implementation 1.1 がインストールされます。

JSF と NetUI の統合

NetUI と JSF は 1 つの Web アプリケーションに完全に統合できます。以下に、この 2 つのフレームワークを連携させる最も一般的な方法を示します。

NetUI アクションから JSF ページへの転送

NetUI アクションから JSF ページに転送するには、.faces ファイル拡張子を持つ JSF ページを参照します。ただし、Workshop では、JSF ページが .jsp ファイル拡張子でディスクに作成されます。

myJSFPage.jsp という名前の JSF ページがあると仮定します。アクションからこのページに転送するには、以下の構文を使います。

	@Jpf.Action(forwards = { @Jpf.Forward(name = "success", path = "myJSFPage.faces") } )
	public Forward navigate() {
		return new Forward("success");
	}

JSF ページからの NetUI アクションの実行

JSF ページでは action 属性を介して NetUI アクションを実行できます。

たとえば、NetUI コントローラ ファイルに以下のアクションがあると仮定します。

	@Jpf.Action(forwards = { @Jpf.Forward(name = "success", path = "myJSFPage.faces") } )
	public Forward navigate() {
		return new Forward("success");
	}
このアクションを JSF から起動するには、action 属性で navigate を参照します。
    <h:form>
    ...
        <h:commandButton action="navigate" value="Go"/>
    </h:form>

JSF バッキング Bean からの NetUI アクションの実行

navigate アクションがコントローラ クラスにあると仮定します。JSF バッキング Bean 内から navigate を起動するには、アノテーション セット @Jpf.CommandHandler/@Jpf.RaiseAction によって修飾されたコマンド ハンドラを使います。

    @Jpf.CommandHandler(
        raiseActions={
            @Jpf.RaiseAction(action="navigate")
        }
    )
    public String invokeNavigate()
    {
        return "navigate";
    }

JSF ページからのコマンド ハンドラへのバインドは、通常の方法で行います。

    <h:commandButton action="#{backing.invokeNavigate}" value="Go"

JSF バッキング Bean からのコントロールの呼び出し

Java クラスからコントロールを呼び出すように、バッキング Bean からコントロールを呼び出します。

最初に、クライアント Java クラスに対してコントロールを宣言します。

    import org.apache.beehive.controls.api.bean.Control;
    
	...
    
    @Control
    private CustomerControl customerControl;

次に、そのコントロールのメソッドを呼び出します。

    public Customer[] getCustomers() {
		return customerControl.someMethod();
	}

JSF ページと NetUI アクション間でのデータの受け渡し

JSF ページでは、JSF 式を使って NetUI 暗黙的オブジェクトを参照できます。たとえば、以下の JSF ページでは NetUI コントローラ クラスからページ入力を受け取ります。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>

<netui-data:declarePageInput required="true" type="java.util.ArrayList<businessObjects.Customer>" name="getCustomersResult" />

...

    <h:dataTable value="#{pageInput.getCustomersResult}" var="item0" border="1">

        ...

    </h:dataTable>

参照は pageInput 暗黙的オブジェクトに制限されておらず、JSF スタイルの式を使えば任意の暗黙的オブジェクトを参照できます。たとえば、以下の式では、コントローラ クラスの foo フィールドを参照します。

    <h:outputText value="#{pageInput.foo}"/>

JSF ページから NetUI コントローラ クラスにデータを (フォーム Bean として) 送信することもできます。

フォーム Bean パラメータを持つアクションがあると仮定します。

	@Jpf.Action(forwards = { @Jpf.Forward(name = "success", path = "confirm.faces") } )
	public Forward getCustomers(Customer form) {
	    
		// 送信フォーム データに関して処理を行う...
		
		return new Forward("success");
	}

フォーム Bean は HTML フォームの Java 表現です。Bean プロパティは HTML フォームのフィールドに対応します。

public class Customer implements Serializable
{
    private String first = "";
    private String last = "";
   
    public Customer()
    {
    }
    
    public Customer(String first, String last)
    {
        this.first = first;
        this.last = last;
    }

    public void setFirst(String value)
    {
        first = value;
    }

    public String getFirst()
    {
        return first;
    }

    public String getLast()
    {
        return last;
    }

    public void setLast(String value)
    {
        last = value;
    }
} 

JSF ページからアクションにこのフォーム Bean を送信するには、JSF スタイルの式を使って bean を参照します。

    <h:form>
        <h:outputLabel value="First:" for="field1" />
        <h:inputText value="#{backing.custFormBean.first}" id="field1" />
        <h:outputLabel value="Last:" for="field2" />
        <h:inputText value="#{backing.custFormBean.last}" id="field2" />
        <h:commandButton action="getCustomers" value="Submit">
            <f:attribute name="submitFormBean" value="backing.custFormBean" />
        </h:commandButton>
    </h:form>

フォーム Bean は、バッキング Bean を介して参照される点に注意します。上記の斜体の式 #{backing.custFormBean.first}、#{backing.custFormBean.last}、および backing.custFormBean を確認してください。

これらの式が機能するためには、バッキング Bean にフォーム Bean をフィールドとして含める必要があります。そのフィールドに対しては適切なセッターおよびゲッター メソッドを指定します。

@Jpf.FacesBacking()
public class index extends FacesBackingBean {
 
    private Customer custFormBean = new Customer();
 
    public Customer getCustFormBean() {
        return custFormBean;
    }
 
    public void setCustFormBean(Customer bean) {
        this.custFormBean = bean;
    }
}

その他の統合シナリオ

その他の統合シナリオについては、「JavaServer Faces と Beehive ページフローの統合」を参照してください。

JSF と NetUI タグの混用

NetUI タグまたは任意の JSP タグと、JSF タグを混用すると、予想外の結果になる場合があります。異なるタグ ライブラリを混用する場合は、使用する特定のタグに関して十分な知識を備えている必要があります。

ただし、NetUI <netui-data:declarePageInput> タグを使う場合は例外です。このタグは、NetUI コントローラ クラスとの規約を設定するのみで、それ以外では表示に影響を与えないため、JSF タグと一緒に自由に使うことができます。

JSF 管理対象 Bean のコンフィグレーションを NetUI 暗黙的オブジェクトと同じ名前にすることはできない

NetUI では、データ バインディングで使用する暗黙的オブジェクトが定義されています (「backing」、「bundle」、「pageFlow」、「sharedFlow」、「pageInput」など)。JSF 管理対象 Bean が作成され、その管理対象 Bean の faces-config.xml 内で使用されている名前が NetUI 暗黙的オブジェクトの名前と同じである場合、Bean プロパティのランタイム FacesException が発生する場合があります。以下に、この FacesException が発生する例を示します。

<managed-bean> 
 <managed-bean-name>backing</managed-bean-name>
 <managed-bean-class>com.bea.example.MyBean</managed-bean-class>
 <managed-bean-scope>request</managed-bean-scope>
 <managed-property> 
  <property-name>minimum</property-name>
  <property-class>int</property-class> 
 </managed-property>
</managed-bean>

この問題が発生するのは、ページ フローおよび NetUI と共に JSF を使用している場合だけです。

faces-config.xml の <managed-bean-name> 要素に NetUI 暗黙的オブジェクト名を使用していないことを確認してください。

Workshop の JSF ツール機能

Workshop には、一般的な JSF コーディング作業の多くをサポートする開発用機能があります。これには以下のものも含まれます。

  1. バッキング Bean の自動生成
  2. フォームおよびデータ グリッド用の JSF 固有コードの生成
  3. コマンド ハンドラ作成サポート

JSF の開発サポートをアクティブ化するには、ページ フロー パースペクティブを表示する必要があります ([ウィンドウ|パースペクティブを開く|ページ フロー])。

[デザイン パレット] を介した JSF 固有コードの生成

ページ フロー パースペクティブでは、[デザイン パレット] によって、JSF ページの作成時に JSF タグおよび JSF スタイル式がサポートされます。

注意 : [デザイン パレット] は、ページ上に JSF タグ <f:view> があることによって、その JSF ページを認識します。以下のタグ (およびその関連ライブラリ宣言) がページ上に存在する場合、[デザイン パレット] は JSF モードでコードを生成します。

    <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
    ...
    <f:view>

プレフィックスには任意の値を使用できます。ここでは、「f」がデフォルト値であるため、プレフィックス値として使われています。

たとえば、ページ入力宣言が含まれる JSF ページがあると仮定します。

<netui-data:declarePageInput
	type="java.util.ArrayList<businessObjects.Customer>"
	name="getCustomersResult" />

ページ入力宣言が存在する場合、対応するノードの[デザイン パレット] がアクティブ化されます。

このノードを JSF ページ上にドラッグ アンド ドロップすると、JSF タグは、データ表示構造の構築に使用されます。例を示します。

<h:dataTable value="#{pageInput.getCustomersResult}" var="item0"
		border="1">
		<h:column>
			<f:facet name="header">
				<h:outputLabel value="Name" />
			</f:facet>
			<h:outputText value="#{item0.name}" />
		</h:column>
	</h:dataTable>

Workshop では、単純なプロパティに対しては outputText フィールドが作成され、複雑または反復型のプロパティに対しては [データ表示ウィザード] が起動されます。

[デザイン パレット] を介した JSF 固有コードの生成

[デザイン パレット] でも、JSF フォームを作成するために同様のサポートが提供されます。

ページに、core JSF 中核ライブラリの宣言 (<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>) が含まれる場合、デザイン パレットは「JSF モード」になります。デザイン パレットで作成されるフォームおよびデータ グリッドでは、JSF タグおよび JSF 式が使用されます。

JSF コマンド ハンドラのサポート

[コマンド ハンドラ] ノードを右クリックして [新しいコマンド ハンドラ] を選択することによって、コマンド ハンドラを JSF バッキング Bean に簡単に追加できます([コマンド ハンドラ] ノードを表示するには、ページ フロー パースペクティブが表示されている必要があります)。

このウィザードで、コントローラ クラスのアクションを起動可能なコマンド ハンドラ メソッドを設定できます。また、起動されたアクションに渡すことができるフォーム Bean を指定します。JSF ページからコントローラ アクションにフォーム Bean データを渡す詳細については、上記の「JSF ページと NetUI アクション間でのデータの受け渡し」を参照してください。

同様の方法で、バッキング Bean にコントロール参照を追加できます。

関連トピック

dev2dev ドキュメント : JavaServer Faces と Beehive ページフローの統合

チュートリアル : JSF と NetUI の統合


さらにヘルプが必要ですか。質問は Workshop ニュース グループまでお寄せください。