StringTokenizer gilt als sehr schlecht wg. Performance, weshalb dieser Mechanismus nach meinen Infos heute nur noch sehr selten eingesetzt wird. Ich schlag das mal genauer am WE nach und poste Ersatzcode.
ERst dachte ich, du könntest einfach die DocUnique ID übergeben, aber das Problem ist glaub ich, dass dieses Dokument noch gar nicht auf dem Server gespeichert ist. Zumindest nicht mit aktuellen User-Eingaben.
Weitere Form erzeugen geht glaub ich in dem Szenario irgendwie nicht.
Einfach aus dem Grund, dass es eben eine starke Abhängigkeit von DocumentContext im Agenten auf ein echtes Domino Dokument gibt. Zumindest ist mir da nix bekannt wie dies gehen könnte.
Du kannst im Java Agenten näherungsweise die Zeit stoppen mit der statischen Methode
private long letzteZeit;
private long stoppeZeit (String identifier) {
long jetztZeit = System.currentTimeMilis();
if (letzteZeit != 0) {
System.out.println( identifier + (jetztZeit - letzteZeit) )
}
letzteZeit = jetztZeit;
}
... oder mit Log4J, was ich aber auch noch nie mit einem Domino Agenten gemacht habe.
Ruf die Methode einfach an bestimmten Stellen im Code mit jeweils wiedererkennbaren identifier auf. Nimm als identifier einfach irgendwas. Nur zur Wiedererkennung.
So bekommst du eventuell raus, wie lange das Verarbeiten der einzelnen Schritte im Gesamtprozess des Agenten wirklich braucht.
Vielleicht kannst du auch mit XML arbeiten, wobei ich nicht glaube, dass das dadurch schneller wird. Vielleicht wiederverwendbarer.
Nach weiteren Überlegen erschliesst sich mir nicht so richtig wo bei deinem Anwendungsfall der Vorteil von Ajax liegt. Wirklich lange dürfte hier ja die Java Transaktion sein, oder? Und den bekommst du so ja nicht asynchron. Kenn aber natürlich die Umstände nicht so richtig.
Gruß Axel
ein paar Antworten muss ich präzisieren, damit ich das verstehe:
Wieviele Felder musst du denn an den Agenten übergeben? So viele dürften das doch gar nicht sein, wenn du kein ganzes Dokument speichern willst. Dann ist die Übergabe per http-get an den Agenten (Url-encoded) doch ok?
Das sind so etwa 20 Felder. Ich übergebe das allerdings als http-post, nicht als get, ist das egal? Hier ist mein Code:
function callAgent(strAgentName,urlparam) {
pathname = window.location.pathname;
hosturl=pathname.substring(0,(pathname.lastIndexOf('.nsf')+5))
strUrl = hosturl + strAgentName + "?OpenAgent";
var objHTTP = new XMLHttpRequest();
pathname = window.location.pathname;
hosturl=pathname.substring(0,(pathname.lastIndexOf('.nsf')+5))
strUrl = hosturl + strAgentName + "?OpenAgent";
objHTTP.open("POST", strUrl, false, "", "");
objHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
objHTTP.send(urlparam);
resp = objHTTP.responseText;
objHTTP = null;
return resp;
Die Felder übergebe ich als String im Parameter 'urlparam', ich werde evt. allen Feldern, die ich übergeben möchte, einen HTML-Tag zuweisen, so dass ich sie programmatisch mit Javascript übergeben kann und nicht bei jedem neuen Feld auf der Maske in den Code hüpfen muss. Vielleicht 'ID beginnt mit XY' oder sowas...
Durch die Entkoppelung der Prozesse durch Ajax (Asynchron) gibts natürlich auch zusätzliche Schwierigkeiten.
1. Der Ajax call wird abgegeben.
2. Der User kann jetzt irgendetwas mit seinem Browser machen.
3. Der Server meldet an die Browserseite den Ajax-Call zurück.
2. gibt es bei normalen Web Request-Response so nicht.
Momentan führe ich den Befehl synchron aus (Parameter in objHTTP.open), ich weiss nicht, ob es Vorteile bringt, das asynchron zu machen. Das müsste so laufen (aus der Sarissa-Hilfe):
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4)
alert("Finished loading!");
}
nach einigen asynchronen Tests mache ich das nun wieder synchron, ist für den User irgendwie verständlicher, dauert auch nur 2-3 Sekunden.
Die Feldübergabe mache ich ja über das CGI-Feld REQUEST_CONTENT (wie groß darf das wohl sein?), den String erzeuge ich automatisch, indem ich den einzelnen Notes-Feldern unter den Eigenschaften HTML-Other ein neues Attribut zuweise, das auch den Klartextnamen des Felds beinhaltet. Dabei bin ich auf eine nervige Cross-Browser-Problematik gestossen:
Die Existenz des Feldes wollte ich mit if (form.elements[i].Attributname)
testen. Leider klappt das nur im IE. Auch der Test mit typeof form.elements[i].Attributname != 'undefined'
klappte nur im IE. Die Lösung ist if (form.elements[i].getAttribute(Attributname)!= null)
, dies klappt sowohl im IE als auch in FireFox >:(
Das wird lustig, wenn im IBM Workplace erstmal alle in Javascript programmieren müssen >:D
Die Stringzerlegung im Agenten (also in Java) habe ich noch nicht drin, auf jeden Fall muss ich wohl aus einem String (ich habe ja nur das Feld REQUEST_CONTENT) wieder ein Array machen, das ist ja nicht kompliziert.
Sarissa bietet ja auch Methoden an, um beliebige Dokumente in XML zu konvertieren (Methode xmlize) aber ich denke, hier alles mit XML zu machen ist hier wohl 'übermäßige Vernichtung (mit Atombombe)' ;D