java jsp session jstl

java - acceder a las constantes en JSP(sin scriptlet)



session jstl (7)

Esta pregunta ya tiene una respuesta aquí:

Tengo una clase que define los nombres de varios atributos de sesión, por ejemplo

class Constants { public static final String ATTR_CURRENT_USER = "current.user"; }

Me gustaría utilizar estas constantes dentro de un JSP para probar la presencia de estos atributos, algo así como:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page import="com.example.Constants" %> <c:if test="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}"> <%-- Do somthing --%> </c:if>

Pero parece que no puedo corregir el sintaxis. Además, para evitar repetir las pruebas bastante largas anteriores en varios lugares, me gustaría asignar el resultado a una variable local (con un alcance de página), y referirme a eso en su lugar. Creo que puedo hacer esto con <c:set> , pero nuevamente estoy luchando por encontrar la sintaxis correcta.

ACTUALIZACIÓN: en relación con la sugerencia a continuación, probé:

<c:set var="nullUser" scope="session" value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />

que no funcionó. Entonces, en cambio, traté de sustituir el valor literal de la constante. También agregué la constante al contenido de la página, por lo que pude verificar el valor de la constante cuando la página se está procesando

<c:set var="nullUser" scope="session" value="${sessionScope[''current.user''] eq null}" /> <%= "Constant value: " + WebHelper.ATTR_CURRENT_PARTNER %>

Esto funcionó bien e imprimió el valor esperado "current.user" en la página. No entiendo por qué el uso del literal String funciona, pero una referencia a la constante no, cuando los dos parecen tener el mismo valor. Ayuda.....


Agregue un solucionador EL personalizado a la cadena de resolución EL, que resolverá las constantes. Un EL Resolver es una clase Java que javax.el.ELResolver clase javax.el.ELResolver .

Gracias,


Las propiedades estáticas no son accesibles en EL. La solución alternativa que uso es crear una variable no estática que se asigna al valor estático.

public final static String MANAGER_ROLE = ''manager''; public String manager_role = MANAGER_ROLE;

Yo uso lombok para generar getter y setter así que está bastante bien. Su EL se ve así:

${bean.manager_role}

Código completo en http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el


Llego tarde a la discusión, pero mi enfoque es un poco diferente. Uso un controlador de etiquetas personalizado para dar a las páginas JSP los valores constantes (numéricos o de cadena) que necesita. Así es como lo hice:

Supuesto que tengo una clase que mantiene todas las constantes:

public class AppJspConstants implements Serializable { public static final int MAXLENGTH_SIGNON_ID = 100; public static final int MAXLENGTH_PASSWORD = 100; public static final int MAXLENGTH_FULLNAME = 30; public static final int MAXLENGTH_PHONENUMBER = 30; public static final int MAXLENGTH_EXTENSION = 10; public static final int MAXLENGTH_EMAIL = 235; }

También tengo esta etiqueta personalizada extremadamente simple:

public class JspFieldAttributes extends SimpleTagSupport { public void doTag() throws JspException, IOException { getJspContext().setAttribute("maxlength_signon_id", AppJspConstants.MAXLENGTH_SIGNON_ID); getJspContext().setAttribute("maxlength_password", AppJspConstants.MAXLENGTH_PASSWORD); getJspContext().setAttribute("maxlength_fullname", AppJspConstants.MAXLENGTH_FULLNAME); getJspContext().setAttribute("maxlength_phonenumber", AppJspConstants.MAXLENGTH_PHONENUMBER); getJspContext().setAttribute("maxlength_extension", AppJspConstants.MAXLENGTH_EXTENSION); getJspContext().setAttribute("maxlength_email", AppJspConstants.MAXLENGTH_EMAIL); getJspBody().invoke(null); } }

Entonces tengo un StringHelper.tld. Dentro, tengo esto:

<tag> <name>fieldAttributes</name> <tag-class>package.path.JspFieldAttributes</tag-class> <body-content>scriptless</body-content> <info>This tag provide HTML field attributes that CCS is unable to do.</info> </tag>

En el JSP, incluyo el StringHelper.tld de la manera normal:

<%@ taglib uri="/WEB-INF/tags/StringHelper.tld" prefix="stringHelper" %>

Finalmente, uso la etiqueta y aplico los valores necesarios usando EL.

<stringHelper:fieldAttributes> [snip] <form:input path="emailAddress" cssClass="formeffect" cssErrorClass="formEffect error" maxlength="**${maxlength_email}**"/>&nbsp; <form:errors path="emailAddress" cssClass="error" element="span"/> [snip] </stringHelper:fieldAttributes>


