Domino 9 und frühere Versionen > ND8: Entwicklung - XPages
Starting with XPages
yannick:
Wunderbar danke. :)
Da ich nicht für jede Frage einen neuen Thread aufmachen möchte geht es gleich hier weiter...
Und zwar möchte ich eine XPage in eine bestehende Notes-DB einbetten (sprich keine reine XPages DB). Wie sieht denn da der typische Aufbau bezüglich Datenbankverbindung über Javascript aus?
Wenn ich beispielsweise über SSJS zu meiner Datenbank verbinden möchte (wie hier beschrieben) hängt sich das Script auf.
Und weiter noch...Ist es eventuell möglich über ein dojo-click-Event eine solche Request zu starten (quasi wie Ajax)?
Sven Hasselbach:
--- Zitat ---Und zwar möchte ich eine XPage in eine bestehende Notes-DB einbetten (sprich keine reine XPages DB). Wie sieht denn da der typische Aufbau bezüglich Datenbankverbindung über Javascript aus?
--- Ende Zitat ---
Der typische Aufbau wäre das Verwenden einer Datenquelle (Datasource), um dann mit dieser zu arbeiten. Das hat den Vorteil, dass sich das Backend um die nötigen Details wie Recycling usw. kümmert. Außerdem hat man eine zentrale Definition, was man da eigentlich anzapft, und warum. Aber hängt - wie sollte es anders sein - natürlich von der Aufgabenstellung ab.
--- Zitat ---Ist es eventuell möglich über ein dojo-click-Event eine solche Request zu starten (quasi wie Ajax)?
--- Ende Zitat ---
Die Antwort lautet in jedem Fall "Ja". Die Frage hingegen habe ich jetzt nicht so ganz verstanden... Was für ein Request?
yannick:
--- Zitat von: Sven Hasselbach am 30.04.14 - 11:27:07 ---Aber hängt - wie sollte es anders sein - natürlich von der Aufgabenstellung ab.
--- Ende Zitat ---
Okay, dann versuche ich etwas spezifischer zu sein. Ich habe eine Lotus Notes DB und möchte aus mehreren Views Daten auslesen und in einer XPage übersichtlich darstellen. Die XPage befindet sich ebenfalls auf dieser Notes DB. Wie wäre die Grundstruktur für die Verbindung zur Datenbank, das Auslesen der Daten und schließlich das Integrieren der Daten in die XPage? Wie ist das Zusammenspiel zwischen SSJS und CSJS?
--- Zitat von: Sven Hasselbach am 30.04.14 - 11:27:07 ---Die Antwort lautet in jedem Fall "Ja". Die Frage hingegen habe ich jetzt nicht so ganz verstanden... Was für ein Request?
--- Ende Zitat ---
Ich versuche das mal am Beispiel einer "normalen" Internetseite zu erklären. Dort kann man über Ajax eine Request abschicken und erhält daraufhin eine Antwort, die Daten enthält, die man über JS in die Seite integrieren kann, ohne diese neu zu laden. Wie ist sowas bei XPages möglich? Ich habe schon gesehen, dass Ajax-Requests möglich sind, doch ich habe hier ja eine Notes-DB...Ich hoffe das ist so etwas klarer geworden (?)
In jedem Fall Danke für die Hilfe!
Sven Hasselbach:
Vorneweg erstmal: XPages sind ein umfangreiches Framework, mit dem sich (komplexe) Web-Anwendungen realisieren lassen, die auf dem Domino-Server gehostet werden. Notes-Datenbanken sind primär Dokumenten-basierte Datenbanken, bieten aus Web-Entwicklungssicht jedoch nur "primitive" Möglichkeiten (mit denen sich jedoch ebenfalls Web-Anwendungen realisieren lassen).
Eine XPages-Applikation kann Daten aus einer Notes-Datenbank verwenden, muss aber nicht. Es können Daten von überall her geholt werden. Eine "Old School" Notes-Datenbank kann das nicht*.
Ein Ajax-Request, gleich welcher Art, benötigt ein "passendes Gegenstück" auf der Serverseite, dass kann aus Sicht einer Notes-Datenbank jedoch alles mögliche sein: Eine Ansicht, ein Agent, eine passende Page, eine Maske... Was auch immer die passende Antwort liefert. XPages bieten neben der Möglichkeit der normalen Ajax-Requests sogenannte "Partial Refreshs", die dazu da sind, definierte Bereiche im Browser neu zu laden, ohne die komplette Seite neu laden zu müssen. Und das Ganze funktioniert dann per Ajax. Als Entwickler muss man sich aber nichts kümmern (senden der Daten an den Server, Generieren der passenden Antwort, austausch des DOM-Baums im Browser) - das macht alles das XPages-Framework.
Zur Grundstruktur:
--- Code: ---<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoView
var="view1"
viewName="lu.Data">
</xp:dominoView>
</xp:this.data>
<xp:repeat
id="repeat1"
rows="30"
value="#{view1}"
var="rowEntry">
<xp:label value="#{rowEntry.Form}" />
</xp:repeat>
</xp:view>
--- Ende Code ---
Da die Daten anscheinend alle in einer Datenbank vorkommen, wäre die wohl einfachste Möglichkeit, eine passende Ansicht zu bauen, die die Daten entsprechend vorbereitet. Diese Ansicht würde auf der XPage dann als Datenquelle im Bereich xp:this.data eingebunden werden. So ist das "M(odel)" vom MVC-Pattern in der Applikation eingebunden.
Die Darstellung der Daten aus der View wird im Element xp:repeat vorgenommen. Das RepeatControl ist eines der großen Errungenschaften für die Notes-Entwicklung, den es besagt, dass der darin enthaltene Code solange neu berechnet werden soll, wie es Werte gibt. Kann man sich als For-Schleife vorstellen, die die Elemente darin beliebig of wiederholt. Die "Werte" sind die einzelnen Einträge der Datenquelle (der Ansicht), und das Element xp:label gibt die Werte der Spalte Form aus. Womit wir das "V(iew)" haben.
Hier werden keine Daten hin und her geschickt, daher fällt das "C(ontroller)" in diesem Beispiel flach.
--- Zitat ---Wie ist das Zusammenspiel zwischen SSJS und CSJS?
--- Ende Zitat ---
SSJS ist eine Möglichkeit, Code auf dem Server zu generieren. CSJS ist der Code, der im Browser ausgeführt wird. Das Zusammenspiel ist letztlich wie bei einer "normalen" Webseite zu sehen.
--- Zitat ---Wie ist sowas bei XPages möglich?
--- Ende Zitat ---
Abgesehen von den x-tausend Varianten, die hierbei denkbar sind, wäre eines der einfachsten Beispiele der Pager.
Wenn man folgendes zu dem Beispiel oben hinzufügt...
--- Code: ---<xp:pager
layout="Previous Group Next"
partialRefresh="true"
id="pager1"
for="repeat1">
</xp:pager>
--- Ende Code ---
... erhält man eine "Blätter"-Funktion, mit der man die einzelnen Seiten der Ansicht per Ajax durchblättern kann.
Ich hoffe, hier ein bischen Licht ins Dunkel gebracht zu haben. Für weitergehende Mentoring-Fragen rund um das Thema "XPages" stehe ich gerne zur Verfügung.
*: Die unglaublichen Workarounds und Krämpfe, die man unternehmen muss, um das doch hinzubiegen (und die in keinem Verhältnis von Aufwand/Nutzen stehen) sind die goldenen Ausnahmen
yannick:
Vielen Dank für die ausführliche Antwort. Das hilft mir auf jeden Fall weiter.
Also um da nochmal drauf einzugehen, was ich eigentlich machen möchte. Ich habe in meiner Notes-DB mehrere Views. Ich möchte diese nicht als Tabelle/ViewPanel in meiner XPage anzeigen lassen. Vielmehr möchte ich einzelne Werte aus diesen Views auslesen und anschließend in der XPage auf eine bestimmte Art und Weise darstellen lassen (man könnte das auch als Dashboard bezeichnen). Das heißt ich muss zu Beginn die Verbindung zu meiner Notes-DB aufbauen, die Views ansprechen, durchgehen und einzelne Werte in Variablen speichern. Diese sollten dann über Dojo oder jQuery in die XPage an bestimmte Stellen eingefügt werden. Das wäre der erste Schritt, ganz ohne Ajax oder dergleichen. Wie würde hierfür die Grundstruktur aussehen? Mache ich das auf Client- oder Server-Seite?
Zum anderen soll dann im zweiten Schritt auf klick-Events reagiert werden. Dabei soll nach dem Klick wieder andere Werte aus anderen Views aus meiner Notes-DB ausgelesen und in die XPage eingefügt werden (ohne diese neu zu laden).
Also es geht mir wirklich nur um einzelne Werte (beispielsweise über einen ViewNav die View durchlaufen um bestimmte Werte auszulesen) aus verschiedenen Views in die XPage zu integrieren. Die Werte aus den Views sollen über das Javascript in die BOM der XPage eingefügt werden. Keine gesamte View oder ähnliches. Dementsprechend wird auch kein Pager benötigt. Ich hoffe das ist verständlich, aber falls Du dazu noch Fragen hast, nur zu :)
Thanks in advance...
EDIT:
Also so in etwa habe ich mir das vorgestellt für den ersten Schritt:
--- Code: ---<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:
var db = session.getCurrentDatabase();
nav = db.getView("myview").createViewNav();
entry = nav.getFirst();
value = entry.getColumnValues()[2];
return value;
}]]></xp:this.value>
</xp:text>
--- Ende Code ---
Allerdings bin ich mir nicht sicher, ob das bei mehreren Computed Fields so effizient ist.
EDIT2:
Ich glaube ich habe gefunden, was ich gesucht habe. Zumindest kommt es dem sehr nahe. Und zwar die Möglichkeit SSJS im CSJS auszuführen. Kombiniert mit einem click-Event sollte es etwa das sein, wonach ich gesucht hatte:
--- Code: ---$("#test").click(function() {
var test = #{javascript:
var db = session.getCurrentDatabase();
nav = db.getView("myview").createViewNav();
entry = nav.getFirst();
value = entry.getColumnValues()[2];
return value;
};
$("#test").html(test);
});
--- Ende Code ---
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln