2012-10-01 5 views
7

Ich baue eine Web-Anwendung mit JSF/Primefaces. Ich brauche eine "Konstanten" -Klasse, d. H. Eine Klasse, die aus Konstanten besteht. Diese Konstanten sind hauptsächlich Navigationsbefehle, die in der gesamten Anwendung verwendet werden. Der Grund, warum ich das tue, ist zu vermeiden, dass Strings auf einer Ad-hoc-Basis instanziiert wurden.Mit einer "Konstanten" -Klasse in JSF

Wie erreiche ich dies, indem ich die Konstanten sowohl von Backing-Beans als auch von XHTML-Dateien zugänglich mache?

Ich habe versucht mit @ApplicationScoped und mit dem Singleton-Muster (Singleton-Klasse), aber ich bin nicht in der Lage, es wegen Umfang Probleme zu bekommen.

Oder vielleicht verwende ich nur den falschen Ansatz. Irgendwelche Ideen/Vorschläge sind willkommen.

+0

Warum haben Sie keine Klasse mit 'public static final String page1 =" page1.xhtml "'. Denken Sie daran, dass diese Klasse in Ihren verwalteten Beans verwendet wird. Wenn Sie einen dieser Werte in Ihrem JSF-Code verwenden möchten, können Sie das @ApplicationScope zur Klasse und die Getter für die von Ihnen verwendeten Zeichenfolgen hinzufügen. –

+0

Können Sie das mit einem Beispiel erklären? – javaMS

Antwort

12

Wie erreiche ich dies, indem ich die Konstanten sowohl von Backing-Beans als auch von XHTML-Dateien zugänglich mache?

In Backbohnen ist es offensichtlich einfach. Da es sich nur um Java-Klassen handelt, unterscheidet es sich nicht von der "normalen" Java-Methode. Sie könnten enum s oder public static final Felder verwenden. In Ansichten ist dies eine andere Geschichte. Bis zur kommenden Version 3.0 unterstützt EL keine Konstanten in irgendeiner Weise.

Ich würde vorschlagen, Enums zu verwenden, da EL im String-Vergleich implizit unterstützt wird. Es führt keine Compiletime/Runtime-Sicherheitsprüfungen durch, aber Sie können den Enum-Namen als Zeichenfolge verwenden. Z.B.

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

Wenn Sie mehr Selbst Dokumentieren Code und eine Laufzeitprüfung vorziehen (nein, eine compiletime Prüfung nicht möglich ist), dann könnte man erwägen OmniFaces<o:importConstants> verwenden.

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

Dies ist IMO nur ein bisschen ungeschickter. Der Laufzeitcheck ist jedoch während der Entwicklung angenehm. Ein Tippfehler ist leicht zu übersehen.

In der kommenden EL 3.0 (JSR-341, Teil von Java EE 7) ist es möglich, Konstanten auf die gleiche Weise zu referenzieren. Siehe auch How to reference constants in EL? Dies erfordert nur den programmatischen Import der Konstanten, da es dafür kein standardmäßiges JSP/Facelet-Tag gibt.

+0

Ich habe Enums verwendet und sie funktionieren gut auf der Bean-Ebene. Wenn ich jedoch versuche, Omnifaces zu verwenden, um die Enumeration zu importieren, bekomme ich eine Ausnahme. Meine Ansicht hat dies: und dann habe ich public String add (Objekt Objekt, Objekt Befehl) {(...) NavigationHelper nh = (NavigationHelper) Befehl; in der Bohne. Ausnahme ist java.lang.NullPointerException – javaMS

+0

Ok, ich habe das Problem gefunden. Ich muss das im -Block platzieren. Ich hatte es außerhalb davon platziert, was zu dieser Ausnahme führte. Kannst du erklären, was du mit tollpatschig meinst? – javaMS

+0

Tags müssen tatsächlich in der Ansicht platziert werden, nicht außerhalb. Wenn Sie eine Mastervorlage verwenden, können Sie sie auch einfach dort platzieren, sodass Sie sie nicht für alle Vorlagenclients wiederholen müssen. "Clumsy" bedeutet hier "nicht einfach genug". Ich mag Einfachheit. – BalusC