Hab bei der Entwicklung des serverseitigen Teils gemerkt, dass ich 2 Parameter beim Client vergessen habe. Einer ist sehr wichtig für Model View Controller (MVC).
| "AjaxServlet", |
| { |
| method: 'get', |
| parameters: "action=" + action + " unid=" + unid + " cat=" + newCat, |
| onComplete: parseTransferin, |
| onFailure: showAjaxError |
| } |
Vor allem das action= ist wichtig. Das MVC soll bewirken, dass ALLE Ajax Requests gegen eine serverseitige Anwendung von ein und demselben Agenten verarbeitet werden. Sonst müllt man die Anwendung mit Tonnen von kleinen Agenten voll.
Gut. Was passiert jetzt auf der Serverseite.
1. Die Serverseite nimmt eine Anfrage aus dem JavaScript entgegen.
2. verarbeitet diese
3. Schickt Daten im JSON Format zurück. XML ginge auch, aber JSON ist von JavaScript einfacher zu verarbeiten.
Wie verarbeitet der Notes Agent die Anfrage?
Das folgende hat übrigens noch kein fertiges Fehlerhandling.
Die Parameter werden als CGI Variablen an die URL des Agenten gehängt. Darum kümmert sich Prototype automatisch, wenn man parameters: wie oben schreibt.
Ein Agent sollte das so auslesen können:
| Set docContext = s.DocumentContext |
| queryStr = docContext.getItemValue("QUERY_STRING_DECODED") |
ist halt ne CGI Variable.
In queryStr sollte dann sowas stehen wie:
"?openAgent&action=changeCategory&cat=blueChips&unid_doc_cur=9093458034853045"
Die einzelnen name=wert Paare zwischen den & lassen sich durch diese einfache Funktion in eine leicht zu handhabende List-Struktur bringen:
| Function webParamsAsList (inVal As String) As Variant |
| Dim firstAmper As Integer |
| Dim ret List As String |
| |
| Dim arrNameValuePairs As Variant |
| Dim elemNameValuePair As String |
| Dim arrNameValuePair As Variant |
| Dim i As Integer |
| |
| |
| firstAmper = Instr(inVal, "&") |
| |
| inVal = Right$(inVal, Len(inVal) - firstAmper) |
| |
| arrNameValuePairs = Split(inVal, "&") |
| For i = 0 To Ubound(arrNameValuePairs) |
| elemNameValuePair = arrNameValuePairs(i) |
| arrNameValuePair = Split(arrNameValuePairs(i), "=") |
| ret(Lcase(arrNameValuePair(0))) = Lcase(arrNameValuePair(1)) |
| |
| Next |
| |
| |
| |
| |
| webParamsAsList = ret |
| |
| |
| |
| End Function |
Nun kommt der Kontroller. Da wird einfach nur der action-Parameter ausgelesen und in die entsprechende Funktion zur Weiterverarbeitung aufgerufen.
| webParams = webParamsAsList(inVal) |
| resp = "" |
| If Lcase(webParams("action")) = "changecategory" Then |
| resp = processChangeCategory(s, webParams) |
| |
| End If |
Am Ende soll dann nur noch etwas an den Browser zurückgeliefert werden. Kommt später.