No está funcionando en su ejemplo porque la constante ATTR_CURRENT_USER no es visible para las etiquetas JSTL, que esperan que las funciones getter ATTR_CURRENT_USER propiedades. No lo he probado, pero la forma más limpia de exponer tus constantes parece ser la biblioteca de etiquetas no estándar .

ETA: El enlace anterior que di no funcionó. Nuevos enlaces se pueden encontrar en esta respuesta: constantes de Java en JSP

Fragmentos de código para aclarar el comportamiento que estás viendo: Clase de muestra:

package com.example; public class Constants { // attribute, visible to the scriptlet public static final String ATTR_CURRENT_USER = "current.user"; // getter function; // name modified to make it clear, later on, // that I am calling this function // and not accessing the constant public String getATTR_CURRENT_USER_FUNC() { return ATTR_CURRENT_USER; } }

Fragmento de la página JSP, que muestra el uso de la muestra:

<%-- Set up the current user --%> <% session.setAttribute("current.user", "Me"); %> <%-- scriptlets --%> <%@ page import="com.example.Constants" %> <h1>Using scriptlets</h1> <h3>Constants.ATTR_CURRENT_USER</h3> <%=Constants.ATTR_CURRENT_USER%> <br /> <h3>Session[Constants.ATTR_CURRENT_USER]</h3> <%=session.getAttribute(Constants.ATTR_CURRENT_USER)%> <%-- JSTL --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <jsp:useBean id="cons" class="com.example.Constants" scope="session"/> <h1>Using JSTL</h1> <h3>Constants.getATTR_CURRENT_USER_FUNC()</h3> <c:out value="${cons.ATTR_CURRENT_USER_FUNC}"/> <h3>Session[Constants.getATTR_CURRENT_USER_FUNC()]</h3> <c:out value="${sessionScope[cons.ATTR_CURRENT_USER_FUNC]}"/> <h3>Constants.ATTR_CURRENT_USER</h3> <c:out value="${sessionScope[Constants.ATTR_CURRENT_USER]}"/> <%-- Commented out, because otherwise will error: The class ''com.example.Constants'' does not have the property ''ATTR_CURRENT_USER''. <h3>cons.ATTR_CURRENT_USER</h3> <c:out value="${sessionScope[cons.ATTR_CURRENT_USER]}"/> --%> <hr />

Esto produce:

Usando scriptlets

Constantes.ATTR_CURRENT_USER

usuario actual

Sesión [Constantes.ATTR_CURRENT_USER]

Yo

Usando JSTL

Constants.getATTR_CURRENT_USER_FUNC ()

usuario actual

Sesión [Constants.getATTR_CURRENT_USER_FUNC ()]

Yo

Constantes.ATTR_CURRENT_USER



Primero, su sintaxis tenía un "]" extra que estaba causando un error.

Para arreglar eso, y para establecer una variable, harías esto:

<c:set var="nullUser" scope="session" value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" /> <c:if test="${nullUser}"> <h2>First Test</h2> </c:if> <c:if test="${nullUser}"> <h2>Another Test</h2> </c:if>


Puede definir Constantes.ATTR_CURRENT_USER como una variable con c: establecer, tal como se muestra a continuación:

<c:set var="ATTR_CURRENT_USER" value="<%=Constants.ATTR_CURRENT_USER%>" /> <c:if test="${sessionScope[ATTR_CURRENT_USER] eq null}"> <%-- Do somthing --%> </c:if>


el tema es bastante viejo, pero de todos modos ... :)

Encontré una buena solución para tener Constantes disponibles a través de JSTL. Debe preparar un mapa usando la reflexión y colocarlo donde desee.

El mapa siempre contendrá todas las constantes que defina en la clase Constantes. Puedes ponerlo en ServletContext usando listener y disfrutar constantes en JSTL como:

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


CONSTANTS aquí hay una clave que usaste para poner el mapa en Contexto :-)

Lo siguiente es una parte de mi código que construye un mapa de los campos constantes:

Map<String, Object> map = new HashMap<String, Object>(); Class c = Constants.class; Field[] fields = c.getDeclaredFields(); for (Field field : fields) { int modifier = field.getModifiers(); if (Modifier.isPublic(modifier) && Modifier.isStatic(modifier) && Modifier.isFinal(modifier)) { try { map.put(field.getName(), field.get(null));//Obj param of get method is ignored for static fields } catch (IllegalAccessException e) { /* ignorable due to modifiers check */ } } }