¿Cómo hacer referencia a constantes en EL?
¿Cómo se hace referencia a constantes con EL en una página JSP?
Tengo una interfaz Addresses
con una constante llamada URL
. Sé que puedo hacer referencia a él con un script yendo: <%=Addresses.URL%>
, pero ¿cómo hago esto usando EL?
EL 3.0 o más reciente
Si ya está en Java EE 7/EL 3.0, @page import
también importará constantes de clase en el ámbito EL.
<%@ page import="com.example.YourConstants" %>
Esto se importará bajo las sábanas ImportHandler#importClass()
y estará disponible como ${YourConstants.FOO}
.
Tenga en cuenta que todas java.lang.*
las clases ya están importadas implícitamente y disponibles así ${Boolean.TRUE}
y ${Integer.MAX_VALUE}
. Esto solo requiere un servidor contenedor Java EE 7 más reciente, ya que las primeras versiones tenían errores en esto. Por ejemplo, GlassFish 4.0 y Tomcat 8.0.0-1x fallan, pero GlassFish 4.1+ y Tomcat 8.0.2x+ funcionan. Y debe asegurarse absolutamente de que su web.xml
declaración se ajuste a la última versión de servlet admitida por el servidor. Por lo tanto, con un web.xml
Servlet declarado conforme a Servlet 2.5 o anterior, ninguna de las funciones de Servlet 3.0+ funcionará.
Tenga en cuenta también que esta función sólo está disponible en JSP y no en Facelets. En el caso de JSF+Facelets, lo mejor que puede hacer es utilizar OmniFaces<o:importConstants>
como se muestra a continuación:
<o:importConstants type="com.example.YourConstants" />
O agregando un oyente de contexto EL que llama ImportHandler#importClass()
de la siguiente manera:
@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");
}
});
}
}
EL 2.2 o mayor
Esto no es posible en EL 2.2 y versiones anteriores. Hay varias alternativas:
Colóquelos en un lugar
Map<String, Object>
que coloque en el ámbito de la aplicación. En EL, se puede acceder a los valores del mapa de la forma habitual en Java mediante${map.key}
o${map['key.with.dots']}
.Uso
<un:useConstants>
de taglib no estándar (repositorio maven2 aquí ):<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %> <un:useConstants className="com.example.YourConstants" var="constants" />
De esta manera, se puede acceder a ellos de la forma habitual en Java mediante
${constants.FOO}
.Utilice el CCC de Javaranch
<ccc:constantsMap>
como se describe al final de este artículo .<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %> <ccc:constantsMap className="com.example.YourConstants" var="constants" />
${constants.FOO}
De esta manera , también se puede acceder a ellos de la forma habitual en Java .Si está utilizando JSF2, entonces podría
<o:importConstants>
utilizar OmniFaces .<html ... xmlns:o="http://omnifaces.org/ui"> <o:importConstants type="com.example.YourConstants" />
#{YourConstants.FOO}
De esta manera , también se puede acceder a ellos de la forma habitual en Java .Cree una clase contenedora que los devuelva a través de métodos getter estilo Javabean.
Cree un solucionador EL personalizado que primero escanee la presencia de una constante y, si está ausente, luego delega al solucionador predeterminado; de lo contrario, devuelve el valor constante.
Lo siguiente no se aplica a EL en general, sino únicamente a SpEL (Spring EL) (probado con 3.2.2.RELEASE en Tomcat 7). Creo que vale la pena mencionarlo aquí en caso de que alguien busque JSP y EL (pero use JSP con Spring).
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:eval var="constant" expression="T(com.example.Constants).CONSTANT"/>
Por lo general, coloca este tipo de constantes en un Configuration
objeto (que tiene captadores y definidores) en el contexto del servlet y accede a ellos con${applicationScope.config.url}
No puedes. Sigue la convención de Java Bean. Entonces debes tener un captador para ello.