¿Cómo hacer referencia a constantes en EL?

Resuelto tau-neutrino asked hace 14 años • 12 respuestas

¿Cómo se hace referencia a constantes con EL en una página JSP?

Tengo una interfaz Addressescon una constante llamada URL. Sé que puedo hacer referencia a él con un script yendo: <%=Addresses.URL%>, pero ¿cómo hago esto usando EL?

tau-neutrino avatar Sep 17 '10 11:09 tau-neutrino
Aceptado

EL 3.0 o más reciente

Si ya está en Java EE 7/EL 3.0, @page importtambié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.xmldeclaración se ajuste a la última versión de servlet admitida por el servidor. Por lo tanto, con un web.xmlServlet 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:

  1. 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']}.

  2. 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}.

  3. 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 .

  4. 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 .

  5. Cree una clase contenedora que los devuelva a través de métodos getter estilo Javabean.

  6. 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.

BalusC avatar Sep 17 '2010 11:09 BalusC

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"/>
anre avatar Jun 21 '2013 16:06 anre

Por lo general, coloca este tipo de constantes en un Configurationobjeto (que tiene captadores y definidores) en el contexto del servlet y accede a ellos con${applicationScope.config.url}

Bozho avatar Sep 17 '2010 04:09 Bozho

No puedes. Sigue la convención de Java Bean. Entonces debes tener un captador para ello.

Adeel Ansari avatar Sep 17 '2010 04:09 Adeel Ansari