2010-06-14 17 views
15

Tamam, belki de birisi çözmeye çalışıyorum sorunumda bana yardımcı olabilir. Esasen bir JSP sayfam var, bu da bir Ülke Nesneleri listesi (bir Spring Portlet SimpleFormController yönteminden, referenceData() yönteminden, tamamen alakalı değil, yalnızca söz konusu olduğunda). Her Ülke nesne il nesneleri Set vardır ve her il ve ülke bir ad alanı vardır: JSP Listesinden JavaScript Dizisini Doldurma

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

    //Getters and setters 
} 

public class Province { 
    private String name; 

    //Getters and setters 
} 

Şimdi ülke ve iller için benim JSP menüleri iki damla var ve ülkeye göre illeri filtrelemek istiyorum. JavaScript'te bir zincir seçmek için bu tutorial/guide'u takip ediyorum.

Şimdi, içeriklerimden JavaScript dizisini oluşturmanın dinamik bir yoluna ihtiyacım var. Ve herkes AJAX'dan bahsetmeden önce, bu, projemiz portletleri kullandığı ve DWR gibi bir çerçeveyi kullanmaktan veya bir sunucu uygulaması oluşturmaktan uzak durmak isteriz.

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> 

kimse Yukarıdaki durumda ya da ne 'en iyi uygulama' in JSP bir JavaScript dizisi nasıl oluşturulacağını biliyor mu: İşte JavaScript/JSP var bugüne kadar ancak bir şeyle Diziyi doldurma değil mi Bu durumda dikkate alınacak mı? Şimdiden teşekkürler!

cevap

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> 

şimdi ne diğer seçenek çıktı ben yayınlanmıştır javascript gibi görünmesi için olurdu javascript

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

böyle bir şeydir.

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

İkincisi, daha az kod üretilmesiyle sonuçlanacaktı, bu yüzden kesinlikle o rotayı kullanacağım. – Pointy

+0

Tatlı, teşekkürler! Denetleyicimin ülkeleri ele geçirmesiyle ilgili bir sorun yaşıyorum ama bu tam olarak aradığım şeydi ... tekrar teşekkürler! Herkesin merak ettiği durumda JSON üreten ikinci çözüm ile sona erdi. –

+0

Sevindim Yardımcı olabilirim. –

3

JSON numaralı telefonu kullanmayı düşündünüz mü? Genel bir koleksiyon ve JSON for Java and other languages çıktısını alabilen çeşitli kütüphaneler var.

+0

Bunun yararlı olmadığını söylediğim bir yorumu sildim - Java sınıfları uygun olduğunda gerçekten yararlı olabileceğini anlıyorum. Bir JSON dizesine dönüştürerek, daha sonra dizgiyi çıkartabilirsiniz ve tamamlanabilir. Bununla birlikte, JSON'un, tam anlamıyla bir Javascript nesnesi gösteriminin kısıtlı bir şekli olduğunu unutmayın, bu nedenle bazı veri türleri için çok iyi çalışmayabilir. ** Çalışıyorsa, çok uygun. Uygulamalarımda her zaman bir "pointy: toJSON()' EL işlevi var :-) – Pointy

1

Kodunuzdaki birincil sorun ${ } içinde "status.index" koymayı unutmuş olmasıdır. Eğer sayfanıza JavaScript kodu sürü ile bitirmek istiyorum çünkü sözü Şimdi

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

, bu şeyleri yapmaya oldukça kötü bir yol olacaktır. @John Hartsock'un cevaplarının ikincisindeki gibi Javascript nesne gösterimini kullanarak liste oluşturmak çok daha iyi.