¿Cómo se hace referencia a una constante 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 scriplet yendo:, <%=Addresses.URL%>
pero ¿cómo hago esto usando EL?
Si ya está en Java EE 7 / EL 3.0, entonces @page import
también importará constantes de clase en el alcance EL.
<%@ page import="com.example.YourConstants" %>
Esto debajo de las cubiertas se importará a través de ImportHandler#importClass()
y estará disponible como ${YourConstants.FOO}
.
Tenga en cuenta que todas las java.lang.*
clases ya están implícitamente importadas y disponibles como tal ${Boolean.TRUE}
y ${Integer.MAX_VALUE}
. Esto solo requiere un servidor de 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 web.xml
se declara que cumple con la última versión de servlet admitida por el servidor. Por lo tanto, con un web.xml
Servlet 2.5 declarado conforme o anterior, ninguna de las características de Servlet 3.0+ funcionará.
También tenga en cuenta que esta función solo está disponible en JSP y no en Facelets. En el caso de JSF + Facelets, su mejor opción<o:importConstants>
es utilizar OmniFaces como se muestra a continuación:
<o:importConstants type="com.example.YourConstants" />
O agregando un oyente de contexto EL que llama de la ImportHandler#importClass()
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");
}
});
}
}
Esto no es posible en EL 2.2 y versiones anteriores. Existen varias alternativas:
Colóquelos en el Map<String, Object>
que puso en el ámbito de la aplicación. En EL, los valores del mapa son accesibles de la forma habitual de Java por ${map.key}
o ${map['key.with.dots']}
.
El uso <un:useConstants>
de la unstandard taglib (maven2 Repo aquí ):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
<un:useConstants className="com.example.YourConstants" var="constants" />
De esta manera, son accesibles de la forma habitual en Java ${constants.FOO}
.
Utilice CCC de Javaranch <ccc:constantsMap>
como se describe en alguna parte al final de este artículo .
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
<ccc:constantsMap className="com.example.YourConstants" var="constants" />
De esta forma, también son accesibles de la forma habitual en Java ${constants.FOO}
.
Si está utilizando JSF2, entonces se podría utilizar <o:importConstants>
de OmniFaces .
<html ... xmlns:o="http://omnifaces.org/ui">
<o:importConstants type="com.example.YourConstants" />
De esta forma, también son accesibles de la forma habitual en Java #{YourConstants.FOO}
.
Cree una clase contenedora que los devuelva a través de métodos getter de estilo Javabean.
Cree un resolutor EL personalizado que primero escanee la presencia de una constante y, si está ausente, luego delegue al resolutor predeterminado; de lo contrario, devuelve el valor constante.
unstandard-taglib
Sigue vivo el proyecto de Yakarta ? hay alguna alternativa?Lo siguiente no se aplica a EL en general, sino a SpEL (Spring EL) solo (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 usa JSP con Spring).
fuente
Por lo general, coloca este tipo de constantes en un
Configuration
objeto (que tiene captadores y establecedores) en el contexto del servlet y accede a ellas con${applicationScope.config.url}
fuente
url
una propiedad String, asígnele un nombreConfiguration
, cree una instancia y establezca el valorurl
que desee. Después de eso, coloque eseConfiguration
objetoServletContext
. Hacer algo así,servletContext.setAttribute("config", config)
. Y ahí tienes.ServletContext
? ¿Es solo que puede clasificar las constantes de manera más ordenada? por ejemplo:applicationScope.config.url
vsapplicationScope.url
.No puedes. Sigue la convención de Java Bean. Así que debes tener un captador para ello.
fuente
Las propiedades estáticas no son accesibles en EL. La solución alternativa que utilizo es crear una variable no estática que se asigne al valor estático.
Yo uso lombok para generar el getter y setter, así que está bastante bien. Su EL se ve así:
Código completo en http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
fuente
Implementé como:
-
El siguiente paso coloca la instancia de esta clase en servlerContext
agregar oyente a web.xml
acceso en jsp
fuente
Estoy definiendo una constante en mi jsp desde el principio:
Incluyo el taglib principal en mi JSP:
Luego, pongo la constante a disposición de EL mediante la siguiente declaración:
Ahora puedo usarlo más tarde. Aquí un ejemplo, donde el valor simplemente se escribe como comentario HTML para fines de depuración:
Con su clase constante, puede importar su clase y asignar las constantes a las variables locales. Sé que mi respuesta es una especie de truco rápido, pero la pregunta también surge cuando uno quiere definir constantes directamente en el JSP.
fuente
<%=URI%>
: P<%=URI%>
no funcionaba, pero esta técnica sí.Sí tu puedes. Necesita una etiqueta personalizada (si no puede encontrarla en otro lugar). He hecho esto:
y la etiqueta se llama:
Todas las variables finales estáticas públicas se colocarán en un mapa indexado por su nombre de Java, por lo que si
luego la etiqueta lo envolverá en un entero y puede hacer referencia a él en un JSP:
¡y no tienes que escribir getters!
fuente
Usted puede. Prueba de la siguiente manera
Probado en TomCat 7 y java6
fuente
Incluso sabiendo que es un poco tarde, e incluso sabiendo que esto es un pequeño truco, utilicé la siguiente solución para lograr el resultado deseado. Si eres un amante de las convenciones de nombres de Java, mi consejo es que dejes de leer aquí ...
Tener una clase como esta, definiendo constantes, agrupadas por clases vacías para crear una especie de jerarquía:
se puede usar desde java
PERMISSION.PAGE.SEE
para recuperar el valor1L
Para lograr una posibilidad de acceso similar desde dentro de EL-Expressions, hice esto: (Si hay un dios codificador, con suerte podría perdonarme: D)
finalmente, la expresión EL para acceder a la misma se
Long
convierte en:#{PERMISSION.PAGE.SEE}
- igualdad para Java y EL-Access. Sé que esto está fuera de cualquier convención, pero funciona perfectamente bien.fuente
@Bozho ya dio una gran respuesta
Sin embargo, creo que se necesita un ejemplo, por lo que aporta un poco más de claridad y ahorra tiempo a alguien.
fuente
Hay una solución que no es exactamente lo que desea, pero le permite activar casi lo mismo tocando scriptlets de una manera bastante mínima. Puede usar scriptlet para poner valor en una variable JSTL y usar código JSTL limpio más adelante en la página.
fuente