在jstl中使用javascript变量

在jstl中使用javascript变量,java,javascript,jsp,jstl,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="${grou

我想使用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>
}
功能检查选择(组,tvalue){
警戒组;
警报(tvalue);
警报(“aa”);
警报(“t”);
警惕(“相等”);
}
之后就不会进去了

 <c:if test="${groupMap.key==group}">

“使用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>

现在,浏览器将在加载页面时向您发出4个警报(如果您有10000个项目,您将向浏览器呈现10000条警报语句)。关键是,您没有在JavaScript中迭代Java集合,您只是在服务器中生成了一系列JavaScript语句,使用JSTL迭代集合,并将这些JavaScript语句与其他html内容一起提供给浏览器。

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

您仍然可以使用
c:forEach
${configuredGroupMap}
中循环,但不能直接跨
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> 
} 
功能检查选择(组,tvalue){
警戒组;
警报(tvalue);
警报(“”);
var groupKey=“”;
if(groupKey==组){
警报(“”);
var-groupValue=“”;
if(groupValue==tvalue){
警惕(“两者相等”);
}
}
} 

马里穆图已经确定了。JavaScript和JSP/JSTL并不像您从编码顺序中期望的那样同步运行。Java/JSP首先从上到下处理页面,然后Web服务器将HTML/CSS/JS结果发送给webbrowser,最后webbrowser从上到下处理页面(不包含任何Java/JSP行!)

最好的解决方案是让JSP/JSTL生成一个JavaScript对象变量,您可以稍后在JS代码中访问该变量

var groupMap = {
    <c:forEach items="${configuredGroupMap}" var="groupMap" varStatus="loop">
        "${groupMap.key}": "${groupMap.value}"${!loop.last ? ',' : ''}
    </c:forEach>
};
最后重写
checkSelection()
,如下所示:

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

这不起作用,因为您正在比较JSTL(服务器端)属性groupMap.key和Javascript(客户端)值组。我最近给一位新同事开了一个网络编程速成班。对他来说,最难掌握的部分可能是编译时、servlet中(包括JSTL解释)和浏览器中JavaScript中的交互。他的第一个项目需要同时完成所有3个项目,因此学习曲线陡峭。制作图表来了解所有东西是如何组合在一起的是值得的。但这并不能像预期的那样起作用。这将在函数内部为2个元素呈现:alert('key1')var groupKey='key1'if(groupKey==group){alert('key1')var groupValue=“value1”if(groupValue==tvalue){alert(“两者相等”)}}alert('key2')var groupKey='key2'if(groupKey==group){alert(“key2”)var groupValue=“value2”if(groupValue==tvalue){alert)(“两者相等”)}}许多变量声明使用相同的名称,许多JavaScript代码使用冗余的“if”表示客户端
var groupMap = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
};
function checkSelection(group, tvalue) {
    if (groupMap[group] == tvalue) {
        alert("equal");
    }
}