【问题标题】:Java Request Attributes to JavaScript ObjectsJavaScript 对象的 Java 请求属性
【发布时间】:2012-11-07 15:36:06
【问题描述】:

我有一个 jQuery 库,希望您将 JavaScript 对象作为选项传递给它。例如,这有效:

//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(或其他对象)中,然后通过 @987654324 将其添加到请求中@。我只是不确定如何将 Map (等)转换为所需的 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} 周围加上或不包含引号之类的东西,但似乎没有任何效果。

有谁知道如何让它工作?

【问题讨论】:

  • var myData = '${myData}'; 行后面的 myData 包含什么? myData 是否包含字符串或对象?我对 JSP 了解不多,但看起来您可能正在为其分配一个字符串。
  • 它包含{'A' : '1', 'B' : '2', 'C' : '3'}。通过alert(myData); 电话验证。这个问题的真正问题是 JSP 变量是否被正确转换为 JavaScript OBJECT。
  • 如果alert 显示了这一点而不是[object Object],那么myData 是一个字符串
  • 是的。因此问题。如何做到这一点。
  • JSP 是否需要单引号?如,var myData = ${myData}; 有效吗?在 JavaScript 中,单引号也表示字符串,因此您实际上是在引用您的对象。

标签: java javascript jsp request


【解决方案1】:

要在 JavaScript 中添加更多属性(包括按变量),可以使用此语法

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

那么myData 就是{ "A" : "1", "B" : "2", "C" : "3" }

【讨论】:

  • 这对我的情况并没有真正的帮助。至少没有进一步的解释。
  • 建议用不同的方法来构造myData,所以你没有同样的问题,但如果答案就像删除一些引号一样简单,那么这就是矫枉过正。
  • 这确实在我的 AJAX 解决方案中发挥了作用。泰。
【解决方案2】:

自从我完成 JSP 以来已经有一段时间了,但是您在 JSP forEach 调用的每次迭代中都覆盖了您的 myData var,而不是连接到它。其次,您对“myJqueryFunction”的调用在语法上不正确,而不是values: myData,您可能想使用{values: myData}

第三,您可能不想通过 JSP 手动组装 javascript 对象,应该有不错的库可以为您完成。

【讨论】:

  • 在第 1 点上,请注意 ${myData} 始终在 setter 值中,因此它是连接的。我已经完成了&lt;c:out&gt;,一切都很好。在第 2 点,只是一个错字(这不是我的真实代码)。我将修复我的问题文本。关于第 3 点,我们公司可能不会允许任何额外的库,除非您知道一个完善的库。
【解决方案3】:

一种解决方案是使用 AJAX/JSON。

NEW 控制器中(让它映射到 /MyControllerUrl),使用 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 而不是.getJSON,这样我就可以设置async: false,以便立即准备好变量以供参考。

我不喜欢这个选项,因为它需要 2 次调用而不是 1 次。所以我会等待,看看是否有其他建议。

【讨论】:

    【解决方案4】:

    如果您将 myData 作为字符串获取,并且您无法删除 '${myData}' 周围的引号(这似乎很奇怪,您不能这样做,顺便说一句),那么试试这个:

    将 JSP 的第一行更改为:

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

    并将您的脚本更改为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2015-08-17
      • 2023-03-26
      • 2012-08-22
      • 2018-06-20
      • 2020-04-08
      • 1970-01-01
      相关资源
      最近更新 更多