- java.lang.Object
-
- jakarta.faces.view.facelets.TagHandler
-
- org.omnifaces.taghandler.ImportConstants
-
- All Implemented Interfaces:
FaceletHandler
public class ImportConstants extends TagHandler
The
<o:importConstants>
taghandler allows the developer to have a mapping of all constant field values of the given fully qualified name of a type in the request scope. The constant field values are those public static final fields. This works for classes, interfaces and enums.Usage
For example:
public class Foo { public static final String FOO1 = "foo1"; public static final String FOO2 = "foo2"; } public interface Bar { public String BAR1 = "bar1"; public String BAR2 = "bar2"; } public enum Baz { BAZ1, BAZ2; } public enum Faz implements Bar { FAZ1, FAZ2; }
The constant field values of the above types can be mapped into the request scope as follows:
<o:importConstants type="com.example.Foo" /> <o:importConstants type="com.example.Bar" /> <o:importConstants type="com.example.Baz" var="Bazzz" /> <o:importConstants type="com.example.Faz" /> ... #{Foo.FOO1}, #{Foo.FOO2}, #{Bar.BAR1}, #{Bar.BAR2}, #{Bazzz.BAZ1}, #{Bazzz.BAZ2}, #{Faz.FAZ1}, #{Faz.BAR2} ... <h:selectOneMenu> <f:selectItems value="#{Faz.values()}" /> <!-- FAZ1, FAZ2, BAR1, BAR2 --> </h:selectOneMenu>
The map is by default stored in the request scope by the simple name of the type as variable name. You can override this by explicitly specifying the
var
attribute, as demonstrated forcom.example.Baz
in the above example.The resolved constants are by reference stored in the cache to improve retrieving performance. There is also a runtime (no, not compiletime as that's just not possible in EL) check during retrieving the constant value. If a constant value doesn't exist, then an
IllegalArgumentException
will be thrown.Since version 4.3, you can use the
loader
attribute to specify an object whose class loader will be used to load the class specified in thetype
attribute. The class loader of the given object is resolved as specified inUtils.getClassLoader(Object)
. In the end this should allow you to use a more specific class when there are duplicate instances in the runtime classpath, e.g. via multiple (plugin) libraries.Since version 4.6, when the class specified in the
type
attribute is anenum
, such asBaz
orFaz
in the above example, then you can use#{Faz.members()}
to exclusively access enum members rather than all constant field values.<h:selectOneMenu> <f:selectItems value="#{Faz.members()}" /> <!-- FAZ1, FAZ2 --> </h:selectOneMenu>
JSF 2.3
JSF 2.3 also offers a
<f:importConstants>
, however it requires being placed in<f:metadata>
which may not be appropriate when you intend to import constants only from a include, tagfile or a composite component.- Author:
- Bauke Scholtz
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
ImportConstants.ConstantsMap
Specific map implementation which wraps the given map inCollections.unmodifiableMap(Map)
and throws anIllegalArgumentException
inImportConstants.ConstantsMap.get(Object)
method when the key doesn't exist at all.
-
Field Summary
-
Fields inherited from class jakarta.faces.view.facelets.TagHandler
nextHandler, tag, tagId
-
-
Constructor Summary
Constructors Constructor Description ImportConstants(TagConfig config)
The tag constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
apply(FaceletContext context, UIComponent parent)
First obtain the constants of the class by its fully qualified name as specified in thetype
attribute from the cache.-
Methods inherited from class jakarta.faces.view.facelets.TagHandler
getAttribute, getRequiredAttribute, toString
-
-
-
-
Constructor Detail
-
ImportConstants
public ImportConstants(TagConfig config)
The tag constructor.- Parameters:
config
- The tag config.
-
-
Method Detail
-
apply
public void apply(FaceletContext context, UIComponent parent) throws IOException
First obtain the constants of the class by its fully qualified name as specified in thetype
attribute from the cache. If it hasn't been collected yet and is thus not present in the cache, then collect them and store in cache. Finally set the constants in the request scope by the simple name of the type, or by the name as specified in thevar
attribute, if any.- Throws:
IOException
-
-