Domanda

Nei moduli HTML, i pulsanti possono essere disabilitati definendo il " disabled " attribuire su di essi, con qualsiasi valore:

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

Se un pulsante deve essere abilitato, l'attributo non dovrebbe esistere in quanto non esiste un valore definito su cui l'attributo disabilitato possa essere impostato che lascerebbe il pulsante abilitato.

Questo mi sta causando problemi quando voglio abilitare / disabilitare i pulsanti quando utilizzo Documenti JSP (jspx). Dato che i documenti JSP devono essere documenti XML ben formati, non riesco a vedere alcun modo di includere condizionalmente questo attributo, poiché qualcosa di simile al seguente non è legale:

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

Mentre potrei replicare il tag due volte usando un JSTL if tag per ottenere l'effetto desiderato, nel mio caso specifico ho più di 15 attributi dichiarati sul pulsante (molti attributi del gestore di eventi javascript per AJAX), quindi la duplicazione del tag sta andando per rendere il JSP molto disordinato.

Come posso risolvere questo problema, senza sacrificare la leggibilità del JSP? Esistono tag personalizzati che possono aggiungere attributi al genitore manipolando il DOM di output?

È stato utile?

Soluzione

Uso un tag JSP personalizzato con attributi dinamici. Lo usi in questo modo:

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

Fondamentalmente, ciò che fa questo tag è generare un elemento XML con elementName e mette tutti gli attributi presenti nel tag, ma salta quelli vuoti.

Il tag stesso è abbastanza facile da implementare, la mia implementazione è lunga solo 44 righe.

Altri suggerimenti

Puoi usare il tag <jsp:text> per risolvere questo problema usando un XML valido:

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

Questo è ovviamente più dettagliato di alcune altre soluzioni. Ma è completamente autonomo : non sono richiesti tag personalizzati. Inoltre, si ridimensiona facilmente per tutti gli attributi di cui hai bisogno.

@alex ottima soluzione per usare l'operatore ternario. Aggiungo alcuni dei miei esempi, che grazie a te ho appena cambiato il risultato della condizione, se vero, scrive l'attributo, altrimenti non scrivo nulla

per popolare l'elenco e selezionare il valore utilizzato, evitando 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>

per controllare all'avvio un pulsante di opzione per evitare 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' : ''} />

Immagino sia passato del tempo dall'ultimo post su questo, ma ho riscontrato lo stesso identico problema con i tag <select><option selected="selected">, ovvero dichiarando dinamicamente quale opzione è selezionata. Per risolverlo ho creato un tagx personalizzato; Ho pubblicato i dettagli in un'altra rispondi qui

Sono giunto alla conclusione che non esiste una bella scorciatoia; Le espressioni EL e JSP possono esistere solo all'interno degli attributi dell'elemento XML (e nel contenuto del corpo). Quindi devi fare quanto segue;

<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'uso della notazione degli scriptlet non funzionerà per i documenti JSP (.jspx)

Leggendo su un jsp in jspx ho trovato un < jsp: element > e < jsp: attributo > . Se ho capito bene, dovresti essere in grado di fare qualcosa del genere

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

e avere l'output del motore jsp

<button someAttribute="value"/>

o qualcosa del genere. L'unico problema, sottolineato nella pagina sopra, è che questo non sembra funzionare bene con costrutti condizionali. L'autore del convertitore ha lavorato attorno alla creazione di alcuni tag helper, che puoi dare un'occhiata al download del codice sorgente immagino. Spero che sia d'aiuto.

Crea una libreria di tag (.tagx) quindi usa il tag scriptlet.

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

Sì, questo è barare ... ma fa il lavoro. Inoltre puoi fare in questo modo una ricorsione davvero complicata per le strutture ad albero.

Ho anche pubblicato un'altra soluzione sul mio blog e gist.github che utilizza un sacco di librerie tagx: http://adamgent.com/post/8083703288/conditionally-set-an-attribute-on-an-element-with-jspx

Il <% = blah% > la sintassi non è un XML legale necessario per i documenti JSP. Hai 2 opzioni:

  1. Sostituisci <% = (isDisabled)? & Quot; disabili " : " " % & Gt; con < jsp.expression > (isDisabled)? & Quot; disabili " : " " < /jsp.expression>
  2. Usa Core taglib ed EL (assicurati che isDisabled sia inserito nell'ambito della pagina) in questo modo:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

Spero che aiuti :)

Ho appena avuto problemi con lo stesso problema. Ho provato a usare < jsp: nome attributo = " disabled " / > all'interno di < c: if > , ma il compilatore tenta di collegare l'attributo disabilitato al Elemento c: if che non riesce. Ma ho scoperto che funziona ( stripes: submit è un elemento per la creazione di un pulsante di tipo submit in stripes):

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

Sembra che jsp: attributo non creerà affatto un attributo se il corpo contiene solo spazi bianchi, quindi si ottiene disabled = " disabled " o nulla a tutti.

Funzionerà solo se stai usando una sorta di taglib per generare il pulsante, e l'elemento tag deve supportare l'attributo disabilitato (passandolo all'elemento HTML sottostante). Non puoi usare jsp: attributo per aggiungere un attributo a un elemento HTML non elaborato.

In realtà non uso JSP (e ho risposto una volta, poi l'ho cancellato quando ho capito la cosa "da XML valida"). Il più pulito che posso inventare è questo:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top