2010-06-14 121 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的答案中的第二个一样。