2016-04-01 7 views
4

Ich arbeite mit jQuery DataTables. Ich habe es eine Liste auflisten und Kontrollkästchen, um mehrere Dokumente auszuwählen. Ich bin in der Lage die ausgewählten Schlüssel in Sitzungsbereich über diesen Client-Seite JavaScript-Code zu erhalten:So übergeben Sie ein JavaScript-Array an einen XPages Java Controller

<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> 

Sobald die ids in Scope I Seiten ändern und dann möchte ich sie in meine Java Pagecontroller laden.

Ich kann einen variablen Resolver einfach verwenden, um "rowIds" zu erhalten. Aber ich bin mir nicht sicher, wie ich es in Java bekomme, damit ich damit arbeiten kann. Idealerweise hätte ich gerne List oder Set oder etwas Ähnliches.

In Java, wie kann ich dieses JavaScript-Array in ein Collection-basiertes Objekt konvertieren?

Danke!

+0

Es sollte beachtet werden, dass, um das Ganze abzuziehen, ich einige Codestücke von diesem Beitrag verwende: http://oliverbusse.notesx.net/hp.nsf/blogpost.xsp?documentId=BB6 –

Antwort

4

Hier gibt es ein paar Tricks.

Erstens, da die spezielle Implementierung Ihrer setScopeValue-Funktion alle Werte in eine Zeichenfolge konvertiert, bevor Sie sie an den Server senden, ist es wichtig, setScopeValue("session", "rowIds", XSP.toJson(dataArr)) zu tun. Auf diese Weise wird der auf dem Server gespeicherte Wert ["foo", "bar", "baz"] anstelle von foobarbaz sein.

Zweitens wäre der beste Weg, um den Session-Scoped-Wert in Java über ExtLibUtil.getSessionScope().get("rowIds") zu bekommen.

Dieser Wert ist jedoch eine Zeichenkette und kein Array-Typ, daher muss er von JSON aus analysiert werden. Mit Hilfe der IBM Commons JSON-Funktionen, das kann gemacht werden:

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 
} 

Sie können auch potenziell case direkt an einen List<String>, da Java Generika sind wirklich Hinweise nur für Compiler generierten Code, und nicht wirklich in die erzwungene Objekte selbst, aber dort laufen Sie das Risiko einer ClassCastException, wenn der eingehende List keine Nicht-String-Typen enthält.