Pregunta

Esta pregunta ya tiene 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 usar estas constantes dentro de un JSP para probar la presencia de estos atributos, algo 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 entender la sintaxis correcta.Además, para evitar repetir las pruebas bastante largas anteriores en varios lugares, me gustaría asignar el resultado a una variable local (de alcance de página) y hacer referencia a ella en su lugar.Creo que puedo hacer esto con <c:set>, pero nuevamente estoy luchando por encontrar la sintaxis correcta.

ACTUALIZAR: Además de la sugerencia a continuación, probé:

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

lo cual no funcionó.Entonces, intenté sustituir el valor literal de la constante.También agregué la constante al contenido de la página, para poder verificar el valor de la constante cuando se representa la página.

<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 puedo explicar por qué funciona el uso del literal String, pero una referencia a la constante no, cuando los dos parecen tener el mismo valor.Ayuda.....

¿Fue útil?

Solución

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

Hora estimada de llegada:El antiguo enlace que di no funcionó.Se pueden encontrar nuevos enlaces 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 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]

A mí


Usando JSTL

Constantes.getATTR_CURRENT_USER_FUNC()

usuario actual

Sesión[Constants.getATTR_CURRENT_USER_FUNC()]

A mí

Constantes.ATTR_CURRENT_USER



Otros consejos

el tema es bastante viejo, pero en fin... :)

Encontré una buena solución para tener constantes disponibles a través de JSTL.Debes preparar un mapa usando el reflejo y colocarlo donde quieras.

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

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


CONSTANTES aquí hay una clave que usaste para poner el mapa en contexto    :-)


El siguiente es un fragmento de mi código que crea 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 */ }
   }
}

Puede definir Constants.ATTR_CURRENT_USER como una variable con c:set, 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> 

No se puede acceder a las propiedades estáticas en EL.La solución que utilizo es crear una variable no estática que se asigna a sí misma al valor estático.

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

Utilizo lombok para generar el captador y el definidor, así que está bastante bien.Tu EL se ve así:

${bean.manager_role}

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

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

Supongamos 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 JSP, incluyo StringHelper.tld de la forma 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>

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

Gracias,

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

Para solucionarlo y 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top