2012-03-28 4 views
7

Ich habe viele JSON-Objekte in applicationScope, sessionScope und viewScope verwendet, um verwandte Daten zu verfolgen. Schreiben und Lesen dieser in SSJS ist sehr einfach: `Wie kann ich ein JSON-Objekt zu einer Bereichsvariablen in Java hinzufügen?

//Create a app scope variable 
applicationScope.put("myvarname", {p1:"part 1", p2:"part2"}); 

// read and use the app scope variable ... 
var myvar = applicationScope.get("myvarname"); 
//Work with parts as myvar.p1, myvar.p2, etc... 

In dem Java-Code, den ich geschrieben habe, habe ich gelernt, diese Variablen zu lesen, die geschrieben wurden mit SSJS das com.ibm.jscript.std.ObjectObject Paket mit mit Code wie folgt:

ObjectObject myvar = (ObjectObject) ExtLibUtil 
     .getApplicationScope().get(dbkey); 
FBSValue localFBS = myvar.get("p1"); 
String myp1 = localFBS.stringValue(); 
localFBS = myvar.get("p2"); 
String myp2 = localFBS.stringValue(); 

Nun, natürlich möchte ich einen neuen Eintrag mit dem Java-Bean, die dann von SSJS und anderen Java-Beans in der gleichen Weise gelesen werden können, schreiben. Ich habe es geschafft, mit einer Map und einer Hashtable in den Bereich zu schreiben, aber diese stürzen die Logik ab, wenn ich versuche, mit dem ObjectObject zu lesen.

Also, wie würde ich zum Erstellen eines neuen Eintrags im Bereich mithilfe der ObjectObject und/oder FBSValue-Pakete gehen? Ich kann nicht finden, wie man einen neuen FBSValue erstellt, der dann einem ObjectObject hinzugefügt werden kann. Ich bin mir sicher, dass es eine einfache Sache ist, die ein Newbs wie ich verpasst hat.

/Newbs

Antwort

6

Sie können ein leeres ObjectObject konstruieren, füllen Sie es mit FBSValues, und es nur direkt in den Anwendungsbereich Karte setzen:

ObjectObject myvar = new ObjectObject(); 
try { 
    myvar.put("p1", FBSUtility.wrap("part 1")); 
    myvar.put("p2", FBSUtility.wrap("part 2")); 
} catch (InterpretException e) { 
    e.printStackTrace(); 
} 
Map<String, Object> applicationScope = ExtLibUtil.getApplicationScope(); 
applicationScope.put("myvarname", myvar); 

Wenn es später Abrufen (wie in den Beispielen Ihnen zur Verfügung gestellten), SSJS wird es als JSON sehen, Java wird es genau so sehen, wie es gespeichert wurde.

Wenn Sie tiefere Hierarchien speichern müssen, können Sie Instanzen von ArrayObject und ObjectObject in ein ObjectObject zusätzlich zu Primitiven einfügen. Sie können diese also genau wie JSON selbst so tief verschachteln, wie Sie benötigen.

Achten Sie darauf, nur echte JSON (Strings, Zahlen, Booleans, Arrays, Objekte) einzuschließen, wenn Sie sie irgendwo höher als das requestScope speichern; insbesondere implementiert FunctionObject nicht Serializable, so JSON ist sicher zu speichern, JavaScript ist nicht. Streng genommen wird dies nur toxisch, wenn es in 8.5.2 und 8.5.3 im viewScope gespeichert wird (und auch dann, wenn die Persistenzoption der Anwendung nicht so eingestellt ist, dass alle Seiten im Speicher bleiben). Wenn IBM jedoch Clusterunterstützung implementiert, müssen alle Objekte, die in sessionScope und applicationScope gespeichert sind, serialisiert werden können, um den Transport zwischen Servern zu ermöglichen. Aus Gründen der Zukunftssicherheit des Entwurfs ist es daher ratsam, daran festzuhalten Prinzip für alles gespeichert länger als die Dauer einer einzelnen Anfrage.

+0

Danke Tim, ich wusste, du hattest die Antwort. Dieses FBS-Zeug scheint eine Menge Nutzen zu haben. Wofür steht "FBS" und wo könnte es dokumentiert werden? – Newbs

+1

FBS steht für "framebuilder script"; Bevor es Teil von XPages war (und noch bevor XPages XFaces genannt wurde), war die SSJS-Engine Teil von FrameBuilder, den IBM für den Einsatz in Workplace erworben hatte. Als Workplace fehlschlug, versuchten sie herauszufinden, was für eine anderweitige Verwendung gerettet werden könnte. XFaces hatten offensichtlich einen gewissen Wert, also versuchten sie es zu Domino hinzuzufügen ... und hier sind wir. Es überrascht daher nicht, dass FBSValue und seine Nachkommen in der Komponente Javadoc nicht enthalten sind: http://public.dhe.ibm.com/software/dw/lotus/Domino-Designer/JavaDocs/XPagesExtAPI/8.5.2/index.html –

Verwandte Themen