использование переменной JavaScript внутри jstl

Я хочу выполнить итерации HashMap в JavaScript с помощью jstl., действительно ли возможно сделать как это?

function checkSelection(group,tvalue){
alert(group);
alert(tvalue);

<c:forEach items="${configuredGroupMap}" var="groupMap">
    alert("aa<c:out value="${groupMap.key}"/>");
    <c:if test="${groupMap.key==group}">
        alert("t<c:out value="${groupMap.key}"/>");
        <c:if test="${groupMap.value==tvalue}">
            alert("equal");
        </c:if>
    </c:if>
</c:forEach>
}

это не входит после

 <c:if test="${groupMap.key==group}">
9
задан coder247 22 July 2010 в 09:41
поделиться

3 ответа

"to iterate a HashMap in javascript using jstl" - Not possible

JSTL выполняется на стороне сервера вашим контейнером сервлетов, для которого Javascript - это просто текст, который будет пропущен, тогда как JavaScript выполняется на стороне клиента, где JSTL неизвестен. После того, как сервер завершит обработку JSTL, сгенерированный HTML (если таковой имеется) из JSTL вместе с другими JavaScript/HTML будет отображен.

Например, если у вас есть это,

<c:forEach var="myItem" items="${myCollection}">
alert('<c:out value="${myItem.id}">')
<c:if test="${myItem.id == 0}"> 
   alert("zero"); 
</c:if>
</c:forEach>

Если идентификаторы бобов в коллекции равны 0, 1, 2, сервер отобразит следующее на стороне клиента, выполнив вышеприведенный код,

alert('0')
alert('zero')
alert('1')
alert('2')

Теперь браузер выдаст вам 4 предупреждения при загрузке страницы (что если у вас 10000 элементов, вы выдадите браузеру 10000 предупреждений). Итак, суть в том, что вы не итерировали Java-коллекцию в JavaScript, вы просто сгенерировали множество Javascript-запросов на сервере, итерируя коллекцию с помощью JSTL, и предоставили эти Javascript-запросы вместе с другим html-содержимым браузеру.

17
ответ дан 4 December 2019 в 07:46
поделиться

Это невозможно, потому что JSP сначала выполняется на стороне сервера, а затем JavaScript выполняется на стороне клиента.

Вы по-прежнему можете использовать c: forEach для циклического просмотра $ {configureGroupMap} , но вы не можете выполнять сравнение между groupMap.key и группу напрямую.

Вместо этого решение в этом случае состоит в том, чтобы сначала назначить серверную groupMap.key клиентской переменной в javascript. Затем используйте javascript для проверки if вместо c: if .

Я изменил ваш пример следующим образом:

function checkSelection(group,tvalue){ 
alert(group); 
alert(tvalue); 

<c:forEach items="${stringshm}" var="groupMap"> 
    alert("<c:out value="${groupMap.key}"/>"); 
    var groupKey = "<c:out value="${groupMap.key}"/>";

    if (groupKey == group){
        alert("<c:out value="${groupMap.key}"/>"); 

    var groupValue = "<c:out value="${groupMap.value}"/>";
        if (groupValue == tvalue){
            alert("both are equal"); 
    }
    }
</c:forEach> 
} 
6
ответ дан 4 December 2019 в 07:46
поделиться

Marimuthu прибил это. JavaScript и JSP/JSTL не работают синхронно, как можно было бы ожидать, исходя из порядка в кодировке. Сначала Java/JSP обрабатывает страницу сверху вниз, затем веб-сервер посылает результат HTML/CSS/JS веб-браузеру и, наконец, веб-браузер обрабатывает страницу (не содержащую ни одной строки Java/JSP!) сверху вниз.

Лучшее решение - позволить JSP/JSTL генерировать объектную переменную JavaScript, к которой вы можете позже обратиться в JS-коде.

var groupMap = {
    <c:forEach items="${configuredGroupMap}" var="groupMap" varStatus="loop">
        "${groupMap.key}": "${groupMap.value}"${!loop.last ? ',' : ''}
    </c:forEach>
};

На стороне клиента это будет выглядеть следующим образом (щелкните правой кнопкой мыши страницу и View Source, чтобы убедиться)

var groupMap = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
};

Наконец, перепишите checkSelection() следующим образом:

function checkSelection(group, tvalue) {
    if (groupMap[group] == tvalue) {
        alert("equal");
    }
}

Смотрите также:

5
ответ дан 4 December 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: