PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wichtige Frage zu RemoteObjects


dasnervtdoch
11.01.2009, 20:46
Hallo Leute,

ich bin gerade mal wieder am Basteln und mir stellt sich eine wichtige Frage:

Wenn ich also ein RemoteObject habe, dann wird genau ein Object dieser Klasse (Java) erzeugt, richtig?

Also ich versuche die Verzeichnisstruktur (Files & Ordner) ab einem beliebigen Rootverzeichnis in meiner Flexapplication abzubilden.

Dafür hab ich einigen Java-Code, der die Hierarchy einliest und solche Späße. Jetzt hab ich eine Klasse geschrieben, die als Schnittstelle zwischen meiner (Java) Hierarchy und Flex via RemoteObject dienen soll:

public class FileAgent {

FileHierarchy hierarchy;
Iterator childIter;
Tree.Node actual;

public FileAgent() {

}

public ArrayList<Descriptor> buildHierarchy(String userRootFolder) {

hierarchy = new FileHierarchy(userRootFolder);
actual = hierarchy.getRoot();
setChildIter();

return getContent();
}

public ArrayList<Descriptor> folderUp() {

if(actual.hasParent()) {

actual = actual.getParent();
setChildIter();
}

return getContent();
}

public ArrayList<Descriptor> folderDown(String name) {

boolean found = false;

while(childIter.hasNext() && !found) {

Tree.Node node = (Tree.Node) childIter.next();
Descriptor desc = (Descriptor) node.getElement();

if(desc.name.equals(name)) {

actual = node;
found = true;
setChildIter();
}
}

return getContent();
}

private ArrayList<Descriptor> getContent() {

return hierarchy.getFolderContent(actual);
}

private void setChildIter() {

childIter = hierarchy.treeIter(actual);
}
}

Das RO:

<mx:RemoteObject id="hierarchyRO"
destination="HierarchyRemoteAccess">
<mx:method name="buildHierarchy"
result="handler(event)">
</mx:method>
<mx:method name="folderDown"
result="handler(event)">
</mx:method>
<mx:method name="folderUp"
result="handler(event)"/>
</mx:RemoteObject>


Das Problem ist jetzt: In einer Funktion auf die nach "creationComplete" aufgerufen wird, rufe ich also "hierarchyRO.buildHierarchy(Folder:String)" auf.
Das funktioniert ja noch, wenn ich dann aber eine der anderen Funktionen "folderUp, folderDown" aufrufe, bekomme ich eine Java:NullPointerException.

Ich schlussfolgere also, dass es sich um eine andere Instanz des RO handelt und damit um eine weitere Instanz von "FileAgent", die natürlich nicht mehr weiss, worum es geht.

Kann jemand folgen? Wie ist also die Antwort auf meine Ausgangsfrage?

Danke,
dasnervtdoch!

bort
12.01.2009, 07:54
Benutzt Du BlazeDS bzw. LCDS? Wenn ja, dann kannst Du über den <scope/> Parameter in der <destination/> einstellen, wie die Java Klasse instantiiert werden soll. Standardmäßig ist das "request", d.h. die Klasse wird bei jedem Aufruf neu erstellt (das "Problem" hast Du ja gerade)

Du kannst für scope auch "session" bzw. "application" stellen. Ich würde empfehlen, hier "session" zu nehmen. Siehe auch hier: http://livedocs.adobe.com/blazeds/1/blazeds_devguide/help.html?content=rpc_remoteobject_3.html

Die Alternative wäre, hierarchy nicht als private Member anzulegen, sondern in der aktuellen Session abzulegen. Andernfalls gibt es später Probleme, wenn mehr als ein Benutzer auf die Anwendung zugreift, denn dann hätte ja hierarchy für alle dasselbe.

Die Session kannst Du Dir über FlexContext.getFlexSession() holen. Bei einem RemoteObject Aufruf ist dies dann die eigentliche HTTPSession.

Gruß,
Dirk.

dasnervtdoch
12.01.2009, 11:04
Hallo Dirk,

danke erstmal für deine Antwort; ich werde gleich mal ausprobieren, den Scope auf Seesion zu setzten. Und ja ich benutzte den BlazeDS!

Leider bin ich auch noch recht neu auf dem Gebiet und hack mich hier so durch: Könntest du vllt. deinen alternativen Ansatz mit "hierarchy in session" ablegen noch mal erklären? Bitte ...

Danke,
dasnervtdoch

dasnervtdoch
12.01.2009, 11:13
Hey Dirk ...

scope auf Session setzten hat schon mal geholfen, ich kann jetzt in meiner Hierarchy hoch und runter ... prima Sache!

Aber ich hab auch gelesen, wenn ich jetzt in einem Browserfenster zwei Tabs habe und in beiden läuft meine Application ... dann hab ich ein Problem. ;) Hab´s auch ausprobiert; Stimmt!

Also was nun?

bort
12.01.2009, 11:45
na ja, zwei Tabs in einem Browser verwenden natürlich denselben Session Cookie, daher haben sie dieselbe Session. Daran kann man m.M. wenig ändern - evtl. hängt es vom verwendeten Browser ab, aber ich meine alle aktuellen Browser verhalten sich so.

Gruß,
Dirk.

dasnervtdoch
12.01.2009, 21:00
Die Alternative wäre, hierarchy nicht als private Member anzulegen, sondern in der aktuellen Session abzulegen. Andernfalls gibt es später Probleme, wenn mehr als ein Benutzer auf die Anwendung zugreift, denn dann hätte ja hierarchy für alle dasselbe.

Die Session kannst Du Dir über FlexContext.getFlexSession() holen. Bei einem RemoteObject Aufruf ist dies dann die eigentliche HTTPSession.

Gruß,
Dirk.

Aber was meintest du denn damit?