web-dev-qa-db-ja.com

jstl内でjavascript変数を使用する

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}">
9
coder247

「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コンテンツ。

17

JSPが最初にサーバー側で実行され、次にJavaScriptがクライアント側で実行されるため、これは不可能です。

c:forEachを使用して${configuredGroupMap}をループすることはできますが、groupMap.keygroupを直接比較することはできません。

代わりに、この場合の解決策は、最初にサーバー側の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> 
} 
6
JoseK

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");
    }
}
_

参照:

5
BalusC