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.....
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:
utilisateur actuel
Moi
utilisateur actuel
Moi
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>
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 */ }
}
}
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
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}**"/>
<form:errors path="emailAddress" cssClass="error" element="span"/>
[snip]
</stringHelper:fieldAttributes>
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,