Définition conditionnelle d'un attribut sur un élément avec des documents JSP (JSPX)

StackOverflow https://stackoverflow.com/questions/157005

  •  03-07-2019
  •  | 
  •  

Question

Dans les formulaires HTML, les boutons peuvent être désactivés en définissant le " disabled " attribuer sur eux, avec n'importe quelle valeur:

<button name="btn1" disabled="disabled">Hello</button>

Si un bouton doit être activé, l'attribut ne doit pas exister car il n'y a pas de valeur définie pour l'attribut désactivé qui laisserait le bouton activé.

Cela me pose des problèmes lorsque je souhaite activer / désactiver des boutons lors de l’utilisation de documents JSP (jspx). Étant donné que les documents JSP doivent être des documents XML bien formés, je ne vois aucun moyen d'inclure cet attribut de manière conditionnelle, car ce qui suit n'est pas légal:

<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>

Alors que je pouvais dupliquer la balise deux fois en utilisant une balise JSTL si pour obtenir l'effet souhaité, dans mon cas particulier, j'ai plus de 15 attributs déclarés sur le bouton (beaucoup d'attributs de gestionnaire d'événements javascript pour AJAX), donc la duplication de la balise est en cours rendre le JSP très désordonné.

Comment puis-je résoudre ce problème sans sacrifier la lisibilité du JSP? Existe-t-il des balises personnalisées pouvant ajouter des attributs au parent en manipulant le DOM de sortie?

Était-ce utile?

La solution

J'utilise une balise JSP personnalisée avec des attributs dynamiques. Vous l'utilisez comme ceci:

<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/>

En gros, cette balise génère un élément XML avec elementName et met tous les attributs présents dans la balise, mais ignore les attributs vides.

La balise elle-même est assez facile à mettre en oeuvre, ma mise en oeuvre ne fait que 44 lignes.

Autres conseils

Vous pouvez utiliser la balise <jsp:text> pour résoudre ce problème à l'aide d'un code XML valide:

<jsp:text><![CDATA[<button name="btn1"]]></jsp:text>
    <c:if test="${isDisabled}"> disabled="disabled"</c:if>
    >
    Hello!
<jsp:text><![CDATA[</button>]]></jsp:text>

C’est évidemment plus bavard que d’autres solutions. Mais c'est complètement autonome : aucune balise personnalisée n'est requise. En outre, il adapte facilement à autant d'attributs que vous avez besoin.

@alex excellente solution pour utiliser l'opérateur ternaire. J'ajoute quelques-uns de mes exemples qui, grâce à vous, je viens de changer le résultat de la condition, si true, écrit l'attribut, sinon n'écrit rien

pour remplir la liste et sélectionner la valeur utilisée, en évitant c: if

<select id="selectLang" name="selectLang" >
<c:forEach var="language" items="${alLanguages}" >
    <option value="${language.id}" ${language.code == usedLanguage ? 'selected' : ''} >${language.description}</option>
</c:forEach>

pour vérifier au démarrage un bouton radio pour éviter c: if:

<input type="radio" id="id0" value="0" name="radio" ${modelVar == 0 ? 'checked' : ''} />
<input type="radio" id="id1" value="1" name="radio" ${modelVar == 1 ? 'checked' : ''} />
<input type="radio" id="id2" value="2" name="radio" ${modelVar == 2 ? 'checked' : ''} />

Je suppose qu'un certain temps s'est écoulé depuis le dernier message, mais je me suis heurté exactement au même problème avec les balises <select><option selected="selected">, c'est-à-dire en déclarant dynamiquement quelle option est sélectionnée. Pour résoudre ce problème, j'ai créé un tagx personnalisé. J'ai posté les détails dans un autre répondre ici

Je suis arrivé à la conclusion qu'il n'y avait pas de raccourci agréable; Les expressions EL et JSP ne peuvent exister que dans les attributs d'élément XML (et dans le contenu du corps). Vous devez donc procéder comme suit:

