4.5. ステートマネージャ API


JFS にはビューからビューへの ナビゲーション を定義できる上級のナビゲーションメカニズムがあります。 Web アプリケーションでは、 ユーザーがボタンやハイパーリンク、 その他のコマンドコンポーネントをクリックして他のページに変更するとナビゲーションが発生します。 同じビューの同じ論理ステート間における切り替えメカニズムはありません。 例えば、ログイン / 登録ダイアログ では、 既存ユーザーはユーザー名とパスワードを使ってログインしますが、 新しいユーザーが登録しようとすると、 別のフィールド (Confirm) が表示され、 ユーザーが To register リンクをクリックするとボタンラベルとメソッドが変更されます。

図4.7 ログインダイアログ

図4.8 登録ダイアログ

RichFaces ステート API により ページに対するステートのセットとステートに対するプロパティを簡単に定義できます。
States クラスは map にインターフェースし、 keySet はステート名を定義し、 entrySetState map です。State map はキーやオブジェクトのプロパティ、 メソッドバインディング、 不変ステート変数のいずれかを定義します。これらの値はアクティブステートによって変更することがあります。

図4.9 RichFaces ステート API

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>
    ...
    Copy to Clipboard Toggle word wrap
  • faces-config.xml に追加のアプリケーションファクトリを登録します。
    ...
    <factory>
    	<application-factory>org.richfaces.ui.application.StateApplicationFactory</application-factory>
    </factory>
    ...
    Copy to Clipboard Toggle word wrap
  • 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>
    ...
    Copy to Clipboard Toggle word wrap
    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;
    	}
    }
    ...
    Copy to Clipboard Toggle word wrap
    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"/>
    ...
    Copy to Clipboard Toggle word wrap
ログイン / 登録ダイアログの完全な例は、 RichFaces Live Demo を参照してください。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat