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}">
「jstlを使用してjavascriptでHashMapを反復する」-不可能
JSTLは、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コンテンツ。
JSPが最初にサーバー側で実行され、次にJavaScriptがクライアント側で実行されるため、これは不可能です。
c:forEach
を使用して${configuredGroupMap}
をループすることはできますが、groupMap.key
とgroup
を直接比較することはできません。
代わりに、この場合の解決策は、最初にサーバー側のgroupMap.key
をjavascriptのクライアント側の変数に割り当てることです。次に、c:if
の代わりに、ifチェックにjavascriptを使用します。
私はあなたの例を以下に変更しました
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>
}
Marimuthuはそれを釘付けにしました。 JavaScriptとJSP/JSPLは、コーディングの順序から予想されるように同期して実行されません。 Java/JSPは最初にページを上から下に処理し、次にWebサーバーがHTML/CSS/JSの結果をWebブラウザーに送信し、最後にWebブラウザーがページ(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");
}
}
_