如何将JavaScript数组传递给XPage Java控制器

时间:2016-04-01 16:52:51

标签: java xpages

我正在使用jQuery DataTables。我有它列出一个视图,并有复选框来选择多个文档。我可以通过此客户端JavaScript代码将选定的密钥放入会话范围:

<xp:this.script><![CDATA[// Build array of selected rows
var myTableApi = x$("inventoryTable").DataTable();
var count = myTableApi.rows( { selected: true } ).count();
var dataArr = [];
var rowData = myTableApi.rows( { selected: true } ).data();
    $.each($(rowData),function(key,value){
        dataArr.push(value[3]);
    });

// Push that to the requestScope
setScopeValue("session", "rowCount", count);
setScopeValue("session", "rowIds", dataArr);]]></xp:this.script>

一旦id在Scope中,我就会更改页面,然后我想将它们加载到我的Java pageController中。

我可以轻松地使用变量解析器来获取&#34; rowIds&#34;。但是我不确定如何将它变成Java,所以我可以使用它。理想情况下,我希望它是List或Set或类似的东西。

在Java中,如何将此JavaScript数组转换为基于集合的对象?

谢谢!

1 个答案:

答案 0 :(得分:5)

这里有一些技巧。

首先,由于setScopeValue函数的特定实现将所有值转换为字符串,然后再将其发送到服务器,因此执行setScopeValue("session", "rowIds", XSP.toJson(dataArr))非常重要。这样,存储在服务器上的值将为["foo", "bar", "baz"]而不是foobarbaz

其次,在Java中获取会话范围值的最佳方法是通过ExtLibUtil.getSessionScope().get("rowIds")

该值将是一个字符串,而不是数组类型,因此必须从JSON中解析它。使用IBM Commons JSON功能,可以通过以下方式完成:

List<?> rowIds = (List<?>)JsonParser.fromJson(JsonJavaFactory.instance, ExtLibUtil.getSessionScope().get("rowIds"))
for(Object rowIdObj : rowIds) {
    String rowId = StringUtil.toString(rowIdObj);
    // do stuff with each ID here
}

你也可以将它直接用于List<String>,因为Java的泛型实际上只是编译器生成的代码的提示,而不是在对象本身中真正强制执行,但是你冒风险如果传入的ClassCastException包含任何非字符串类型,则为List