2009-11-19 7 views
5

Ein paar HTML-Tags interpretieren "Any" -Wert eines Give-Attributs als "True" -> Option Tags in den Sinn kommen.Wie <option selected = "true"> von JSPX ausgegeben wird?

ich am Ende häufig so etwas wie dies zu tun:

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

Ich weiß, dass ich eine benutzerdefinierte erklären kann dieses Verhalten encapslate aber dass auch ziemlich hässlich wird, wenn ich es nicht in Java-Code.

Gibt es einen klügeren Weg, dies zu tun?

Antwort

0

Ja, eine intelligentere Weise

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

wie das ist, zu schreiben wäre, was mandated by XHTML ist.

Ich weiß, das ist nicht das, was Sie wirklich fragen :-) Ich denke, Ihre Art und Weise in Ordnung ist, oder Sie können stattdessen einen bedingten Ausdruck verwenden:

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

Es ist kürzer, wenn auch nicht unbedingt schöner.

+0

Nizza antwort, schade, dass es hier nicht funktioniert. Welche Version von jspx macht das für Sie? Sind Sie sicher, dass dies nicht jsp ist? – krosenvold

+0

Sorry, es ist in der Tat JSP; Ich habe sie gekreuzt. Ich nehme an, dass Ihr Weg der einzige ist, der dann anwendbar ist; c: wenn auch in diesem Fall nicht funktionieren wird. – ChssPly76

1

Eine Möglichkeit, dies zu erreichen, wäre die Verwendung von benutzerdefinierten Tags.

mag ich den Ansatz, dass der JSP2X Konverter nimmt, benutzerdefinierte Tags in Ihren WEB-INF/tags Ordner definieren, die Sie dies tun lassen:

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

Ein kompakter Ansatz könnte sein, einen benutzerdefinierten Tag speziell zu schaffen für eine Option, die das Richtige getan hat, indem sie einen booleschen Wert für das ausgewählte Attribut verwendet und ein ausgewähltes = "ausgewählt" Attribut ausgibt, wenn es wahr ist, nicht anders. Dies wäre ein bisschen kompakter sein:

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

Ich dachte nicht c: wenn Bedingungen in Element-Tags erlaubt wären. Ist das eine Änderung späterer Spezifikationen? – krosenvold

+0

Dieses jspx: -Element befindet sich nicht in der Spezifikation, es ist ein benutzerdefiniertes Tag, das von JSP2X gelöscht wurde. –

+0

* seufz * Wünschte, du könntest diese Kommentare bearbeiten. =) –

0

Für das <select><option selected="selected"> Problem, ich habe ich beschlossen, nicht ein bisschen verboseness dagegen hätte, wenn es nur eine zeit verboseness ist ... so dass ich einen Tag Dokument erstellt (.tagx) in /WEB-INF/tags/select.tagx etwa so:

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

und es verwenden, etwa so:

<?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, bin ich nicht einverstanden, dass dieses hässliche ist ... vielleicht ärgerlich, aber ich bin eigentlich Ich war froh, dass ich nicht musste richte irgendeinen Code dafür ein. Sobald Sie das Tag definiert haben, werden Ihre JSPXs viel aufgeräumter. Außerdem glaube ich einfach nicht, dass es eine Abkürzung dafür gibt.

+0

Verwenden Sie einfach den ternären Operator in EL. '

+0

Hast du das tatsächlich versucht? Es funktioniert nicht - es ist völlig ungültiges XML. –

0

Es gibt einen anderen Weg, um dies zu umgehen. Es ist ein bisschen wie ein Hack, aber eine Alternative zur Verwendung einer Taglib oder einer Auswahl, wo du das Tag duplizierst, was ich ziemlich gut finde.

Sie können den Tag in einem jstl Set-Tag als Wert, so etwas wie dieses bauen:

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

Dann, wo immer Sie wollen, dass Tag, die Sie gerade Ausgabe wie folgt:

${mytag}