Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象的Java请求属性_Java_Javascript_Jsp_Request - Fatal编程技术网

JavaScript对象的Java请求属性

JavaScript对象的Java请求属性,java,javascript,jsp,request,Java,Javascript,Jsp,Request,我有一个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对象不要像那样硬连接 我可以很容

我有一个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
(或其他一些对象)中,并通过
request.setAttribute(“myData”,myMap)将其添加到请求中。我只是不知道如何将
映射
(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>
本质上,它试图引用对象上的特定变量(例如,试图获取“B”的值,即2)。请注意,
code
是保存a/B/C值的函数参数

我曾经尝试过在
${mapEntry.key}
和诸如此类的东西中包含或不包含引号,但似乎没有任何效果

有人知道如何使其工作吗?

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

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

然后
myData
就是
{“A”:“1”,“B”:“2”,“C”:“3”}
我已经有一段时间没有做JSP了,但是在每次JSP
forEach
调用的迭代中,您都会覆盖
myData
变量,而不是连接到它。其次,您对“myJqueryFunction”的调用在语法上是不正确的,而不是您可能想要使用的
{values:myData}


第三,您可能不想通过JSP手动组装javascript对象,应该有合适的库来为您组装javascript对象。

一个解决方案是使用AJAX/JSON

新的控制器中(让它映射到
/MyControllerUrl
),使用
列表
,并用包含我们对象的字母和编号的对象填充它(让我们称这个新对象为
MyClass

List myList=new ArrayList();
添加(新MyClass(“A”、“1”);
添加(新的MyClass(“B”,“2”));
添加(新的MyClass(“C”,“3”));
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="]" />
<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>

{“字母”:“${listItem.letter}”,“数字”:“${listItem.number}”,
最后,在原始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="]" />
<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>

var myJsList={};
$.ajax({
url:“${pageContext.request.contextPath}/MyControllerUrl”,
数据类型:“json”,
async:false,
成功:功能(objectInfo){
$.each(objectInfo,函数(键,对象){
myJsList[object.code]=object.label;
});
}
});
注意,我使用了
.ajax
而不是
.getJSON
,这样我就可以设置
async:false
,这样变量就可以立即进行引用了


我不喜欢这个选项,因为它需要2次呼叫而不是1次。因此,我将等待并查看是否有其他建议。

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

将JSP的第一行更改为:

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

并将脚本更改为:

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

var myData='${myData}';
eval(myData);
$(“#mySelectorId”).myJqueryFunction({values:objMyData});

关于第1点,请注意,
${myData}
始终在setter值中,因此它是串联的。我做了一个
,一切都很好。关于第二点,只是一个输入错误(这不是我真正的代码)。我将修正我的问题文本。关于第3点,我们公司可能不会允许任何额外的库,除非你知道一个完善的库。这对我的情况没有帮助。至少没有进一步的解释。我们建议用一种不同的方法来构造
myData
,所以你没有同样的问题,但是如果答案像删除一些引号一样简单,那么这就太过分了。这确实在我的AJAX解决方案中发挥了作用。在
var myData='${myData}'行之后,myData包含什么
myData
是否包含字符串或对象?我对JSP不太了解,但看起来您可能在给它赋值一个字符串。它包含
{'a':'1','B':'2','C':'3'}
。通过
警报(myData)进行验证呼叫。这个问题的真正问题是JSP变量是否正确地转换为JavaScript对象。如果
警报
显示了这一点,而不是
[OBJECT OBJECT]
,则
myData
是字符串。是的。这就是问题所在。JSP需要单引号吗?如中所示,is
var myData=${myData}有效?在JavaScript中,单引号也表示字符串,因此您实际上是在引用对象。