How do you reference an constants with EL on a JSP page?
I have an interface Addresses
with a constant named URL
. I know I can reference it with a scriplet by going: <%=Addresses.URL%>
, but how do I do this using EL?
If you're already on Java EE 7 / EL 3.0, then the @page import
will also import class constants in EL scope.
<%@ page import="com.example.YourConstants" %>
This will under the covers be imported via ImportHandler#importClass()
and be available as ${YourConstants.FOO}
.
Note that all java.lang.*
classes are already implicitly imported and available like so ${Boolean.TRUE}
and ${Integer.MAX_VALUE}
. This only requires a more recent Java EE 7 container server as early versions had bugs in this. E.g. GlassFish 4.0 and Tomcat 8.0.0-1x fails, but GlassFish 4.1+ and Tomcat 8.0.2x+ works. And you need to make absolutely sure that your web.xml
is declared conform the latest servlet version supported by the server. Thus with a web.xml
which is declared conform Servlet 2.5 or older, none of the Servlet 3.0+ features will work.
Also note that this facility is only available in JSP and not in Facelets. In case of JSF+Facelets, your best bet is using OmniFaces <o:importConstants>
as below:
<o:importConstants type="com.example.YourConstants" />
Or adding an EL context listener which calls ImportHandler#importClass()
as below:
@ManagedBean(eager=true) @ApplicationScoped public class Config { @PostConstruct public void init() { FacesContext.getCurrentInstance().getApplication().addELContextListener(new ELContextListener() { @Override public void contextCreated(ELContextEvent event) { event.getELContext().getImportHandler().importClass("com.example.YourConstants"); } }); } }
This is not possible in EL 2.2 and older. There are several alternatives:
Put them in a Map<String, Object>
which you put in the application scope. In EL, map values are accessible the usual Javabean way by ${map.key}
or ${map['key.with.dots']}
.
Use <un:useConstants>
of the Unstandard taglib (maven2 repo here):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %> <un:useConstants className="com.example.YourConstants" var="constants" />
This way they are accessible the usual Javabean way by ${constants.FOO}
.
Use Javaranch's CCC <ccc:constantsMap>
as desribed somewhere at the bottom of this article.
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %> <ccc:constantsMap className="com.example.YourConstants" var="constants" />
This way they are accessible the usual Javabean way by ${constants.FOO}
as well.
If you're using JSF2, then you could use <o:importConstants>
of OmniFaces.
<html ... xmlns:o="http://omnifaces.org/ui"> <o:importConstants type="com.example.YourConstants" />
This way they are accessible the usual Javabean way by #{YourConstants.FOO}
as well.
Create a wrapper class which returns them through Javabean-style getter methods.
Create a custom EL resolver which first scans the presence of a constant and if absent, then delegate to the default resolver, otherwise returns the constant value instead.
The following does not apply to EL in general, but instead to SpEL (Spring EL) only (tested with 3.2.2.RELEASE on Tomcat 7). I think it is worth mentioning it here in case someone searches for JSP and EL (but uses JSP with Spring).
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <spring:eval var="constant" expression="T(com.example.Constants).CONSTANT"/>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With