<c:choose>
    <c:when test="${isDisabled}"><button name="btn1" disabled="disabled">Hello</button></c:when>
    <c:otherwise><button name="btn1">Hello</button></c:otherwise>
</c:choose>

L'utilisation de la notation de scriptlet ne fonctionnera pas pour les documents JSP (.jspx)

En savoir plus sur un jspx convertisseur < jsp: élément > et balises < jsp: attribut > . Si je comprends bien, vous devriez pouvoir faire quelque chose comme

<jsp:element name="button">
  <jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>

et avoir la sortie du moteur JSP

<button someAttribute="value"/>

ou quelque chose comme ça. Le seul problème, souligné dans la page ci-dessus, est que cela ne semble pas bien fonctionner avec les constructions conditionnelles. L'auteur du convertisseur a travaillé à la création de balises auxiliaires, que vous pouvez consulter pour télécharger le code source, je suppose. J'espère que ça aide.

Créez une bibliothèque de balises (.tagx), puis utilisez la balise scriptlet.

Voir http://code.google.com/p/jatl/wiki/JSPExample

<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1">
<jsp:directive.page import="com.googlecode.jatl.Html"/>
<jsp:directive.page import="com.evocatus.product.data.AttributeValue"/>
<jsp:directive.page import="com.evocatus.domain.Product"/>

<jsp:scriptlet>
//<![CDATA[
    final Product p = (Product) request.getAttribute("product");
        new Html(out) {{
           for (AttributeValue v : p.summaryAttributeValues()) {
                   p();
                        strong().text(v.getLabel()).end();
                        text(": " + v.getValue());
                   endAll();
           }
        }};
//]]>
</jsp:scriptlet>

</jsp:root>

Oui, c'est de la triche ... mais le travail est fait. De plus, vous pouvez faire de cette manière une récursion compliquée vraiment méchante pour les arborescences.

J'ai également posté une autre solution sur mon blog et sur gist.github qui utilise un ensemble de bibliothèques de tagx: http://adamgent.com/post/8083703288/conditional-set-an-attribute-on-an-element-with-jspx

Le <% = blah% > la syntaxe n'est pas légale XML nécessaire pour les documents JSP. Vous avez 2 options:

  1. Remplacer <% = (isDisabled)? " désactivé " : " % > avec < jsp.expression > (isDisabled)? " désactivé " : " < /jsp.expression>
  2. Utilisez les balises Core et EL (assurez-vous que isDisabled est placé dans le champ de la page) comme suit:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

J'espère que cela vous aidera:)

Je viens juste de me débattre avec le même problème. J'ai essayé d'utiliser < jsp: attribut name = " disabled "/ > dans < c: if > , mais le compilateur essaie d'attacher l'attribut désactivé à la c: élément if qui échoue. Mais j’ai trouvé que cela fonctionnait ( stripes: submit est un élément permettant de créer un bouton de type submit in stripes):

<stripes:submit name="process" value="Hello">
   <jsp:attribute name="disabled">
       <c:if test="${x == 0}">disabled</disabled>
   </jsp:attribute>
</stripes:submit>

Il semble que jsp: attribut ne crée pas d'attribut du tout si le corps ne contient que des espaces; vous obtenez donc disabled = "désactivé" ou ou rien du tout. tous.

Cela ne fonctionnera que si vous utilisez une sorte de taglib pour générer le bouton, et que l'élément de balise doit prendre en charge l'attribut disabled (en le passant à l'élément HTML sous-jacent). Vous ne pouvez pas utiliser jsp: attribut pour ajouter un attribut à un élément HTML brut.

Je n’utilise pas vraiment JSP (et j’ai répondu une fois, puis je l’ai effacé lorsque j’ai compris le principe "doit par XML valide"). Le plus propre que je puisse trouver est le suivant:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top