A veces, en una aplicación web con JSTL nos vendría bien tener una constante definida en uno de los beans de java, estilo
public class UnaClase {
public static final String UNA_CONSTANTE = "algo";
…
}
y luego poder llamarla desde JSTL con algo como
<jsp:useBean id="bean" class="com.chuidiang.UnaClase"></jsp:useBean>
…
<c:out value="${bean.UNA_CONSTANTE}" />
Desgraciadamente, eso no funciona. JSTL presupone que UNA_CONSTANTE es un atributo del bean y va a convertir ese ${bean.UNA_CONSTANTE} en una llamada al método bean.getUNA_CONSTANTE() que no existe.
La solución es fácil, basta con crear un método getUNA_CONSTANTE() en el bean que devuelva el valor de la constante. Unicamente tenemos que tener en cuenta que ese método no puede ser static, puesto que si no JSTL tampoco lo llamará (por debajo, probablemente usa la introspección de java y no busca métodos estáticos). El bean quedaría así
public class UnaClase {
public static final String UNA_CONSTANTE = "algo";public String getUNA_CONSTANTE () {
return UnaClase.UNA_CONSTANTE;
}
…
}
que sí funciona como esperamos.
Me parece que ensucia un poco el código, yo no sé si podría dormir tranquilo. Probablemente sea preferible utilizar alguna taglib específica como la «Unstandard Tag Library» de Apache, que incluye este tipo de funciones tantas veces pedidas por los desarrolladores:
http://jakarta.apache.org/taglibs/sandbox/doc/unstandard-doc/index.html#useConstants
Saludos.
No la conocía. Un ejemplo específico para el uso de constantes con esa extensión unstandard tag library en http://blog.tallan.com/2010/07/01/the-unstandard-tag-library-using-constants-within-jsps/
Gracias y se bueno.
Pues aunque no quede tan limpio como usando la taglib que comentáis (la cual tampoco conocía dicho sea de paso) me parece una solución muy útil, sobre todo si no puedes agregar librerías al proyecto así como así.
Un saludo.
Me parece suciete. En estos casos, mejor un .properties que puedes cargar tanto en Java como en JSTL.