cod*_*247 9 javascript java 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>
}
Run Code Online (Sandbox Code Playgroud)
它不会进入内部
<c:if test="${groupMap.key==group}">
Run Code Online (Sandbox Code Playgroud)
Mar*_*amy 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>
Run Code Online (Sandbox Code Playgroud)
如果集合中的bean的id为0,1,2,则服务器通过执行上述代码将以下内容呈现给客户端,
alert('0')
alert('zero')
alert('1')
alert('2')
Run Code Online (Sandbox Code Playgroud)
现在,浏览器将在加载页面时给出4个警报(如果您有10000个项目,则会向浏览器呈现10000个警报语句).所以重点是你没有在JavaScript中迭代Java集合,你只是在使用JSTL迭代集合的服务器中生成了大量的Javascript语句,并且你已经将这些Javascript语句与其他html内容一起提供给浏览器.
这是不可能的,因为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>
}
Run Code Online (Sandbox Code Playgroud)
Marimuthu已经把它钉死了.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>
};
Run Code Online (Sandbox Code Playgroud)
这将最终像客户端中的以下内容(右键单击页面和查看源,以确保)
var groupMap = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
};
Run Code Online (Sandbox Code Playgroud)
最后改写checkSelection()
如下:
function checkSelection(group, tvalue) {
if (groupMap[group] == tvalue) {
alert("equal");
}
}
Run Code Online (Sandbox Code Playgroud)