Заполнение массива JavaScript из списка JSP - PullRequest
15 голосов
/ 15 июня 2010

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

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 в приведенном выше случае или что лучше?практика »будет рассматриваться в этом случае?Заранее спасибо!

Ответы [ 3 ]

24 голосов
/ 15 июня 2010
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>  
];
3 голосов
/ 15 июня 2010

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

1 голос
/ 15 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...