2010-06-14 11 views
15

Ok, vielleicht kann mir jemand mit einem Problem helfen, das ich versuche zu lösen. Im Wesentlichen habe ich eine JSP-Seite, die eine Liste von Country-Objekten (von der Methode ReferenceData() aus einem Spring Portlet SimpleFormController, nicht ganz relevant aber nur erwähnen, falls es ist). Jedes Land Objekt verfügt über eine Reihe von Provinz-Objekten und jede Provinz und Land haben ein Namensfeld:Popup-JavaScript-Array von JSP-Liste

public class Country { 
    private String name; 
    private Set<Province> provinces; 

    //Getters and setters 
} 

public class Province { 
    private String name; 

    //Getters and setters 
} 

Jetzt habe ich zwei Drop-Down-Menüs in meinem JSP für Länder und Provinzen, und ich will die Provinzen nach Land filtern. Ich habe diese tutorial/guide verfolgt, um eine Kettenauswahl in JavaScript zu machen.

Jetzt brauche ich eine dynamische Möglichkeit, das JavaScript-Array aus meinem Inhalt zu erstellen. Und bevor jemand AJAX erwähnt, kommt dies nicht in Frage, da unser Projekt Portlets verwendet und wir uns davon abhalten wollen, Frameworks wie DWR zu verwenden oder ein Servlet zu erstellen. Hier ist die JavaScript/JSP Ich habe so weit, aber es ist nicht das Array mit etwas bevölkern:

var countries = new Array(); 
<c:forEach items="${countryList}" var="country" varStatus="status"> 
    countries[status.index] = new Array(); 
    countries[status.index]['country'] = ${country.name}; 
    countries[status.index]['provinces'] = 
    [ 
     <c:forEach items="${country.provinces}" var="province" varStatus="provinceStatus"> 
      '${province.name}' 
      <c:if test="${!provinceStatus.last}"> 
       , 
      </c:if> 
     </c:forEach> 
    ]; 
</c:forEach> 

Wer weiß, wie ein JavaScript-Array in JSP in dem Fall erstellen oben oder was die ‚best-practice‘ würde in diesem Fall berücksichtigt werden? Danke im Voraus!

Antwort

22
var countries = new Array(); 
<c:forEach items="${countryList}" var="country" varStatus="status"> 
    countryDetails = new Object(); 
    countryDetails.country = ${country.name}; 
    var provinces = new Array(); 

     <c:forEach items="${country.provinces}" var="province" varStatus="provinceStatus"> 
      provinces.push(${province.name}); 
     </c:forEach> 
    countryDetails.provinces = provinces; 
    countries.push(countryDetails); 
</c:forEach> 

jetzt, was Sie haben, ist so etwas wie dies in Javascript

var countries = [ 
    {country:"USA", 
    provinces: [ 
    "Ohio", 
    "New York", 
    "California" 
    ]}, 
    {country:"Canada", 
    provinces: [ 
    "Ontario", 
    "Northern Territory", 
    "Sascetchewan" 
    ]}, 
] 

Die andere Option die Ausgabe aussehen wie das Javascript würde ich gepostet zu machen.

var countries = [ 
<c:forEach items="${countryList}" var="country" varStatus="status"> 
    {country: '${country.name}', 
    provinces : [ 
     <c:forEach items="${country.provinces}" var="province" varStatus="provinceStatus"> 
      '${province.name}' 
      <c:if test="${!provinceStatus.last}">  
      ,  
      </c:if> 
     </c:forEach> 
    ]} 
    <c:if test="${!status.last}">  
     ,  
    </c:if> 
    </c:forEach> 
]; 
+2

Die zweite würde dazu führen, dass wesentlich weniger Code generiert würde, also würde ich definitiv diesen Weg gehen. – Pointy

+0

Süß, danke! Ich habe ein Problem damit, dass mein Controller die Länder bekommt, aber das war genau das, wonach ich gesucht habe ... nochmals vielen Dank! Am Ende ging ich mit der zweiten Lösung, die JSON produziert, falls sich jemand fragen würde. –

+0

Ich bin froh, dass ich helfen konnte. –

3

Haben Sie in Betracht gezogen, JSON zu verwenden? Es gibt mehrere Bibliotheken, die eine generische Sammlung aufnehmen und JSON for Java and other languages ausgeben können.

+0

Ich löschte einen Kommentar, in dem ich sagte, dass dies nicht sinnvoll war - ich realisiere, dass es wirklich * nützlich * sein könnte, wenn die Java-Klassen hier angemessen sind. Wenn Sie in eine JSON-Zeichenfolge konvertieren, können Sie die Zeichenfolge einfach ausgeben und fertig sein. Beachten Sie jedoch, dass JSON eine eingeschränkte Form der vollständigen Javascript-Objektnotation ist, sodass es für einige Arten von Daten nicht so gut funktioniert. ** Sehr ** praktisch, wenn es aber funktioniert. Ich habe immer eine 'pointy: toJSON()' EL-Funktion in meinen Apps :-) – Pointy

1

Das primäre Problem in Ihrem Code ist, dass Sie "status.index" innerhalb ${ } zu setzen vergessen. Jetzt

countries[${status.index}] = new Array(); 

, was gesagt, das wäre eine ziemlich schlechte Art und Weise, Dinge zu tun, weil Sie mit einem viel von Javascript-Code in Ihre Seite landen würde. Viel besser, um die Liste mit Javascript-Objekt-Notation wie in der zweiten @ John Hartsock Antworten zu erstellen.