используя переменную javascript внутри jstl - PullRequest
9 голосов
/ 22 июля 2010

Я хочу перебрать 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}">

Ответы [ 3 ]

17 голосов
/ 22 июля 2010

"для итерации HashMap в javascript с использованием jstl" - невозможно

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 в браузер.

6 голосов
/ 22 июля 2010

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

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

Вместо этого, решение в этом случае состоит в том, чтобы сначала присвоить стороне сервера 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> 
} 
5 голосов
/ 22 июля 2010

Маримуту прибил его. 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>
};

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

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

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

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

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

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