Заполнение массива 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.