2010-06-14 15 views
15

Ok, quindi forse qualcuno può aiutarmi con un problema che sto cercando di risolvere. Essenzialmente ho una pagina JSP che ottiene una lista di oggetti Country (dal metodo referenceData() da un SimpleFormController Spring Portlet, non del tutto pertinente, ma solo citando nel caso lo sia). Ogni oggetto Paese ha una serie di oggetti di provincia e di ogni provincia e il paese hanno un campo di nome:Compilazione di array JavaScript dall'elenco JSP

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

    //Getters and setters 
} 

public class Province { 
    private String name; 

    //Getters and setters 
} 

Ora ho due menù a scomparsa nel mio JSP per i paesi e le province e voglio filtrare le province per paese. Ho seguito questo tutorial/guide per effettuare una selezione a catena in JavaScript.

Ora ho bisogno di un modo dinamico per creare l'array JavaScript dal mio contenuto. E prima che qualcuno menzioni AJAX, questo è fuori discussione dal momento che il nostro progetto usa portlet e vorremmo stare lontano dall'usare framework come DWR o creare un servlet. Ecco il JavaScript/JSP ho finora ma non è che popolano l'Array con qualsiasi cosa:

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> 

Qualcuno sa come creare un array JavaScript in JSP nel caso di cui sopra o quello che la 'best practice' sarebbe considerato in questo caso? Grazie in anticipo!

risposta

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> 

ora quello che hai è qualcosa di simile in javascript

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

L'altra opzione sarebbe quella di rendere la vostra uscita sembrare il javascript che ho postato.

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

La seconda risulterebbe in un numero considerevolmente inferiore di codice generato, quindi avrei sicuramente seguito quella strada. – Pointy

+0

Dolce, grazie! Sto avendo un problema con il mio controller per ottenere i paesi, ma questo era esattamente quello che stavo cercando ... grazie ancora! Ho finito per andare con la seconda soluzione che produce JSON nel caso qualcuno se lo stesse chiedendo. –

+0

Contento di aver potuto aiutare. –

3

Avete considerato l'utilizzo di JSON? Ci sono diverse librerie là fuori che possono prendere una collezione generica e produrre JSON for Java and other languages.

+0

Ho eliminato un commento in cui dicevo che non era utile - mi rendo conto che potrebbe davvero * essere * utile se le classi Java qui sono appropriate. Convertendo in una stringa JSON, puoi semplicemente stampare la stringa ed essere fatto. Tuttavia, si noti che JSON è una forma limitata di notazione objecct Javascript in piena regola, quindi per alcuni tipi di dati potrebbe non funzionare così bene. ** Molto ** conveniente se funziona, comunque. Ho sempre una funzione EL 'pointy: toJSON()' nelle mie app :-) – Pointy

1

Il problema principale nel codice è che si è dimenticato di mettere "status.index" dentro ${ }.

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

Ora, detto questo, che sarebbe un bel brutto modo di fare le cose, perché ci si finisce con un sacco di codice JavaScript nella tua pagina. Molto meglio creare la lista usando la notazione di oggetti Javascript come nella seconda delle risposte di @John Hartsock.