2009-11-19 15 views
5

Alcuni tag html interpretano "qualsiasi" valore di un attributo give come "true" -> i tag di opzione vengono in mente.Come stampare <opzione selezionata = "vero"> da JSPX?

Mi capita spesso finisce per fare qualcosa di simile:

<c:choose> 
    <c:when test="${isSelected}"/> 
     <option selected="true">Opt1</option> 
    </c:when> 
    <c:otherwise/> 
     <option>Opt1</option> 
    </c:otherwise> 
</c:choose> 

so di poter dichiarare un personalizzato per encapslate questo comportamento ma che ottiene anche abbastanza brutto, a meno che I Codice in Java.

C'è un modo più intelligente per fare questo?

risposta

0

Sì, un modo più intelligente sarebbe quella di scrivere

<option selected="selected">Opt1</option> 

in quanto questo è ciò che è mandated by XHTML.

So che non è quello che stai davvero chiedendo :-) Penso che il tuo modo va bene oppure è possibile utilizzare un'espressione condizionale invece:

<option ${isSelected?"selected=\"selected\"":""}>Opt1</option> 

E 'più breve anche se non necessariamente più bella.

+0

Nizza risposta, peccato che non funzioni qui. Quale versione di jspx fa questo per te? Sei sicuro che non sia jsp? – krosenvold

+0

Scusa, è davvero JSP; Li ho incrociati. Suppongo che la tua strada sia l'unica applicabile allora; c: se non funzionerà neanche in questo caso. – ChssPly76

1

Un modo per avvicinarsi a questo sarebbe utilizzare tag personalizzati.

mi piace l'approccio che il convertitore JSP2X prende, definendo tag personalizzati nella cartella WEB-INF/tag che consentono di fare questo:

<jspx:element name="option"> 
    <c:if test="${selected}"> 
     <jspx:attribute name="selected">selected</jspx:attribute> 
    </c:if> 
    <jspx:body>Opt1</jspx:body> 
</jspx:element> 

Un approccio più compatto potrebbe essere quello di creare un tag personalizzato specificamente per un'opzione che ha fatto la cosa giusta, prendendo un valore booleano per l'attributo selezionato, emettendo un attributo selezionato = "selezionato" se è vero, non altrimenti. Questo sarebbe un po 'più compatta:

<jspx:option selected="${selected}">Opt1</option> 
+0

Non pensavo c: se i condizionali erano consentiti all'interno dei tag dell'elemento. È un cambiamento nelle specifiche successive? – krosenvold

+0

Questi elementi jspx: non sono nella specifica, è un tag personalizzato rilasciato da JSP2X. –

+0

* sigh * Vorrei poter modificare questi commenti. =) –

0

Per il problema <select><option selected="selected">, ho deciso non mi dispiacerebbe un po' di verboseness, se era solo un-tempo-verboseness ... così ho creato un documento tag (.tagx) in /WEB-INF/tags/select.tagx in questo modo:

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 

    <jsp:directive.attribute name="id" required="true" /> 
    <jsp:directive.attribute name="name" required="true" /> 
    <jsp:directive.attribute name="options" required="true" /> 
    <jsp:directive.attribute name="selected" required="true" /> 

    <select id="${id}" name="${name}"> 
    <c:forEach var="opt" items="${options}"> 
     <c:choose> 
     <c:when test="${opt == selected}"><option selected="selected">${opt}</option></c:when> 
     <c:otherwise><option>${opt}</option></c:otherwise> 
     </c:choose> 
    </c:forEach> 
    </select> 
</jsp:root> 

e usarlo in questo modo:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<html xmlns="http://www.w3.org/1999/xhtml" version="2.1" 
    ... 
    xmlns:form="urn:jsptagdir:/WEB-INF/tags/"> 

    ... 

    <head> 
     ... 
    </head> 
    <body> 
     <form method="POST" commandName="loginRequest" action="index_login.html"> 
      <fieldset id="loginFieldSet"> 
       ... 

       <div> 
        <label for="day" path="day">Favourite day: </label> 
        <form:select id="day" name="day" selected="Saturday" 
         options="Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday" /> 
       </div> 
      </fieldset> 
      <div> 
      <input type="submit" tabindex="3" /> 
      <input type="reset" tabindex="4" /> 
      </div> 
     </form> 
    </body> 
</html> 

krosenvold, non sono d'accordo che questo è brutto ... forse fastidioso ma sono in realtà felice di non aver avuto w rite qualsiasi codice per questo. Una volta definito il tag, i tuoi JSPX diventano molto più ordinati. Inoltre, semplicemente non penso che ci sia una scorciatoia per questo.

+0

Basta usare l'operatore ternario in EL. ' '. Non c'è bisogno di un travolgente '' o '' e duplicazione del codice. – BalusC

+0

Hai mai provato questo? Non funziona: è un XML totalmente invalido. –

0

C'è un altro modo per aggirare questo. È un po 'un trucco, ma un'alternativa all'utilizzo di un taglib o di una scelta in cui si duplica il tag che ho scoperto funziona abbastanza bene.

È possibile costruire il tag all'interno di un insieme di tag JSTL come valore, qualcosa di simile:

<c:set var="mytag" value="&lt; option ${isSelected ? 'selected='\true\' : '' } &gt;"> 

Allora, dove vuoi che tag, basta output come questo:

${mytag} 
Problemi correlati