JavaScript对象的Java请求属性
我有一个jQuery库,希望您将JavaScript对象作为选项传递给它。例如,这项工作: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对象不要像那样硬连接 我可以很容
//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了,但是在每次JSPforEach
调用的迭代中,您都会覆盖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需要单引号吗?如中所示,isvar myData=${myData}代码>有效?在JavaScript中,单引号也表示字符串,因此您实际上是在引用对象。