0

オプションとしてJavaScriptオブジェクトを渡してほしいjQueryライブラリがあります。たとえば、これは機能します。

//Hardcoded JavaScript object
var myData = { "A" : "1", "B" : "2", "C" : "3" };

//Call to jQuery with object as an option
$("#mySelectorId").myJqueryFunction({values: myData});

myDataオブジェクトがそのように配線されていない必要があります。

Javaコードで「Aから1、Bから2、Cから3」の構造を簡単に取得し、それをMap(または他のオブジェクト)に入れて、を介してリクエストに追加できrequest.setAttribute("myData", myMap);ます。Map(etc)を必要なJavaScriptオブジェクトに変換する方法がわかりません。これが私が試したことです。

//Java
Map<String, String> myMap = new TreeMap<String, String>();
map.put("A", "1");
map.put("B", "2");
map.put("C", "3");
request.setAttribute("myMap", myMap);

//JSP
<c:set var="myData" value="{" />
<c:forEach var="mapEntry" items="${myMap}" varStatus="counter">
    <c:set var="myData" value="${myData}'${mapEntry.key}' : '${mapEntry.value}'" />
    <c:if test="${counter.count < fn:length(myMap)}">
        <c:set var="myData" value="${myData}, " />
    </c:if>
</c:forEach>
<c:set var="myData" value="${myData}}" />

<script>
    var myData = '${myData}';
    $("#mySelectorId").myJqueryFunction({values: myData});
</script>

これはmyJqueryFunction、次のようなことを実行しようとするポイントに到達するまで機能します。

var i = values[code];

基本的に、オブジェクト上の特定の変数を参照しようとしています(たとえば、「B」の値(2)を取得しようとしています)。codeこれは、A / B/C値を保持する関数パラメーターであることに注意してください。

引用符を含めるか含めないかなどをいじってみまし${mapEntry.key}たが、何も機能しないようです。

誰かがこれを機能させる方法を知っていますか?

4

4 に答える 4

0

myDataを文字列として取得していて、引用符を削除'${myData}'できない場合(ところで、削除できなかったのは奇妙に思えます)、次のことを試してください。

JSPの最初の行を次のように変更します。

<c:set var="myData" value="var objMyData = {" />

スクリプトを次のように変更します。

<script>
    var myData = '${myData}';
    eval(myData);
    $("#mySelectorId").myJqueryFunction({values: objMyData});
</script>
于 2012-11-07T22:21:44.293 に答える
0

1 つの解決策は、AJAX/JSON を使用することです。

NEWコントローラー ( にマップさせます)/MyControllerUrlで、 a を使用し、Listオブジェクトの文字と数の両方を持つオブジェクトで埋めます (この新しいオブジェクトを呼び出しますMyClass)。

List<MyClass> myList = new ArrayList<MyClass>();
myList.add(new MyClass("A", "1"));
myList.add(new MyClass("B", "2"));
myList.add(new MyClass("C", "3"));
request.setAttribute("myList", myList);

上記が新しいコントローラーのすべてです。そして、返された JSP には次のものしかありません。

<c:out value="[" />

<c:forEach var="listItem" items="${myList}" varStatus="counter">
    {"letter": "${listItem.letter}", "number": "${listItem.number}"}<c:if test="${counter.count < fn:length(myList)}">,</c:if>
</c:forEach>

<c:out value="]" />

最後に、元の JSP に次のように記述します。

<script>
    var myJsList= { };
    $.ajax({
        url: '${pageContext.request.contextPath}/MyControllerUrl',
        dataType: 'json',
        async: false,
        success: function(objectInfo) {
            $.each(objectInfo, function(key, object) {
                myJsList[object.code] = object.label;
            });
        }
    });
</script>

変数をすぐに参照できるように設定できるように、.ajax代わりに使用したことに注意してください。.getJSONasync: false

1回ではなく2回の呼び出しが必要なので、このオプションは好きではありません。

于 2012-11-07T20:06:42.737 に答える
0

JavaScript でさらにプロパティ (変数によるものを含む) を追加するには、次の構文を使用できます。

var myData = {}; // Initial object
myData["A"] = "1";
myData["B"] = "2";
myData["C"] = "3";

それからmyDataです{ "A" : "1", "B" : "2", "C" : "3" }

于 2012-11-07T15:39:22.217 に答える
0

JSP を使用してからしばらく経ちましたがmyData、JSP 呼び出しの反復ごとに varforEachを連結するのではなくオーバーライドしています。第二に、「myJqueryFunction」への呼び出しは、values: myDataおそらく使用したいのではなく、構文的に正しくありません{values: myData}

第三に、おそらく JSP を介して JavaScript オブジェクトを手動でアセンブルしたくないでしょう。それを実行してくれる適切なライブラリが世の中にあるはずです。

于 2012-11-07T15:40:21.947 に答える