在jstl中使用javascript变量

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

function checkSelection(group,tvalue){ alert(group); alert(tvalue);  alert("aa");  alert("t");  alert("equal");    } 

它不会进入内部

   

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

JSTL在服务器端由您的servlet容器执行,其中Javascript只是一个可以跳过的文本,而JavaScript则在JSTL未知的客户端执行。 在服务器完成处理JSTL之后,将呈现来自JSTL的生成的HTML(如果有的话)以及其他JavaScript / HTML。

例如,如果你有这个,

  alert('')  alert("zero");   

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

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

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

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

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

相反,在这种情况下,解决方案是首先将服务器端groupMap.key分配给javascript中的客户端变量。 然后使用javascript进行if检查,而不是c:if

我已将您的示例修改为以下内容

 function checkSelection(group,tvalue){ alert(group); alert(tvalue);  alert(""); var groupKey = ""; if (groupKey == group){ alert(""); var groupValue = ""; if (groupValue == tvalue){ alert("both are equal"); } }  } 

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

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

 var groupMap = {  "${groupMap.key}": "${groupMap.value}"${!loop.last ? ',' : ''}  }; 

这将最终像客户端中的以下内容(右键单击页面和查看源 ,以确保)

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

最后重写checkSelection()如下:

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

也可以看看:

  • Java / JSP / JSF和JavaScript之间的通信
  • 基本的JavaScript教程
  • JSON(JavaScript Object Notation)教程