Domanda

    

Questa domanda ha già una risposta qui:

    
            
  •              Come fare riferimento a costanti in EL?                                      12 risposte                          
  •     
    

Ho una classe che definisce i nomi di vari attributi di sessione, ad esempio

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

Vorrei usare queste costanti all'interno di un JSP per verificare la presenza di questi attributi, qualcosa del tipo:

<%@ 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>

Ma non riesco a capire correttamente la sintassi. Inoltre, per evitare di ripetere i test piuttosto lunghi sopra in più punti, vorrei assegnare il risultato a una variabile locale (con ambito pagina) e fare riferimento a quello. Credo di poterlo fare con <c:set>, ma ancora faccio fatica a trovare la sintassi corretta.

AGGIORNAMENTO: in seguito al suggerimento seguente, ho provato:

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

che non ha funzionato. Quindi, invece, ho provato a sostituire il valore letterale della costante. Ho anche aggiunto la costante al contenuto della pagina, in modo da poter verificare il valore della costante durante il rendering della pagina

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

Funzionava bene e stampava il valore atteso " current.user " sulla pagina. Non riesco a spiegare perché usare il valore letterale String funzioni, ma un riferimento alla costante no, quando i due sembrano avere lo stesso valore. Aiuto .....

È stato utile?

Soluzione

Nel tuo esempio non funziona perché la costante ATTR_CURRENT_USER non è visibile ai tag JSTL, che prevedono che le proprietà vengano esposte dalle funzioni getter. Non l'ho provato, ma il modo più pulito di esporre le tue costanti sembra essere il libreria di tag non standard .

ETA: il vecchio link che ho fornito non funzionava. Nuovi collegamenti sono disponibili in questa risposta: Costanti Java in JSP

Snippet di codice per chiarire il comportamento che stai riscontrando: Classe di esempio:

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;
    }


}    

Snippet della pagina JSP, che mostra l'utilizzo di esempio:

<%-- 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 />

Questo output:

Uso degli scriptlet

Constants.ATTR_CURRENT_USER

current.user

Session [Constants.ATTR_CURRENT_USER]

Me


Uso di JSTL

Constants.getATTR_CURRENT_USER_FUNC ()

current.user

Session [Constants.getATTR_CURRENT_USER_FUNC ()]

Me

Constants.ATTR_CURRENT_USER


Altri suggerimenti

l'argomento è piuttosto vecchio, ma comunque .. :)

Ho trovato una buona soluzione per avere Costanti disponibili tramite JSTL. Dovresti preparare una mappa usando la riflessione e metterla dove vuoi.

La mappa conterrà sempre tutte le costanti definite nella classe Costanti. Puoi inserirlo in ServletContext usando listener e goderti le costanti in JSTL come:

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


COSTANTI qui è una chiave che hai usato mettendo la mappa nel contesto & Nbsp; & Nbsp; :-)


Quello che segue è un pezzo del mio codice che costruisce una mappa dei campi costanti:

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 */ }
   }
}

Puoi definire Constants.ATTR_CURRENT_USER come una variabile con c: set, proprio come sotto:

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

Le proprietà statiche non sono accessibili in EL. La soluzione alternativa che uso è quella di creare una variabile non statica che si assegna al valore statico.

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

Uso lombok per generare il getter e il setter, quindi è abbastanza bene. Il tuo EL si presenta così:

${bean.manager_role}

Codice completo all'indirizzo http: // www .ninthavenue.com.au / java-static-costanti-in-jsp-e-jsf-el

Sono in ritardo alla discussione, ma il mio approccio è leggermente diverso. Uso un gestore di tag personalizzato per fornire alle pagine JSP i valori costanti (numerici o stringa) di cui ha bisogno. Ecco come l'ho fatto:

Suppongo di avere una classe che mantiene tutte le costanti:

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;
}

Ho anche questo tag personalizzato estremamente semplice:

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);
    }
}

Quindi ho un StringHelper.tld. All'interno, ho questo:

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

Sul JSP, includo StringHelper.tld nel modo normale:

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

Infine, utilizzo il tag e applico i valori necessari 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>

Inserisci un risolutore EL personalizzato nella catena del resolver EL, che risolverà le costanti. Un EL Resolver è una classe Java che estende javax.el.ELResolver classe.

Grazie,

Innanzitutto, la tua sintassi aveva un "] " che stava causando un errore.

Per risolvere questo problema e per impostare una variabile devi fare questo:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top