2010-06-14 123 views
15

好吧,也許有人可以幫我解決一個我正在試圖解決的問題。基本上,我有一個JSP頁面,它獲取Country對象列表(來自Spring Portlet SimpleFormController的方法referenceData(),不完全相關,但只是提及它的情況)。每個國家對象都有一組省的對象和每個省和國家有一個名稱字段:從JSP列表填充JavaScript數組

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

    //Getters and setters 
} 

public class Province { 
    private String name; 

    //Getters and setters 
} 

現在我有兩個下拉菜單在我的JSP對國家和省,我想過濾由全國各省。我一直在關注這個tutorial/guide以在JavaScript中進行鏈選擇。

現在我需要一種動態的方式從我的內容創建JavaScript數組。在任何人提到AJAX之前,這是不可能的,因爲我們的項目使用portlet,我們希望遠離使用DWR之類的框架或創建servlet。這裏是JavaScript/JSP我有這麼遠,但它不填充任何東西的數組:

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> 

有誰知道如何在上述情況下還是什麼「最佳實踐」創建JSP的JavaScript數組在這種情況下會被考慮?提前致謝!

回答

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> 

現在你有什麼是在JavaScript

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

像這樣的另一個選項是讓你的輸出看起來像我張貼的JavaScript。

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

第二個會導致生成的代碼少得多,所以我一定會走這條路。 – Pointy 2010-06-14 21:16:56

+0

甜,謝謝!我的控制器遇到了問題,但這正是我所尋找的......再次感謝!如果有人想知道,我最終會用第二種解決方案來生成JSON。 – 2010-06-14 21:32:14

+0

很高興我能幫到你。 – 2010-06-14 23:32:02

3

您是否考慮過使用JSON?有幾個圖書館可以採取通用的收集和輸出JSON for Java and other languages

+0

我刪除了一條評論,其中我說這沒什麼用處 - 我意識到如果這裏的Java類是適當的,它真的*可以*有用。通過轉換爲JSON字符串,您可以輸出字符串並完成。但是,請注意,JSON是一種全面的Javascript對象符號的限制形式,因此對於某些類型的數據,它可能無法很好地工作。 **然而,如果確實有效,非常方便。在我的應用程序中,我總是有一個'pointy:toJSON()'EL函數:-) – Pointy 2010-06-14 21:16:16

1

在你的代碼的主要問題是,你忘了把「status.index」裏面${ }

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

現在,這麼說,那將是一個非常糟糕的方式做事情,因爲你會在你的頁面的Javascript代碼一個很多結束。使用Javascript對象表示法創建列表要好得多,就像@John Hartsock的答案中的第二個一樣。