Question

    

Cette question a déjà une réponse ici:

    
            
  •              Comment référencer les constantes dans EL?                                      12 réponses                          
  •     
    

J'ai une classe qui définit les noms de divers attributs de session, par exemple

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

J'aimerais utiliser ces constantes dans une JSP pour tester la présence de ces attributs, comme par exemple:

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

Mais je n'arrive pas à obtenir le code correct. De plus, pour éviter de répéter les tests plutôt longs ci-dessus à plusieurs endroits, j'aimerais attribuer le résultat à une variable locale (à portée de page) et vous y référer. Je pense que je peux le faire avec <c:set>, mais encore une fois, j'ai du mal à trouver la syntaxe correcte.

MISE À JOUR: Suite à la suggestion ci-dessous, j'ai essayé:

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

qui n'a pas fonctionné. Alors au lieu de cela, j'ai essayé de substituer la valeur littérale de la constante. J'ai également ajouté la constante au contenu de la page afin de pouvoir vérifier la valeur de la constante lors du rendu de la page

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

Cela a bien fonctionné et la valeur attendue a été imprimée " current.user " sur la page. Je n'arrive pas à expliquer pourquoi l'utilisation du littéral String fonctionne, mais pas la référence à la constante, lorsque les deux semblent avoir la même valeur. Aide .....

Était-ce utile?

La solution

Cela ne fonctionne pas dans votre exemple car la constante ATTR_CURRENT_USER n'est pas visible par les balises JSTL, qui s'attendent à ce que les propriétés soient exposées par les fonctions getter. Je ne l’ai pas essayé, mais le moyen le plus propre d’exposer vos constantes semble être le Bibliothèque de balises non standard .

ETA: L’ancien lien que j’ai donné ne fonctionnait pas. Vous trouverez de nouveaux liens dans cette réponse: constantes Java dans JSP

Des extraits de code permettant de clarifier le comportement observé: Classe d'échantillon:

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


}    

Extrait de la page JSP, présentant un exemple d'utilisation:

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

Cette sortie:

Utilisation des scriptlets

Constantes.ATTR_CURRENT_USER

current.user

Session [Constants.ATTR_CURRENT_USER]

moi

Utilisation de JSTL

Constants.getATTR_CURRENT_USER_FUNC ()

utilisateur actuel

Session [Constants.getATTR_CURRENT_USER_FUNC ()]

moi

Constantes.ATTR_CURRENT_USER



Autres conseils

le sujet est assez ancien, mais de toute façon ..:)

J'ai trouvé une bonne solution pour avoir des constantes disponibles via JSTL. Vous devriez préparer une carte en utilisant la réflexion et la placer où vous voulez.

La carte contiendra toujours toutes les constantes que vous définissez dans la classe Constants. Vous pouvez le mettre dans ServletContext à l'aide de listener et profiter des constantes dans JSTL comme:

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


CONSTANTES est une clé que vous avez utilisée pour mettre la carte en contexte & Nbsp; & Nbsp; :-)

Voici un extrait de mon code permettant de créer une carte des champs de 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 */ }
   }
}

Vous pouvez définir Constants.ATTR_CURRENT_USER en tant que variable avec c: set, comme ci-dessous:

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

Les propriétés statiques ne sont pas accessibles dans EL. La solution que j’utilise consiste à créer une variable non statique qui s’assigne à la valeur statique.

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

J'utilise lombok pour générer le getter et le setter, donc c'est assez bien. Votre EL ressemble à ceci:

${bean.manager_role}

Le code complet est disponible à l'adresse http: // www. .ninthavenue.com.au / java-static-constants-in-jsp-and-jsf-el

Je suis en retard pour la discussion, mais mon approche est un peu différente. J'utilise un gestionnaire de balises personnalisé pour donner aux pages JSP les valeurs constantes (numériques ou chaînes) dont elle a besoin. Voici comment je l'ai fait:

Supposons que j'ai une classe qui garde toutes les 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;
}

J'ai aussi cette balise personnalisée extrêmement 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);
    }
}

Ensuite, j'ai un StringHelper.tld. A l'intérieur, j'ai ceci:

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

Sur le JSP, j'inclus StringHelper.tld normalement:

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

Enfin, j'utilise la balise et applique les valeurs nécessaires en utilisant 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>

Branchez un résolveur EL personnalisé à la chaîne de résolveur EL, qui résoudra les constantes. Un résolveur EL est une classe Java qui étend javax.el.ELResolver classe.

Merci,

D'abord, votre syntaxe avait un extra "]]! " qui causait une erreur.

Pour résoudre ce problème et définir une variable, procédez comme suit:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top