Заполнение массива JavaScript из списка JSP

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

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

    //Getters and setters
}

public class Province {
    private String name;

    //Getters and setters
}

Теперь у меня есть два выпадающих меню в моем JSP для стран и провинций, и я хочу отфильтровать провинции по странам. Я выполнял этот учебник/руководство, чтобы сделать выбор цепочки в 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 в вышеприведенном случае или что "лучшая практика" будет рассмотрена в этом случае? Спасибо заранее!

Ответы

Ответ 1

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

Считаете ли вы использование JSON? Существует несколько библиотек, которые могут брать общую коллекцию и выводить JSON для Java и других языков.

Ответ 3

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

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

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