How do I achieve this, making the constants accessible from both backing beans and XHTML files?
In backing beans, it's obviously easy. As they're just Java classes, it's not different from the "normal" Java way. You could use enum
s or public static final
fields. In views, this is a different story. Until the upcoming version 3.0, EL does namely not support constants in any way.
I'd suggest using enums as EL has implicit support for them in string comparisons. It does not do any compiletime/runtime type safety checks, but you can use the enum name as a string. E.g.
<h:someComponent ... rendered="#{order.status == 'SHIPPING'}" />
If you prefer more self documenting code and a runtime check (no, a compiletime check is not possible), then you could consider using OmniFaces <o:importConstants>
.
<o:importConstants type="com.example.OrderStatus" />
<h:someComponent ... rendered="#{order.status == OrderStatus.SHIPPING}" />
This is IMO only a bit more clumsy. The runtime check is however nice during development. A typo is easily overseen.
In the upcoming EL 3.0 (JSR-341, part of Java EE 7), it's possible to reference constants the same way. See also How to reference constants in EL? This only requires programmatic import of the constants as there's no standard JSP/Facelets tag for that.
public static final String page1 = "page1.xhtml"
. Remember that this class will be used in your managed beans. If you're going to use any of these values in your JSF code, then you could add the @ApplicationScope to the class and getters for theString
s you will use. – Stelmach