web-dev-qa-db-fra.com

accès aux constantes dans JSP (sans scriptlet)

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

Je voudrais utiliser ces constantes dans une JSP pour tester la présence de ces attributs, quelque chose comme:

<%@ 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 sytax correct. De plus, pour éviter de répéter les tests assez longs ci-dessus à plusieurs endroits, j'aimerais attribuer le résultat à une variable locale (portée de page) et y faire référence à la place. Je crois 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é. Au lieu de cela, j'ai essayé de remplacer 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 il a imprimé la valeur attendue "current.user" sur la page. Je ne suis pas en mesure d'expliquer pourquoi l'utilisation du littéral String fonctionne, mais pas une référence à la constante, lorsque les deux semblent avoir la même valeur. Aidez-moi.....

26
Dónal

Cela ne fonctionne pas dans votre exemple, car le ATTR_CURRENT_USER constant 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 la façon la plus propre d'exposer vos constantes semble être la bibliothèque de balises non standard .

ETA: Le vieux lien que j'ai donné n'a pas fonctionné. De nouveaux liens peuvent être trouvés dans cette réponse: constantes Java dans JSP

Extraits de code pour clarifier le comportement que vous voyez: Exemple de classe:

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, montrant 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 />

Cela produit:

Utilisation de scriptlets

Constants.ATTR_CURRENT_USER

utilisateur actuel

Session [Constants.ATTR_CURRENT_USER]

Moi


Utilisation de JSTL

Constants.getATTR_CURRENT_USER_FUNC ()

utilisateur actuel

Session [Constants.getATTR_CURRENT_USER_FUNC ()]

Moi

Constants.ATTR_CURRENT_USER



12
Athena

Vous pouvez définir Constants.ATTR_CURRENT_USER comme une 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> 
5
daniel.deng

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

J'ai trouvé une bonne solution pour que les constantes soient disponibles via JSTL. Vous devez préparer une carte à l'aide de la réflexion et la placer où vous le souhaitez.

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

${CONSTANTS["CONSTANT_NAME_IN_Java_CLASS_AS_A_STRING"]}


CONSTANTS voici une clé que vous avez utilisée pour mettre la carte en contexte :-)


Ce qui suit est un morceau de mon code construisant une carte des champs constants:

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

Les propriétés statiques ne sont pas accessibles dans EL. La solution de contournement 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}

Code complet sur http://www.ninthavenue.com.au/Java-static-constants-in-jsp-and-jsf-el

1
Roger Keays

Je suis en retard à 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îne) dont il 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 également 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 le StringHelper.tld de la manière normale:

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

Branchez un résolveur EL personnalisé à la chaîne de résolveurs EL, qui résoudra les constantes. Un EL Resolver est Java class extension javax.el.ELResolver class.

Merci,

1
Ramesh PVK