在jstl中使用javascript变量

时间:2010-07-22 09:33:33

标签: java javascript jsp jstl

我想使用jstl在javascript中迭代HashMap。可以这样做吗?

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 个答案:

答案 0 :(得分:17)

“使用jstl在javascript中迭代HashMap” - 不可能

JSTL在服务器端由您的servlet容器执行,其中Javascript只是一个将被跳过的文本,而JavaScript则在JSTL未知的客户端执行。服务器完成JSTL处理后,将呈现JSTL生成的HTML(如果有)以及其他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>

如果集合中的bean的id为0,1,2,则服务器通过执行上述代码向客户端呈现以下内容,

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

现在,浏览器会在加载页面时给出4个警报(如果您有10000个项目,则会向浏览器呈现10000个警报语句)。所以重点是你没有在JavaScript中迭代Java集合,你只是在使用JSTL迭代集合的服务器中生成了大量的Javascript语句,并且你已经将这些Javascript语句与其他html内容一起提供给浏览器。

答案 1 :(得分:6)

这是不可能的,因为JSP首先在服务器端执行,然后JavaScript在客户端执行。

您仍然可以使用c:forEach循环浏览${configuredGroupMap},但不能直接在groupMap.keygroup之间进行比较。

相反,在这种情况下,解决方案是首先在javascript中将服务器端groupMap.key分配给客户端变量。然后使用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> 
} 

答案 2 :(得分:5)

Marimuthu已经把它钉死了。 JavaScript和JSP / JSTL不会像编码中的顺序那样同步运行。 Java / JSP首先从上到下处理页面,然后Web服务器将HTML / CSS / JS结果发送到webbrowser,最后webbrowser从上到下处理页面(不包含任何Java / JSP!)。 / p>

最好的解决方案是让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");
    }
}

另见: