2012-10-01 31 views
7

JSF/Primefacesを使用してWebアプリケーションを構築しています。私は "定数"クラス、つまり定数からなるクラスを持つ必要があります。これらの定数は、主にアプリケーション全体で使用されるナビゲーションコマンドです。私がこれをやっている理由は、インスタンス化されたストリングを臨時に避けることです。JSFで「定数」クラスを持つ

これを実現するには、どのようにして定数をバッキングビーンとXHTMLファイルの両方からアクセスできるようにするのですか?

私は@ApplicationScopedを使用しようとしましたが、シングルトンパターン(シングルトンクラス)を使用しましたが、スコープの問題のために動作させることができません。

また、間違ったアプローチを使用している可能性もあります。どんなアイデアや提案も大歓迎です。

+0

なぜあなたは 'public static final String page1 =" page1.xhtml "'を持つクラスを持っていませんか?このクラスはマネージドBeanで使用されることに注意してください。 JSFコードでこれらの値を使用する場合は、@ApplicationScopeをクラスに追加し、使用する 'String'のゲッターを追加することができます。 –

+0

例を説明できますか? – javaMS

答えて

12

これはどのようにして、定数をバッキングビーンとXHTMLファイルの両方からアクセスできるようにするのですか?

バッキングビーンズでは、明らかに簡単です。 Javaクラスだけなので、「通常の」Javaメソッドと変わりはありません。 enum秒またはpublic static finalフィールドを使用できます。ビューでは、これは別の話です。次回のバージョン3.0まで、ELは定数をサポートしていません。

私は列挙比較でELに暗黙のサポートがあるので、enumを使用することをお勧めします。コンパイル時/ランタイム型の安全チェックは行われませんが、列挙型の名前を文字列として使用できます。例えば。

<h:someComponent ... rendered="#{order.status == 'SHIPPING'}" /> 

あなたはより多くの自己文書化コードとランタイムのチェックを(なし、コンパイル時のチェックができない)ことを好む場合、あなたはOmniFaces<o:importConstants>の使用を検討できます。

<o:importConstants type="com.example.OrderStatus" /> 
<h:someComponent ... rendered="#{order.status == OrderStatus.SHIPPING}" /> 

これはIMOのほんの少し不器用です。しかし、ランタイムチェックは開発中にうまくいきます。タイプミスは簡単に見過ごされます。

EL 3.0(JSR-341、Java EE 7の一部)では、同じ方法で定数を参照することができます。関連項目How to reference constants in EL?これには、標準のJSP/Faceletsタグがないため、定数のプログラムによるインポートが必要です。

+0

私は列挙型を使用しており、Beanレベルで正常に動作します。しかし、列挙型をインポートするためにomnifacesを使用しようとすると例外が発生します。私の意見は次のとおりです:次に、public String add(オブジェクトオブジェクト、オブジェクトコマンド){(...)NavigationHelper nh =(NavigationHelper)コマンドを実行します。豆の中で。例外はjava.lang.NullPointerExceptionです – javaMS

+0

問題は見つかりました。私はブロック内にを配置する必要があります。私はそれをこの例外の外に置いていました。あなたは不器用に何を意味するか説明できますか? – javaMS

+0

実際には、タグは外側にではなくビューの内側に配置する必要があります。マスターテンプレートを使用している場合は、テンプレートテンプレートをすべてのテンプレートクライアントで繰り返す必要はありません。 "不器用な"とはここでは "十分単純ではない"という意味です。私はシンプルさが好きです。 – BalusC

関連する問題