2016-12-15 4 views
0

Ich habe eine Auswahl mit JSP erzeugt, die gut funktioniert. Hier ist der Code, den ich verwende:Erstellen von Select mit optgroup mit Jsp

<select class="heading4Black" name="DailyTasks" onchange="showreport(this)"> 
<% 
for (int i = 0; i < links.size(); i++) { 
    elem = (Element) links.get(i); 
%> 

    <option title='<%=elem.attributeValue("tooltip") %>' value='<%= elem.attributeValue("url")%>' <%= (i == 0) ? "selected" : "" %> ><%=elem.attributeValue("name")%></option> 
<% 
} 
%> 
    </select> 

Dies gibt mir die Ausgabe, die ich will. Jetzt habe ich eine Verpflichtung, eine optgroup zu einem der Auswahlmöglichkeiten hinzuzufügen, so dass anstelle eine Auswahl mit Optionen wie folgt aufweist:

option1 
option2 
option3 

Ich brauche option2 eine HTML-optgroup zu machen, so dass mein wählen aussehen sollte wie folgt:

Ich habe versucht, jstl und c zu verwenden: Wählen Sie, aber ich habe viel Mühe damit. Hier ist der Code, den ich habe versucht mit (und Variationen davon):

<select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)"> 
<% 
for (int i = 0; i < links.size(); i++) { 
    elem = (Element) links.get(i); 
%> 

<c:choose> 
<c:when test="'${elem[i].attributeValue("name")}'=='Facility Ticket'"> 
<optgroup label="Some String"> 
     <option>One</option> 
     <option>Two</option> 
    </optgroup>  
</c:when>  
<c:otherwise> 
    <option title='<%=elem.attributeValue("tooltip") %>' value='<%= elem.attributeValue("url")%>' <%= (i == 0) ? "selected" : "" %> ><%=elem.attributeValue("name")%></option> 
</c:otherwise> 
</c:choose>   
<% 
    } 
    %> 
</select> 

Was bekomme ich stattdessen eine select mit Optionen, die wie folgt aussehen:

Some String 
    subopt1 
    subopt2 
Option1 
Some String 
    subopt1 
    subopt2 
Option2 
Some String 
    subopt1 
    subopt2 

Kann jemand einige Hinweise liefern, Wie funktioniert das? Bitte beachten Sie, dass ich wirklich ein Javascript-Typ bin. Ich habe dieses JSP-Projekt geworfen, weil ich vor ungefähr 10 Jahren etwas davon erfahren hatte. Dank

+0

ist meine Lösung, was Sie suchen. Wenn ja, können Sie die Antwort akzeptieren und upvoten. Wenn nicht, geben Sie weitere Informationen an. –

Antwort

1

Problem 1:

Ihr Ausgang deutet darauf hin, dass die JSTL (wählen, wenn, sonst) ignoriert.
Sie erhalten den Code innerhalb der whenundotherwise für jede Iteration. Diese ist, weil Sie wahrscheinlich diese Zeile vor dem JSP hinzuzufügen vergessen:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

Durch das Hinzufügen der Zeile oben, können Sie die Bewertung des Kerns der JSP Standard-Tag-Bibliothek aktivieren. So werden Tags wie <c:tags> verarbeitet. Andernfalls werden sie so wie sie sind an den Browser gesendet.
(Sie können den HTML-Code im Browser (Chrome & Firefox) sehen CTRL+U durch Drücken)

Problem 2:

Nach dem Fixieren, dass Sie wahrscheinlich Kompilierungsfehlern begegnen. Die c:when Linie ist Buggy:

<c:when test="'${elem[i].attributeValue("name")}'=='Facility Ticket'"> 

kann ich mehrere Probleme sehen:

  • Keine Notwendigkeit der Index [i], Sie haben bereits Zugriff auf das Element von links.get(i):
  • Sie versuchen, den Zugriff auf elem durch Ausdruck Sprache ${elem...}, aber das funktioniert nur, wenn diese Scriptlet-Variable einem Attribut zugewiesen ist.

Lösung mit Scriptlets:

Wenn Sie Scriptlets im c:when test, es könnte wie folgt aussehen:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)"> 
<% 
for (int i = 0; i < links.size(); i++) { 
    // added Element type in front 
    Element elem = (Element) links.get(i); 
%> 

<c:choose> 
<c:when test="<%=elem.attributeValue("name").equals("Facility Ticket")%>"> 
<optgroup label="Some String"> 
     <option>One</option> 
     <option>Two</option> 
    </optgroup>  
</c:when>  
<c:otherwise> 
    <option title='<%=elem.attributeValue("tooltip") %>' 
      value='<%= elem.attributeValue("url")%>' 
      <%= (i == 0) ? "selected" : "" %> 
    > 
     <%=elem.attributeValue("name")%> 
    </option> 
</c:otherwise> 
</c:choose>   
<% 
    } 
    %> 
</select> 

Lösung ohne Scriptlets. Nur mit JSTL und JSP-EL:

Sie mischen Scriptlets, EL und JSTL. Es könnte vereinheitlicht werden.

Die for aus dem Scriptlet, kann durch <c:forEach> ersetzt werden.
Und alle JSP-Ausdruck (<%= ... %>) könnte durch EL (Expression Language) ersetzt werden.
Aber zuerst, wo die links vorbereitet sind, setzen sie Attribut wie folgt zu verlangen:

request.setAttribute("links", links); 

Danach wird die JSP wie folgt aussehen könnte:

die Verwendung von varStatus.index zu
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)"> 
    <c:forEach var="elem" items="${links}" varStatus="varStatus"> 
     <c:choose> 
      <c:when test="${elem.attributeValue('name')=='Facility Ticket'}"> 
       <optgroup label="Some String"> 
        <option>One</option> 
        <option>Two</option> 
       </optgroup> 
      </c:when> 
      <c:otherwise> 
       <option title="${elem.attributeValue('tooltip')}" 
         value="${elem.attributeValue('url')}" 
        <c:if test="${varStatus.index == 0}"> selected</c:if> 
       > 
        ${elem.attributeValue('name')} 
       </option> 
      </c:otherwise> 
     </c:choose> 
    </c:forEach> 
</select> 

Hinweis Zugriff auf die Iterationsindex.

+0

Ich wählte # 1, da es nah an dem war, was ich bereits hatte. Das große Problem, war der String-Vergleich. Das '==' gilt für Javascript, aber nicht für Java, da die Zeichenfolge ein Objekt und kein Skalar ist. Habe dieses Problem einfach komplett übersehen. Vielen Dank – Lazloman

Verwandte Themen