下図には RichFaces フレームワークの重要なエレメントの一部が記載されています。
AJAX フィルタ
RichFaces を最大限に利用するには、アプリケーションの web.xml に Filter を登録することをお勧めします。Filter は複数の要求タイプを認識します。図 5.3 のシーケンス図は、通常の JSF 要求と AJAX 要求の処理における違いを示しています。
どちらの場合でも、 アプリケーションが要求する必要な静的または動的リソースの情報は ResourceBuilder クラスに登録されます。
リソース要求が発行されると、 RichFaces フィルタがこのリソースの Resource Cache をチェックします。 Resource Cache が存在する場合はリソースがクライアントへ返されますが、存在しないとフィルタは ResourceBuilder に登録されているリソースを検索します。 リソースが登録されている場合、 RichFaces フィルタは ResourceBuilder がリソースを作成 (送信) するよう要求します。
次の図はリソース要求のプロセスを表しています。
AJAX アクションコンポーネント
AJAX Action コンポーネントを使用して、クライアント側から AJAX 要求を送信します。<a4j:commandButton>、<a4j:commandLink>、<a4j:poll>、<a4j:support> など多くの AJAX Action コンポーネントがあります。
AJAX コンテナ
AjaxContainer は、 AJAX 要求中にデコードされるべき JSF ページの領域を定義するインターフェースです。 AjaxViewRoot と AjaxRegion は共にこのインターフェースの実装です。
JavaScript エンジン
RichFaces JavaScript エンジンはクライアント側で実行され、 AJAX 応答からの情報を基に JSF ページの異なる領域をアップデートします。 JavaScript コードは自動的に操作するため、 直接使用する必要はありません。
企業向けアプリケーションの CSS (カスケーディングスタイルシート) ファイルを見ると、 同じ色が頻繁に記載されていることに気がつくでしょう。 標準的な CSS は特定の色をパネルヘッダの色やアクティブなポップアップメニュー項目の背景色、 分離文字の色などとして抽象的に定義することができません。 一般的なインターフェーススタイルを定義するには、 同じ値を複数回コピーしなければならないため、 インターフェースの数が多いほど、繰り返しが多く必要となります。
そのため、アプリケーションのパレットを変更したい場合は、相互関連する値を変更する必要があります。そうしないと、ご使用のインターフェースは不体裁になることがあります。カスタマがインターフェースのルックアンドフィールをリアルタイムで調節したい場合は、複数の CSS ファイルを変更することができ、それぞれ同じ値が複数回含まれることになります。
RichFaces にビルトインされ完全実装されている スキン を使用すると、このような問題を解決することができます。 命名された各スキンには、ユーザーインターフェースのパレットやその他の属性を定義する スキンパラメータ があります。 スキンパラメータの一部を変更するだけで 、インターフェースを常に干渉せずに多数のコンポーネントの外見を同時に変更することができます。
skinnability 機能は標準的な CSS を完全に置き換えるものではなく、 CSS を不要にするものではありません。 skinnability は正規 CSS 宣言と共に使用できる標準的な CSS の高レベル拡張です。 JSF 表現言語より CSS のスキンパラメータを参照することもできます。 これにより、 ページにある全エレメントの外見を完全に同期化することができます。
RichFaces skinnability は、下記との併用を目的としています。
コンポーネントの配色は 3 つのスタイルクラスのうちどれを使用してもそのエレメントに適用することができます。
フレームワークに挿入されたデフォルトのスタイルクラス
このスタイルクラスにはスキンからの定数へリンクされたスタイルパラメータが含まれています。 各コンポーネントに対して定義され、 表現のデフォルトレベルを指定します。 スキンパラメータの値を変更してアプリケーションインターフェースを変更することができます。
スキン拡張のスタイルクラス
このクラス名は各コンポーネントエレメントに対して定義され、 CSS ファイルの同じ名前でクラスを定義できるようフレームワークに挿入されます。 これにより、 このクラスを使用するすべてのコンポーネントの外見を簡単に拡張できます。
ユーザースタイルクラス
styleClass パラメータの 1 つを使用してコンポーネントエレメントの独自のクラスを定義することができます。 そのため、 クラスに指定された CSS スタイルパラメータに従って特定のコンポーネントの外見が変更されます。
簡単な パネル コンポーネントの例は次の通りです。
<rich:panel> ... </rich:panel>
<rich:panel> ... </rich:panel>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
このコードはページでパネルコンポーネントを生成します。2 つのエレメントで構成されています。ラッパー <div> エレメントと特定のスタイルのプロパティを持つパネルボディの <div> エレメントです。ラッパー <div> エレメントは以下のようになります。
<div class="dr-pnl rich-panel">
...
</div>
<div class="dr-pnl rich-panel">
...
</div>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
dr-pnl はスキンパラメータよりフレームワークで指定される CSS クラスです。
全ページの全パネルの全色を変更するには、それらのスキンパラメータ値を変更します。ただし、ページで <rich:panel> クラスを特定すると、そのパラメータはこのページ上のすべてのパネルから取得されます。
開発者はパネルのスタイルプロパティを変更することも可能です。 例は次の通りです。
<rich:panel styleClass="customClass" />
<rich:panel styleClass="customClass" />
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
前述の定義は、 customClass からスタイルプロパティの一部を特定のパネルへ追加できます。 この結果、 3 つのスタイルを取得します。
<div class="dr_pnl rich-panel customClass">
...
</div>
<div class="dr_pnl rich-panel customClass">
...
</div>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
RichFaces は最も単純なレベルの一般的なカスタマイズで 8 つの事前定義されたスキンパラメータ (スキン) を備えています。
DEFAULT
plain
emeraldTown
blueSky
wine
japanCherry
ruby
classic
deepMarine
スキンを適用するには、 org.richfaces.SKIN コンテキストパラメータにスキン名を指定する必要があります。
下表は blueSky スキンの各パラメータの値を表しています。
Expand 表4.1 色 パラメータ名 デフォルト値 headerBackgroundColor #BED6F8 headerGradientColor #F2F7FF headTextColor #000000 headerWeightFont bold generalBackgroundColor #FFFFFF generalTextColor #000000 generalSizeFont 11px generalFamilyFont Arial、 Verdana、 sans-serif controlTextColor #000000 controlBackgroundColor #FFFFFF additionalBackgroundColor #ECF4FE shadowBackgroundColor #000000 shadowOpacity 1 panelBorderColor #BED6F8 subBorderColor #FFFFFF tabBackgroundColor #C6DEFF tabDisabledTextColor #8DB7F3 trimColor #D6E6FB tipBackgroundColor #FAE6B0 tipBorderColor #E5973E selectControlColor #E79A00 generalLinkColor #0078D0 hoverLinkColor #0090FF visitedLinkColor #0090FF
Show more Expand 表4.2 フォント パラメータ名 デフォルト値 headerSizeFont 11px headerFamilyFont Arial、 Verdana、 sans-serif tabSizeFont 11px tabFamilyFont Arial、 Verdana、 sans-serif buttonSizeFont 11px buttonFamilyFont Arial、 Verdana、 sans-serif tableBackgroundColor #FFFFFF tableFooterBackgroundColor #cccccc tableSubfooterBackgroundColor #f1f1f1 tableBorderColor #C0C0C0
Show more
バージョン 3.0.2 に plain スキンが追加されました。 このスキンにはパラメータがなく、 独自のスタイルで RichFaces コンポーネントを既存のプロジェクトへ組み込む時に重要となります。
スキンにより、 RichFaces によってビルドされる標準的な JSF コンポーネントとカスタム JSF コンポーネントをレンダリングするスタイルを定義できます。 スキンを試してみるには、 次の手順に従います。
次のようにカスタムのレンダリングキットを作成し、 faces-config.xml に登録します。
<render-kit>
<render-kit-id>NEW_SKIN</render-kit-id>
<render-kit-class>org.ajax4jsf.framework.renderer.ChameleonRenderKitImpl</render-kit-class>
</render-kit>
<render-kit>
<render-kit-id>NEW_SKIN</render-kit-id>
<render-kit-class>org.ajax4jsf.framework.renderer.ChameleonRenderKitImpl</render-kit-class>
</render-kit>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
次に、 ルックアンドフィールの事前定義された変数を基にしてコンポーネントのカスタムレンダラを作成し登録します。
<renderer>
<component-family>javax.faces.Command</component-family>
<renderer-type>javax.faces.Link</renderer-type>
<renderer-class>newskin.HtmlCommandLinkRenderer</renderer-class>
</renderer>
<renderer>
<component-family>javax.faces.Command</component-family>
<renderer-type>javax.faces.Link</renderer-type>
<renderer-class>newskin.HtmlCommandLinkRenderer</renderer-class>
</renderer>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
最後に、 スキンパラメータを持つプロパティファイルをクラスパスのルートに配置します。 プロパティファイルは次の 2 つの要件を満たしていなければなりません。
ランタイム時にスキンを変更するには、 web.xml に次の EL 表現を定義します。
<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>#{skinBean.skin}</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>#{skinBean.skin}</param-value>
</context-param>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
skinBean コードは次のようになります。
public class SkinBean {
private String skin;
public String getSkin() {
return skin;
}
public void setSkin(String skin) {
this.skin = skin;
}
}
public class SkinBean {
private String skin;
public String getSkin() {
return skin;
}
public void setSkin(String skin) {
this.skin = skin;
}
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
設定ファイルの skin プロパティの最初の値を設定する必要があります。classic の設定方法は以下のとおりです。
<managed-bean>
<managed-bean-name>skinBean</managed-bean-name>
<managed-bean-class>SkinBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>skin</property-name>
<value>classic</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>skinBean</managed-bean-name>
<managed-bean-class>SkinBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>skin</property-name>
<value>classic</value>
</managed-property>
</managed-bean>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
デフォルトスキンのプロパティを変更することもできます。 変更するには、 デフォルトスキンのプロパティを編集します。 ページコードの例は次の通りです。
<h:form>
<div style="display: block; float: left">
<h:selectOneRadio value="#{skinBean.skin}" border="0" layout="pageDirection" title="Changing skin" style="font-size: 8; font-family: comic" onchange="submit()">
<f:selectItem itemLabel="plain" itemValue="plain" />
<f:selectItem itemLabel="emeraldTown" itemValue="emeraldTown" />
<f:selectItem itemLabel="blueSky" itemValue="blueSky" />
<f:selectItem itemLabel="wine" itemValue="wine" />
<f:selectItem itemLabel="japanCherry" itemValue="japanCherry" />
<f:selectItem itemLabel="ruby" itemValue="ruby" />
<f:selectItem itemLabel="classic" itemValue="classic" />
<f:selectItem itemLabel="laguna" itemValue="laguna" />
<f:selectItem itemLabel="deepMarine" itemValue="deepMarine" />
<f:selectItem itemLabel="blueSky Modified" itemValue="blueSkyModify" />
</h:selectOneRadio>
</div>
<div style="display: block; float: left">
<rich:panelBar height="100" width="200">
<rich:panelBarItem label="Item 1" style="font-family: monospace; font-size: 12;">
Changing skin in runtime
</rich:panelBarItem>
<rich:panelBarItem label="Item 2" style="font-family: monospace; font-size: 12;">
This is a result of the modification "blueSky" skin
</rich:panelBarItem>
</rich:panelBar>
</div>
</h:form>
<h:form>
<div style="display: block; float: left">
<h:selectOneRadio value="#{skinBean.skin}" border="0" layout="pageDirection" title="Changing skin" style="font-size: 8; font-family: comic" onchange="submit()">
<f:selectItem itemLabel="plain" itemValue="plain" />
<f:selectItem itemLabel="emeraldTown" itemValue="emeraldTown" />
<f:selectItem itemLabel="blueSky" itemValue="blueSky" />
<f:selectItem itemLabel="wine" itemValue="wine" />
<f:selectItem itemLabel="japanCherry" itemValue="japanCherry" />
<f:selectItem itemLabel="ruby" itemValue="ruby" />
<f:selectItem itemLabel="classic" itemValue="classic" />
<f:selectItem itemLabel="laguna" itemValue="laguna" />
<f:selectItem itemLabel="deepMarine" itemValue="deepMarine" />
<f:selectItem itemLabel="blueSky Modified" itemValue="blueSkyModify" />
</h:selectOneRadio>
</div>
<div style="display: block; float: left">
<rich:panelBar height="100" width="200">
<rich:panelBarItem label="Item 1" style="font-family: monospace; font-size: 12;">
Changing skin in runtime
</rich:panelBarItem>
<rich:panelBarItem label="Item 2" style="font-family: monospace; font-size: 12;">
This is a result of the modification "blueSky" skin
</rich:panelBarItem>
</rich:panelBar>
</div>
</h:form>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
上記のコードは次のオプションリストを生成します。
この機能は 標準的な HTML エレメントと RichFaces コンポーネントのルックアンドフィールを統一するためのものです。 エレメント名と属性タイプ (該当する場合)を基に、 ページ上のすべてのコントロールにスキニングを適用することができます。 特定のエレメントや、コントロールをネストするエレメントのコンテナに rich-* クラスを割り当てて、 スキンが適用されるようにする CSS スタイルのセットも備えています。
標準コントロールスキニングには 基本 (Basic) と 拡張 (Extended) の2 つのレベルのスキニングがあります。検出されるブラウザのタイプにより使用されるレベルが決まります。ブラウザタイプが検出できない場合は、Extended が使用されますが、適用されるレベルを明示的に指定したい場合は、org.richfaces.CONTROL_SKINNING_LEVEL コンテキストパラメータを web.xml に追加し、値を basic または extended のどちらかに設定します。
スキンで変更できるエレメントは次の通りです。
標準的な HTML コントロールのスキニングを初期化する方法は 2 つあります。
org.richfaces.CONTROL_SKINNING_CLASSES を有効にすると、 以下に適用できるスタイルクラスが提供されます。
提供される事前定義されたリッチ CSS クラスは、 基本および複合 HTML エレメントの両方のクラスとして使用できます。
次のコードスニペットには例として複数のエレメントを示しています。
...
<u:selector name=".rich-box-bgcolor-header">
<u:style name="background-color" skin="headerBackgroundColor" />
</u:selector>
<u:selector name=".rich-box-bgcolor-general">
<u:style name="background-color" skin="generalBackgroundColor" />
</u:selector>
...
//gradient elements
...
<u:selector name=".rich-gradient-menu">
<u:style name="background-image">
<f:resource f:key="org.richfaces.renderkit.html.gradientimages.MenuGradientImage"/>
</u:style>
<u:style name="background-repeat" value="repeat-x" />
</u:selector>
<u:selector name=".rich-gradient-tab">
<u:style name="background-image">
<f:resource f:key="org.richfaces.renderkit.html.gradientimages.TabGradientImage"/>
</u:style>
<u:style name="background-repeat" value="repeat-x" />
</u:selector>
...
...
<u:selector name=".rich-box-bgcolor-header">
<u:style name="background-color" skin="headerBackgroundColor" />
</u:selector>
<u:selector name=".rich-box-bgcolor-general">
<u:style name="background-color" skin="generalBackgroundColor" />
</u:selector>
...
//gradient elements
...
<u:selector name=".rich-gradient-menu">
<u:style name="background-image">
<f:resource f:key="org.richfaces.renderkit.html.gradientimages.MenuGradientImage"/>
</u:style>
<u:style name="background-repeat" value="repeat-x" />
</u:selector>
<u:selector name=".rich-gradient-tab">
<u:style name="background-image">
<f:resource f:key="org.richfaces.renderkit.html.gradientimages.TabGradientImage"/>
</u:style>
<u:style name="background-repeat" value="repeat-x" />
</u:selector>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
標準的なコンポーネントスキニングに関する詳細を知りたい場合は、 RichFaces SVN レポジトリの ui/core/src/main/resources/org/richfaces/ ディレクトリにある CSS ファイルを確認してみてください。
Expand 表4.3 input、 select、 textarea、 button、 keygen、 isindex、 legend の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ font-size generalSizeFont font-family generalFamilyFont color controlTextColor
Show more Expand 表4.4 fieldset の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor
Show more Expand 表4.5 hr の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor
Show more Expand 表4.6 a の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ color generalLinkColor
Show more Expand 表4.7 a:hover の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ color hoverLinkColorgeneralLinkColor
Show more Expand 表4.8 a:visited の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ color visitedLinkColor
Show more Expand 表4.9 .rich-input、 .rich-select、 .rich-textarea、 .rich-keygen、 .rich-isindex、 .rich-link のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ font-size generalSizeFont font-family generalFamilyFont color controlTextColor
Show more Expand 表4.10 .rich-fieldset のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor
Show more Expand 表4.11 .rich-hr のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor border-width 1px border-style solid
Show more Expand 表4.12 .rich-link のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ color generalLinkColor
Show more Expand 表4.13 .rich-link:hover のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ color hoverLinkColor
Show more Expand 表4.14 .rich-link:visited のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ color visitedLinkColor
Show more Expand 表4.15 .rich-field のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ / 値 border-width 1px border-style inset border-color panelBorderColor background-color controlBackgroundColor background-repeat no-repeat background-position 1px 1px
Show more Expand 表4.16 .rich-field-edit のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ border-width 1px border-style inset border-color panelBorderColor background-color editBackgroundColor
Show more Expand 表4.17 .rich-field-error のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ border-width 1px border-style inset border-color panelBorderColor background-color warningBackgroundColor background-repeat no-repeat background-position center left padding-left 7px
Show more Expand 表4.18 .rich-button、 .rich-button-disabled、 .rich-button-over のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ border-width 1px border-style solid border-color panelBorderColor background-color trimColor padding 2px 10px 2px 10px text-align center cursor pointer background-repeat repeat-x background-position top left
Show more Expand 表4.19 .rich-button-press のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ background-position bottom left
Show more Expand 表4.20 .rich-container fieldset、 .rich-fieldset のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor border-width 1px border-style solid padding 10px padding 10px
Show more Expand 表4.21 .rich-legend のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ font-size generalSizeFont font-family generalFamilyFont color controlTextColor font-weight bold
Show more Expand 表4.22 .rich-form のリッチエレメントスキンバインディング CSS プロパティ スキンパラメータ padding 0px margin 0px
Show more Expand 表4.23 input、 select、 textarea、 button、 keygen、 isindex の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ border-width 1px border-color panelBorderColor color controlTextColor
Show more Expand 表4.24 *|button の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor font-size generalSizeFont font-family generalFamilyFont color headerTextColor background-color headerBackgroundColor background-image org.richfaces.renderkit.html.images.ButtonBackgroundImage
Show more Expand 表4.25 button[type=button]、 button[type=reset]、 button[type=submit]、 input[type=reset]、 input[type=submit]、 input[type=button] の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor font-size generalSizeFont font-family generalFamilyFont color headerTextColor background-color headerBackgroundColor background-image org.richfaces.renderkit.html.images.ButtonBackgroundImage
Show more Expand 表4.26 *|button[disabled]、 .rich-container *|button[disabled]、 .rich-button-disabled の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ color tabDisabledTextColor border-color tableFooterBackgroundColor background-color tableFooterBackgroundColor background-image org.richfaces.renderkit.html.images.ButtonDisabledBackgroundImage
Show more Expand 表4.27 .rich-button-disabled、.rich-container button[type="button"][disabled]、.rich-button-button-disabled、.rich-container button[type="reset"][disabled]、.rich-button-reset-disabled、.rich-container button[type="submit"][disabled]、.rich-button-submit-disabled、.rich-container input[type="reset"][disabled]、.rich-input-reset-disabled、.rich-container input[type="submit"][disabled]、.rich-input-submit-disabled, .rich-container input[type="button"][disabled]、.rich-input-button-disabled の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ color tabDisabledTextColor background-color tableFooterBackgroundColor border-color tableFooterBackgroundColor background-image org.richfaces.renderkit.html.images.ButtonDisabledBackgroundImage
Show more Expand 表4.28 *button[type="button"][disabled]、button[type="reset"][disabled]、button[type="submit"][disabled]、input[type="reset"][disabled]、input[type="submit"][disabled]、input[type="button"][disabled] の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ color tabDisabledTextColor border-color tableFooterBackgroundColor background-color tableFooterBackgroundColor
Show more Expand 表4.29 *|textarea のエレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor font-size generalSizeFont font-family generalFamilyFont color controlTextColor background-color controlBackgroundColor background-image org.richfaces.renderkit.html.images.InputBackgroundImage
Show more Expand 表4.30 textarea[type=textarea]、 input[type=text]、 input[type=password]、 select の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ border-color panelBorderColor font-size generalSizeFont font-family generalFamilyFont color controlTextColor background-color controlBackgroundColor background-image org.richfaces.renderkit.html.images.InputBackgroundImage
Show more Expand 表4.31 *|textarea[disabled]、 .rich-container *|textarea[disabled] の HTML エレメントスキンバインディング CSS プロパティ スキンパラメータ color tableBorderColor
Show more Expand 表4.32 textarea[type="textarea"][disabled]、input[type="text"][disabled]、input[type="password"][disabled] CSS プロパティ スキンパラメータ color tableBorderColor
Show more Expand 表4.33 textarea[type="textarea"][disabled]、input[type="text"][disabled]、input[type="password"][disabled] CSS プロパティ スキンパラメータ color tableBorderColor
Show more
ajaxPortlet を次のように設定すると基本スキニングレベルが失敗することがあります。
...
<portlet>
<portlet-name>ajaxPortlet</portlet-name>
<header-content>
<script src="/faces/rfRes/org/ajax4jsf/framework.pack.js" type="text/javascript" />
<script src="/faces/rfRes/org/richfaces/ui.pack.js" type="text/javascript" />
<link rel="stylesheet" type="text/css" href="/faces/rfRes/org/richfaces/skin.xcss" />
</header-content>
</portlet>
...
...
<portlet>
<portlet-name>ajaxPortlet</portlet-name>
<header-content>
<script src="/faces/rfRes/org/ajax4jsf/framework.pack.js" type="text/javascript" />
<script src="/faces/rfRes/org/richfaces/ui.pack.js" type="text/javascript" />
<link rel="stylesheet" type="text/css" href="/faces/rfRes/org/richfaces/skin.xcss" />
</header-content>
</portlet>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
標準の HTML コントロールの拡張スキニングは自動的に適用されます。 ブラウザタイプが検知され、 ブラウザが拡張スキニングを完全サポートしない場合は基本スキニングが適用されます。
RichFaces コンポーネントや標準の HTML コントロールを手作業でスキンしたい場合、 ブラウザによっては (Opera や Safari など) 標準の HTML コントロールに問題があるため、 問題が発生することがあります。
Skinnability を無効にするには、 次のように web.xml ファイルの org.richfaces.LoadStyleStrategy パラメータを NONE に設定します。
...
<context-param>
<param-name>org.richfaces.LoadStyleStrategy</param-name>
<param-value>NONE</param-value>
</context-param>
...
...
<context-param>
<param-name>org.richfaces.LoadStyleStrategy</param-name>
<param-value>NONE</param-value>
</context-param>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
また、 RichFaces コンポーネントや標準の HTML コントロールにスキンを適用するスタイルシートが含まれるようにしてください。
Opera と Safari における拡張スキニングの問題を回避するには、 RichFaces ライブラリに skinning.js クライアントスクリプトを追加します。 このスクリプトはブラウザタイプを検出し、 完全サポートするブラウザのみ拡張スキニングを有効にします。
ページに次の JavaScript を挿入し、スクリプトをアクティベートします。
<script type="text/javascript">
window.RICH_FACES_EXTENDED_SKINNING_ON = true;
</script>
<script type="text/javascript">
window.RICH_FACES_EXTENDED_SKINNING_ON = true;
</script>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
スクリプトの読み込みストラテジが使用されずに拡張スキニングが有効だと、コンソールに警告メッセージが表示されます。
また、 link タグに media 属性を指定する必要があります。 これは、 extended_both.xcss スタイルシートを rich-extended-skinning に追加します。
自動 Skinnability が無効になっている時にページにスタイルシートが含まれるようにするには、 次を追加します。
<link href='/YOUR_PROJECT_NAME/a4j_3_2_2-SNAPSHOTorg/richfaces/renderkit/html/css/basic_both.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
<link media='rich-extended-skinning' href='/ YOUR_PROJECT_NAME /a4j_3_2_2-SNAPSHOTorg/richfaces/renderkit/html/css/extended_both.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
<link href='/ YOUR_PROJECT_NAME /a4j_3_2_2-SNAPSHOT/org/richfaces/skin.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
<link href='/YOUR_PROJECT_NAME/a4j_3_2_2-SNAPSHOTorg/richfaces/renderkit/html/css/basic_both.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
<link media='rich-extended-skinning' href='/ YOUR_PROJECT_NAME /a4j_3_2_2-SNAPSHOTorg/richfaces/renderkit/html/css/extended_both.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
<link href='/ YOUR_PROJECT_NAME /a4j_3_2_2-SNAPSHOT/org/richfaces/skin.xcss/DATB/eAF7sqpgb-jyGdIAFrMEaw__.jsf' type='text/css' rel='stylesheet' class='component' />
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
これにより、 Base64 エンコーダが 「.」 ではなく 「!」 を使用するようになるため、 a4j_versionXXX ではなく a4j/versionXXX をリソースプレフィックスとして使用するようにしてください。
プラグアンドスキン は、 プロジェクトへカスタムスキンを簡単に作成、 カスタマイズ、 プラグできるようにします。 事前定義された RichFaces スキンのパラメータを基にしてスキンを作成することができます。 また、 プラグアンドスキンはリッチコントロールの外見を標準の HTML エレメントと統合できるようにします。 本項では、 プラグアンドスキンで独自のスキンを作成するための段階的な手順を取り上げます。
最初に Maven を使用して、新しいスキンのテンプレートを作成します (RichFaces に Maven を設定する方法に関する詳細は
JBoss wiki article を参照してください)。こうした Maven の手順はコマンドラインインターフェースにコピーして貼り付けることで実行できます。
...
mvn archetype:create
-DarchetypeGroupId=org.richfaces.cdk
-DarchetypeArtifactId=maven-archetype-plug-n-skin
-DarchetypeVersion=RF-VERSION
-DartifactId=ARTIFACT-ID
-DgroupId=GROUP-ID
-Dversion=VERSION
...
...
mvn archetype:create
-DarchetypeGroupId=org.richfaces.cdk
-DarchetypeArtifactId=maven-archetype-plug-n-skin
-DarchetypeVersion=RF-VERSION
-DartifactId=ARTIFACT-ID
-DgroupId=GROUP-ID
-Dversion=VERSION
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
コマンドの主キーは次の通りです。
archetypeVersion — 3.3.1.GA のように RichFaces のバージョンを表します。
artifactId — プロジェクトのアーティファクト ID です。
groupId — プロジェクトのグループ ID です。
version — 作成するプロジェクトのバージョンです。 デフォルトでは 1.0.-SNAPSHOT に設定されています。
この操作は ARTIFACT-ID にちなんで名付けられるディレクトリを作成します。 このディレクトリには Maven プロジェクトのテンプレートが格納されます。
次の手順はスキン自体を作成するための手順です。
Maven プロジェクトのルートディレクトリより次のコマンドを実行します (このディレクトリには pom.xml ファイルが格納されます)。
...
mvn cdk:add-skin -Dname=SKIN-NAME -Dpackage=SKIN-PACKAGE
...
...
mvn cdk:add-skin -Dname=SKIN-NAME -Dpackage=SKIN-PACKAGE
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
コマンドの主キーは次の通りです。
コマンドのその他任意のキーは次の通りです。
Expand 表4.34 mvn cdk:add-skin -Dname=SKIN-NAME -Dpackage=SKIN-PACKAGE コマンドで作成されたファイルとフォルダ
ファイル名
場所
内容
BaseImage.java
\src\main\java\SKIN-PACKAGE\SKIN-NAME\images\
イメージを格納するために使用する基本クラスです。
BaseImageTest.java
\src\test\java\SKIN-PACKAGE\SKIN-NAME\images\
イメージを格納するクラスのテストバージョンです。
XCSS files
\src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\
新しいスキンに影響された RichFaces コンポーネントの新しい外見を定義します。
SKIN-NAME .properties
\src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\
新しいスキンのプロパティを含むファイルです。
SKIN-NAME.properties ファイルの設定に使用されるプロパティは次の通りです。
baseSkin
独自のスキンの基準として使用されるスキン名です。定義するスキンの外見は新しいスタイルのプロパティにより影響を受けます。
generalStyleSheet
新しいスキンが修正するコンポーネントのスタイルシートをインポートするスタイルシート (SKIN-NAME .xcss) へのパスです。
extendedStyleSheetgradientType
新しいスキンに適用されるグラデーションのタイプを設定する事前定義したプロパティです。可能な値は glass、plastic、plain です。グラデーションの実装に関する詳細は本章の後半で説明します。
SKIN-NAME.xcss
src\main\resources\META-INF\skins
新しいスキンが修正したコンポーネントの XCSS ファイルをインポートする XCSS ファイルです。
XCSS files
\src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\
createExt キーが true に設定されている場合に、標準コントロールのスタイルを決定します (extended_classes.xcss と extended.xcss)。
SKIN-NAME-ext.xcss
src\main\resources\META-INF\skins.
createExt が true に設定されている場合に、標準コントロールの定義のスタイルをインポートします。
SKIN-NAME-resources.xml
src\main\config\resources.
前回にリストされた全ファイルの詳細が含まれています。
Show more
これで \src\main\resources\SKIN-PACKAGE\SKIN-NAME\css\ にある XCSS ファイルの編集を開始できるようになりました。 次のいずれかの方法で ( XCSS ファイルにリストされている) セレクタに新しいスタイルプロパティを割り当てます。
標準 CSS コーディングアプローチ (CSS プロパティをセレクタに追加) です。セレクタは <f:verbatim> </f:verbatim> タグ内にあるようにしてください。例は以下のとおりです。
...
.rich-calendar-cell {
background: #537df8;
}
...
...
.rich-calendar-cell {
background: #537df8;
}
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
XCSS コーディングアプローチ (RichFaces で XCSS ファイルを作成する通常のメソッド) です。XCSS タグは <f:verbatim> </f:verbatim> タグの 外に 配置されている必要があります。
...
<u:selector name=".rich-calendar-cell">
<u:style name="border-bottom-color" skin="panelBorderColor"/>
<u:style name="border-right-color" skin="panelBorderColor"/>
<u:style name="background-color" skin="tableBackgroundColor"/>
<u:style name="font-size" skin="generalSizeFont"/>
<u:style name="font-family" skin="generalFamilyFont"/>
</u:selector>
...
...
<u:selector name=".rich-calendar-cell">
<u:style name="border-bottom-color" skin="panelBorderColor"/>
<u:style name="border-right-color" skin="panelBorderColor"/>
<u:style name="background-color" skin="tableBackgroundColor"/>
<u:style name="font-size" skin="generalSizeFont"/>
<u:style name="font-family" skin="generalFamilyFont"/>
</u:selector>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
これまでの手順を実行し、 XCSS ファイルを編集したら、 新しいスキンをビルドし、 プロジェクトへプラグします。 スキンをビルドするにはスキンプロジェクトのルートディレクトリ (pom.xml ファイルを格納するディレクトリ) より次のコマンドを実行します。
...
mvn clean install
...
...
mvn clean install
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
プラグアンドスキン機能には事前定義されたグラデーションが複数あります。 次のコードを使用してグラデーションを適用することができます。
...
<u:selector name=".rich-combobox-item-selected">
<u:style name="border-width" value="1px" />
<u:style name="border-style" value="solid" />
<u:style name="border-color" skin="newBorder" />
<u:style name="background-position" value="0% 50%" />
<u:style name="background-image">
<f:resource f:key="org.richfaces.renderkit.html.CustomizeableGradient">
<f:attribute name="valign" value="middle" />
<f:attribute name="gradientHeight" value="17px" />
<f:attribute name="baseColor" skin="headerBackgroundColor" />
</f:resource>
</u:style>
</u:selector>
...
...
<u:selector name=".rich-combobox-item-selected">
<u:style name="border-width" value="1px" />
<u:style name="border-style" value="solid" />
<u:style name="border-color" skin="newBorder" />
<u:style name="background-position" value="0% 50%" />
<u:style name="background-image">
<f:resource f:key="org.richfaces.renderkit.html.CustomizeableGradient">
<f:attribute name="valign" value="middle" />
<f:attribute name="gradientHeight" value="17px" />
<f:attribute name="baseColor" skin="headerBackgroundColor" />
</f:resource>
</u:style>
</u:selector>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
background-image CSS プロパティは <f:resource f:key="org.richfaces.renderkit.html. CustomizeableGradient"> で定義され、グラデーションを設定します。グラデーションのタイプは gradientType プロパティを使って SKIN-NAME.properties で指定することができ、glass、plastic または plain に設定可能です。前のコードスニペットで見たとおりグラデーションは baseColor、gradientColor、gradientHeight、valign 属性で調整することも可能です。
これで、 web.xml ファイルに新しいスキンパラメータを追加し、 スキンを格納する JAR ファイル (スキンプロジェクトの target ディレクトリに存在) を \WebContent\WEB-INF\lib\ に配置するとプロジェクトの新規作成されたスキンを使用することができるようになりました。
...
<context-param>
<param-name>org.ajax4jsf.SKIN</param-name>
<param-value>SKIN-NAME</param-value>
</context-param>
...
...
<context-param>
<param-name>org.ajax4jsf.SKIN</param-name>
<param-value>SKIN-NAME</param-value>
</context-param>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
本項ではプラグアンドスキン実装の実用面について取り上げます。 プラグアンドスキンのプロトタイプ作成プロセスを説明する項を読んでから本項を読むようにしてください。
最初に、 新しいスキンを作成する必要あります (前項の説明通り)。 以下は新しいスキンプロジェクトのテンプレートを作成します。
mvn archetype:create
-DarchetypeGroupId=org.richfaces.cdk
-DarchetypeArtifactId=maven-archetype-plug-n-skin
-DarchetypeVersion=3.3.1.GA
-DartifactId=P-n-S
-DgroupId=GROUPID
-Dversion=1.0.-SNAPSHOT
mvn archetype:create
-DarchetypeGroupId=org.richfaces.cdk
-DarchetypeArtifactId=maven-archetype-plug-n-skin
-DarchetypeVersion=3.3.1.GA
-DartifactId=P-n-S
-DgroupId=GROUPID
-Dversion=1.0.-SNAPSHOT
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
これで、作成したファイルやフォルダを確認するため P-n-S ディレクトリを閲覧できるようになりました。
次に、 Maven を使用して次のように必要なファイルをすべてスキンプロジェクトに追加します。
mvn cdk:add-skin -DbaseSkin=blueSky -DcreateExt=true -Dname=PlugnSkinDemo -Dpackage=SKINPACKAGE
mvn cdk:add-skin -DbaseSkin=blueSky -DcreateExt=true -Dname=PlugnSkinDemo -Dpackage=SKINPACKAGE
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
前項で説明した通り、 -DbaseSkin はベースとして使用する RichFaces のビルトインスキンを定義し、-DcreateExt=true は、新しいスキンがリッチコンポーネントと標準 HTML コントロールの外見を統一する XCSS ファイルを含んでいることを判断します。
リソースが作成された時点で、新規作成されたスキンを設定し直し始めることができます。リッチコンポーネントの XCSS ファイルの編集から始めます。
プラグアンドスキン機能の例として、<rich:calendar> スタイル属性といくつかの基本的な HTML コントロールを編集します。以下のように行います。
<rich:properties> のスタイルプロパティを編集するには、P-n-S\src\main\resources\skinpackage\plugnskindemo\css\ にある calendar.xcss ファイルを開く必要があります。
calendar.xcss ファイルで .rich-calendar-today セレクタを探し、 background-color: #075ad1; のように変更します。 これにより現在日の背景色が変更します。
次に、 標準 HTML 提出 ボタンのフォントスタイルを変更します。 P-n-S\src\main\resources\skinpackage\plugnskindemo\css\ ディレクトリより extended.xcss ファイルを開き、 次のようにセレクタの波括弧の間に font-weight: bold; を挿入します。
button[type="button"], button[type="reset"], button[type="submit"], input[type="reset"], input[type="submit"], input[type="button"] {
font-weight: bold;
}
button[type="button"], button[type="reset"], button[type="submit"], input[type="reset"], input[type="submit"], input[type="button"] {
font-weight: bold;
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
変更が適用されたため、次に新しい PlugnSkinDemo スキンをビルドし、 プロジェクトへインポートすることができます。
P-n-S ディレクトリより mvn clean install を実行し、 スキンをビルドします。 これにより、 新たにコンパイルされたスキンを持つ JAR ファイルが格納されている target ディレクトリが作成されます。 この例では、 ファイル名は P-n-S-1.0.-SNAPSHOT.jar です。
次に、 新しい PlugnSkinDemo スキンをプロジェクトへインポートします。
標準コントロールスキニングが web.xml で有効になっていなければなりません。 以下を追加して標準コントロールスキニングを有効にします。
<context-param>
<param-name>org.richfaces.CONTROL_SKINNING</param-name>
<param-value>enable</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.CONTROL_SKINNING</param-name>
<param-value>enable</param-value>
</context-param>
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
下図はスキンに行った各変更の結果を表しています。
JFS にはビューからビューへの ナビゲーション を定義できる上級のナビゲーションメカニズムがあります。 Web アプリケーションでは、 ユーザーがボタンやハイパーリンク、 その他のコマンドコンポーネントをクリックして他のページに変更するとナビゲーションが発生します。 同じビューの同じ論理ステート間における切り替えメカニズムはありません。 例えば、ログイン / 登録ダイアログ では、 既存ユーザーはユーザー名とパスワードを使ってログインしますが、 新しいユーザーが登録しようとすると、 別のフィールド (Confirm) が表示され、 ユーザーが To register リンクをクリックするとボタンラベルとメソッドが変更されます。
RichFaces ステート API により ページに対するステートのセットとステートに対するプロパティを簡単に定義できます。
States クラスは map にインターフェースし、 keySet はステート名を定義し、 entrySet は State map です。State map はキーやオブジェクトのプロパティ、 メソッドバインディング、 不変ステート変数のいずれかを定義します。これらの値はアクティブステートによって変更することがあります。
RichFaces ステート API の最も便利な機能の 1 つは State 間をナビゲートできる機能です。 API は標準の JSF ナビゲーションより State の変更を実装します。 アクションコンポーネントが結果を返すと、 JSF ナビゲーションハンドラ (RichFaces ステート API によって拡張) はその結果が State 変更の結果 として登録されているか確認します。 true の場合、 対応する State がアクティベートされます。 false の場合は標準のナビゲーション処理が呼び出されます。
次のように RichFaces ステート API を実装します。
faces-config.xml ファイルにステートナビゲーションハンドラと EL リゾルバを登録します。
...
<application>
<navigation-handler>org.richfaces.ui.application.StateNavigationHandler</navigation-handler>
<el-resolver>org.richfaces.el.StateELResolver</el-resolver>
</application>
...
...
<application>
<navigation-handler>org.richfaces.ui.application.StateNavigationHandler</navigation-handler>
<el-resolver>org.richfaces.el.StateELResolver</el-resolver>
</application>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
faces-config.xml に追加のアプリケーションファクトリを登録します。
...
<factory>
<application-factory>org.richfaces.ui.application.StateApplicationFactory</application-factory>
</factory>
...
...
<factory>
<application-factory>org.richfaces.ui.application.StateApplicationFactory</application-factory>
</factory>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
faces-config.xml に 2 つの管理 Bean を登録します。
...
<managed-bean>
<managed-bean-name>state</managed-bean-name>
<managed-bean-class>org.richfaces.ui.model.States</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>states</property-name>
<property-class>org.richfaces.ui.model.States</property-class>
<value>#{config.states}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>config</managed-bean-name>
<managed-bean-class>org.richfaces.demo.stateApi.Config</managed-bean-class>
<managed-bean-scope>none</managed-bean-scope>
</managed-bean>
...
...
<managed-bean>
<managed-bean-name>state</managed-bean-name>
<managed-bean-class>org.richfaces.ui.model.States</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>states</property-name>
<property-class>org.richfaces.ui.model.States</property-class>
<value>#{config.states}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>config</managed-bean-name>
<managed-bean-class>org.richfaces.demo.stateApi.Config</managed-bean-class>
<managed-bean-scope>none</managed-bean-scope>
</managed-bean>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
1 つの Bean (config) は次の例のように State を定義し保存します。
...
public class Config {
/**
* @return States
*/
public States getStates() {
FacesContext facesContext = FacesContext.getCurrentInstance();
States states = new States();
// Registering new User State definition
states.setCurrentState("register"); // Name of the new state
// Text labels, properties and Labels for controls in "register" state
states.put("showConfirm", Boolean.TRUE); // confirm field rendering
states.put("link", "(To login)"); // Switch State link label
states.put("okBtn", "Register"); // Login/Register button label
states.put("stateTitle", "Register New User"); // Panel title
ExpressionFactory expressionFactory = facesContext.getApplication()
.getExpressionFactory();
// Define "registerbean" available under "bean" EL binding on the page
ValueExpression beanExpression = expressionFactory
.createValueExpression(facesContext.getELContext(),
"#{registerbean}", Bean.class);
states.put("bean", beanExpression);
// Define "registeraction" available under "action" EL binding on the
// page
beanExpression = expressionFactory.createValueExpression(facesContext
.getELContext(), "#{registeraction}", RegisterAction.class);
states.put("action", beanExpression);
// Define method expression inside registeraction binding for this state
MethodExpression methodExpression = expressionFactory.createMethodExpression(
facesContext.getELContext(), "#{registeraction.ok}",
String.class, new Class[] {});
states.put("ok", methodExpression);
// Outcome for switching to login state definition
states.setNavigation("switch", "login");
// Login Existent User State analogous definition
states.setCurrentState("login");
states.put("showConfirm", Boolean.FALSE);
states.put("link", "(To register)");
states.put("okBtn", "Login");
states.put("stateTitle", "Login Existing User");
beanExpression = expressionFactory.createValueExpression(facesContext
.getELContext(), "#{loginbean}", Bean.class);
states.put("bean", beanExpression);
beanExpression = expressionFactory.createValueExpression(facesContext
.getELContext(), "#{loginaction}", LoginAction.class);
states.put("action", beanExpression);
methodExpression = expressionFactory.createMethodExpression(
facesContext.getELContext(), "#{loginaction.ok}",
String.class, new Class[] {});
states.put("ok", methodExpression);
states.setNavigation("switch", "register");
return states;
}
}
...
...
public class Config {
/**
* @return States
*/
public States getStates() {
FacesContext facesContext = FacesContext.getCurrentInstance();
States states = new States();
// Registering new User State definition
states.setCurrentState("register"); // Name of the new state
// Text labels, properties and Labels for controls in "register" state
states.put("showConfirm", Boolean.TRUE); // confirm field rendering
states.put("link", "(To login)"); // Switch State link label
states.put("okBtn", "Register"); // Login/Register button label
states.put("stateTitle", "Register New User"); // Panel title
ExpressionFactory expressionFactory = facesContext.getApplication()
.getExpressionFactory();
// Define "registerbean" available under "bean" EL binding on the page
ValueExpression beanExpression = expressionFactory
.createValueExpression(facesContext.getELContext(),
"#{registerbean}", Bean.class);
states.put("bean", beanExpression);
// Define "registeraction" available under "action" EL binding on the
// page
beanExpression = expressionFactory.createValueExpression(facesContext
.getELContext(), "#{registeraction}", RegisterAction.class);
states.put("action", beanExpression);
// Define method expression inside registeraction binding for this state
MethodExpression methodExpression = expressionFactory.createMethodExpression(
facesContext.getELContext(), "#{registeraction.ok}",
String.class, new Class[] {});
states.put("ok", methodExpression);
// Outcome for switching to login state definition
states.setNavigation("switch", "login");
// Login Existent User State analogous definition
states.setCurrentState("login");
states.put("showConfirm", Boolean.FALSE);
states.put("link", "(To register)");
states.put("okBtn", "Login");
states.put("stateTitle", "Login Existing User");
beanExpression = expressionFactory.createValueExpression(facesContext
.getELContext(), "#{loginbean}", Bean.class);
states.put("bean", beanExpression);
beanExpression = expressionFactory.createValueExpression(facesContext
.getELContext(), "#{loginaction}", LoginAction.class);
states.put("action", beanExpression);
methodExpression = expressionFactory.createMethodExpression(
facesContext.getELContext(), "#{loginaction.ok}",
String.class, new Class[] {});
states.put("ok", methodExpression);
states.setNavigation("switch", "register");
return states;
}
}
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
org.richfaces.ui.model.States タイプを持つもう 1 つの Bean (state) は、最初の config Bean にバインドされる管理プロパティ states を格納します。
次に、下記の例のようにページ上で state バインディングを使用します。
...
<h:panelGrid columns="3">
<h:outputText value="username" />
<h:inputText value="#{state.bean.name}" id="name" required="true" />
<h:outputText value="password" />
<h:inputSecret value="#{state.bean.password}" id="password" required="true" />
<h:outputText value="confirm" rendered="#{state.showConfirm}" />
<h:inputSecret value="#{state.bean.confirmPassword}" rendered="#{state.showConfirm}" id="confirm" required="true" />
</h:panelGrid>
<a4j:commandButton actionListener="#{state.action.listener}" action="#{state.ok}" value="#{state.okBtn}" id="action"/>
...
...
<h:panelGrid columns="3">
<h:outputText value="username" />
<h:inputText value="#{state.bean.name}" id="name" required="true" />
<h:outputText value="password" />
<h:inputSecret value="#{state.bean.password}" id="password" required="true" />
<h:outputText value="confirm" rendered="#{state.showConfirm}" />
<h:inputSecret value="#{state.bean.confirmPassword}" rendered="#{state.showConfirm}" id="confirm" required="true" />
</h:panelGrid>
<a4j:commandButton actionListener="#{state.action.listener}" action="#{state.ok}" value="#{state.okBtn}" id="action"/>
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow