2010-06-14 19 views
15

Dobrze, więc może ktoś może mi pomóc z problemem, który próbuję rozwiązać. Zasadniczo mam stronę JSP, która pobiera listę obiektów Country (z metody referenceData() z Spring Portlet SimpleFormController, niezupełnie trafny, ale tylko wspominając w przypadku, gdy jest). Każdy obiekt Kraj posiada zestaw przedmiotów prowincja i każda prowincja i kraj posiada Nazwa pola:Wypełnianie tablicy JavaScript z listy JSP

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

    //Getters and setters 
} 

public class Province { 
    private String name; 

    //Getters and setters 
} 

Teraz mam dwa menu rozwijanych w moim JSP dla krajów i województw, a chcę, aby filtrować prowincjach kraju. Śledziłem to tutorial/guide, aby wybrać łańcuch w JavaScript.

Potrzebuję teraz dynamicznego sposobu na utworzenie tablicy JavaScript z mojej zawartości. Zanim ktokolwiek wspomina o AJAX, nie wchodzi to w grę, ponieważ nasz projekt korzysta z portletów i chcielibyśmy trzymać się z daleka od używania frameworków takich jak DWR lub tworzenia serwletu. Oto JavaScript/JSP mam tak daleko, ale to nie jest wypełniania tablicy z niczego:

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> 

czy ktoś wie, jak utworzyć tablicę JavaScript w JSP w przypadku powyżej lub co do „najlepszych praktyk” byłby rozważany w tym przypadku? Z góry dziękuję!

Odpowiedz

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> 

teraz co masz jest coś takiego w JavaScript

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

Innym rozwiązaniem byłoby, aby Państwa wyjścia wyglądać javascript napisałem.

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

Druga przyczyniłaby się do generowania znacznie mniej kodu, więc zdecydowanie wybrałbym tę trasę. – Pointy

+0

Słodkie, dzięki! Mam problem z moim kontrolerem, który zdobył kraje, ale to było dokładnie to, czego szukałem ... jeszcze raz dziękuję! Skończyłem z drugim rozwiązaniem, które produkuje JSON na wypadek, gdyby ktoś się zastanawiał. –

+0

Cieszę się, że mogę pomóc. –

3

Czy rozważałeś użycie JSON? Istnieje kilka bibliotek, które mogą pobrać ogólną kolekcję i wydrukować JSON for Java and other languages.

+0

Usunąłem komentarz, w którym powiedziałem, że to było nieprzydatne - zdaję sobie sprawę, że naprawdę * może * być przydatne, jeśli klasy Java tutaj są odpowiednie. Konwertując do łańcucha JSON, można po prostu wypisać ciąg znaków i gotowe. Należy jednak zauważyć, że JSON jest zastrzeżoną formą notacji obscenicznej JavaScript, więc w przypadku niektórych rodzajów danych może nie działać tak dobrze. ** Bardzo ** wygodne, jeśli to działa. W moich aplikacjach zawsze mam funkcję 'pointy: toJSON()' EL :-) – Pointy

1

Podstawowym problemem w kodzie jest to, że zapomniał umieścić „status.index” wewnątrz ${ }.

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

Teraz, powiedział, że byłby bardzo zły sposób, aby robić rzeczy, bo chcesz skończyć z partii kodu JavaScript w swojej strony. O wiele lepiej jest stworzyć listę używając notacji obiektów JavaScript, jak w drugim z odpowiedzi @Johna Hartsocka.

Powiązane problemy