2010-06-14 2 views
15

Хорошо, возможно, кто-то может помочь мне с проблемой, которую я пытаюсь решить. По сути, у меня есть страница JSP, которая получает список объектов Country (из метода referenceData() из Spring Portlet SimpleFormController, не совсем релевантный, но просто упоминается в случае, если это так). Каждый объект Страна имеет набор объектов провинции и в каждой провинции и страны имеют поле имя:Заполнение массива JavaScript из списка JSP

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, это не может быть и речи, поскольку наш проект использует портлеты, и мы хотели бы избегать использования фреймворков, таких как DWR или создания сервлета. Вот 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> 

Кто-нибудь знает, как создать массив JavaScript в JSP в случае выше или то, что «лучшей практики» будет рассматриваться в этом случае? Заранее спасибо!

ответ

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

+0

Сладкий, спасибо! У меня возникла проблема с тем, что мой контроллер получил страны, но это было именно то, что я искал ... еще раз спасибо! Я в конечном итоге пошел со вторым решением, которое производит JSON на случай, если кто-то задается вопросом. –

+0

Рад, что я мог помочь. –

3

Считаете ли вы использование JSON? Существует несколько библиотек, которые могут принимать общий набор и вывод JSON for Java and other languages.

+0

Я удалил комментарий, в котором сказал, что это не полезно - я понимаю, что он действительно * может быть полезным, если классы Java здесь подходят. Преобразуя в строку JSON, вы можете просто вывести строку и выполнить ее. Однако обратите внимание, что JSON является ограниченной формой полномасштабной нотации Javascript objecct, поэтому для некоторых видов данных она может работать не так хорошо. ** Очень удобно, если он действительно работает. У меня всегда есть функция pointy: toJSON() 'EL в моих приложениях :-) – Pointy

1

Основная проблема в вашем коде, что вы забыли поставить «status.index» внутри ${ }.

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

Теперь, что сказал, что это было бы очень плохой способ делать вещи, потому что вы в конечном итоге с много из Javascript кода в вашей странице. Гораздо лучше создать список, используя нотацию Javascript, как во втором из ответов @John Hartsock.

Смежные вопросы