HowTo: Ein Gästebuch für die Demo2
Einleitung
In diesem Use Case wollen wir das Gästebuch in die Demo2 einbauen.
Verwendete Dateien
neu zu Erstellen:
INSTALLATIONSDIR\webroot\demo2\Guestbook\guestbook.jsp INSTALLATIONSDIR\xsl\demo2\Guestbook\guestbook.xsl
geändert: INSTALLATIONSDIR\webroot\demo2\includes\top.ijsp
Erstellung der guestbook.jsp Seite
Als erstes wird die Seite guestbook.jsp im Verzeichnis INSTALLATIONSDIR\webroot\demo2\Guestbook\ erstellt.
<%@include file="../../includes/header.ijsp"%> <% relpath = "../../"; %> <%@include file="../../includes/top.ijsp"%> <h1>DAS GäSTEBUCH</h1> <%@include file="../../includes/bottom.ijsp"%>
Die @include... Zeilen inkludieren andere JSP-Dateien, die sich im Wesentlichen um Menü u.ä. kümmern. Wenn Sie den Implement a login: demo2? beendet haben sind Sie ja bereits mit einer davon - top.ijsp vertraut.
Klicken Sie hier nachdem Sie die Seite erstellt und gespeichert haben. Die Seite sollte ungefähr so aussehen:
Einbinden der Seite in das Menü
Damit das Gästebuch auch verwendbar ist, sollte es in das seitliche Menü eingebaut werden.
top.ijsp Zeile 54
<td class="greybox"> <!-- content --> <a href=<%=relpath + "modules/Forum/getMainEntries.jsp"%>>Forum</a> <br> <a href=<%=relpath + "modules/Guestbook/guestbook.jsp"%>>Gästebuch</a> <!-- content --> </td>
Das Gästebuchmodul
Als erstes muss das Guestbook Modul eingebunden werden:
guestbook.jsp Zeile 6:
<h1>DAS GäSTEBUCH</h1> <% Guestbook gb = new Guestbook(core); %> <%@include file="../../includes/bottom.ijsp"%>
Ab nun kann über die Variable gb auf das Modul zugegriffen werden. Ausgabe des Gästebuches
Um das Gästebuch anzuzeigen wird die Funktion getEntry aufgerufen:
guestbook.jsp Zeile 7:
<%
Guestbook gb = new Guestbook(core);
out.print(core.parseDom(gb.getEntry(), "show.xsl"));
%>
Nach einem Neuladen der Seite wird der XML-Baum des Gästebuches angezeigt. Zuständig dafür ist die Kombination mehrerer Elemente:
- out.print - gibt etwas auf der Seite aus
- core.parseDom - kümmert sich um das parsen eines Baumes mit einem xsl
- gb.getEntry() - liefert den XML Baum des Gästebuches
- show.xsl - ist ein "Debug" xsl, dass einen XML-Baum als HTML ausgibt
Durch parsen des Ergebnisses des Aufrufs gb.getEntry() mit Hilfe der XSL-Datei "show.xsl" wird der XML-Rückgabebaum angezeigt. Dies ist sehr praktisch für die Erstellung der XSL-Datei. Die Daten des XML Baums sollen nun mit Hilfe eines XSLs geparsed und in Form eines Gästebuchs dargestellt werden. Erstellung des guestbook.xsl
Erstellen Sie die Datei guestbook.xsl mit folgendem Inhalt:
guestbook.xsl Zeile 1:
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> Hier ist das Guestbook! </xsl:template> </xsl:stylesheet>
Zusätzlich muss dieses auch noch verwendet werden, dies wird im guestbook.jsp angegeben:
guestbook.jsp Zeile 7:
<%
Guestbook gb = new Guestbook(core);
out.print(core.parseDom(gb.getEntry(), "demo2/Guestbook/guestbook.xsl"));
out.print(core.parseDom(gb.getEntry(), "show.xsl"));
%>
Der Satz "Hier ist das Guestbook!" wird nun über dem Baum angezeigt. Nun können wir uns um den XSL Teil des Gästebuches kümmern, und die Daten anzeigen. Anzeigen der Gästebucheinträge
Als erstes wollen wir einfach untereinander die einzelnen Einträge in das Gästebuch anzeigen.
guestbook.xsl Zeile 3:
<xsl:template match="/"> <xsl:for-each select="GUESTBOOK/ENTRY"> <p> <xsl:value-of select="MESSAGE"/> </p> </xsl:for-each> </xsl:template>
Nun sieht man bereits alle Einträge. Aber noch unformatiert.
Der letzte Schliff
Als nächstes geht es darum, das Gästebuch schöner in das Design einzugliedern. Zusätzlich soll der Benutzername bei jedem Eintrag angezeigt werden.
guestbook.xsl Zeile 3:
<xsl:template match="/"> <xsl:for-each select="GUESTBOOK/ENTRY"> <h1> <xsl:value-of select="CREATE/USER/NAME"/> </h1> <div class="whiteBox"> <div class="whiteBoxContent"> <xsl:value-of select="MESSAGE"/> </div> </div> <div class="smallRight"> am <xsl:value-of select="CREATE/DATE"/> </div> <br clear="all" /> </xsl:for-each> </xsl:template>
Es soll außerdem möglich sein, mit Formatierungen zu posten. Dazu müssen diese erst angezeigt werden.
Das Gästebuch Modul filtert alle HTML Formatierungen automatisch, sodass kein schädlicher Code angezeigt werden kann.
guestbook.jsp Zeile 7:
<%
Guestbook gb = new Guestbook(core);
out.print(core.parseDomHtml(gb.getEntry(), "demo2/Guestbook/guestbook.xsl"));
%>
Mit Hilfe von parseDomHTML werden HTML-Tags, die normalerweise escaped werden, normal angezeigt. Erstellen neuer Einträge
Um einen neuen Gästebucheintrag zu erstellen braucht man als erstes ein Formular.
guestbook.jsp Zeile 10:
%> <h1>Neuen Eintrag erstellen</h1> <div class="whiteBox"> <div class="whiteBoxContent"> <form method="post"> Name: <input name="Guestbook_userName"><br/> Nachricht: <textarea name="Guestbook_message"></textarea><br/> <input type="submit" name="Guestbook_createEntry" value="Eintragen"> </form> </div> </div> <%@include file="../../includes/bottom.ijsp"%>
Zusätzlich muss noch die Funktion createEntry des Gästebuch Moduls aufgerufen werden:
guestbook.jsp Zeile 7:
<%
Guestbook gb = new Guestbook(core);
gb.createEntry();
out.print(core.parseDomHtml(gb.getEntry(), "demo2/Guestbook/guestbook.xsl"));
Nun kann man bereits neue Einträge in das Gästebuch schreiben.
Es gibt nur noch drei Probleme zu lösen
- Jedes mal wenn man die Seite neu ladet, wird derselbe Eintrag erneut eingetragen.
- Als eingeloggter Benutzer wird das Name: Feld ignoriert
- Als Gast kann ich meinen Namen ändern, dadurch kann ich mich als ein anderer Benutzer ausgeben
Multiposting verhindern
Man kann dies schaffen, indem man die Funktion createEntry auf einer anderen JSP-Seite ausführt, die danach auf die eigentliche Gästebuchseite zurückleitet. Wir machen etwas Ähnliches, was aber leichter zu realisieren ist, wir laden die Seite einfach neu.
guestbook.jsp Zeile 7:
<%
Guestbook gb = new Guestbook(core);
if(gb.createEntry()!=null)
{
response.sendRedirect("guestbook.jsp");
return;
}
out.print(core.parseDomHtml(gb.getEntry(), "demo2/Guestbook/guestbook.xsl"));
%>
Die Funktion createEntry liefert nur dann einen Wert zurück, wenn sie auch ausgeführt wird. Darauf prüfen wir und senden den Browser einfach auf eine andere Seite (in diesem Fall wieder guestbook.jsp, aber ohne die Formulardaten).
Das Namensfeld nur für Gäste anzeigen
guestbook.jsp Zeile 19:
<form method="post"> <% if (!core.isLoggedOn()) { %> Name: <input name="Guestbook_userName"><br/> <% } %> Nachricht: <textarea name="Guestbook_message"></textarea><br/>
Jetzt wird das Feld Name nur für nicht angmeldete Benutzer angezeigt. Einträge von Gästen identifizieren
Ein Gastbenutzer hat die Benutzer-ID 1. Diese Information wird dazu Benutzt, um Gäste bei der Namensanzeige besonders hervorzuheben (indem man den Vorsatz Gast: ausgibt)
guestbook.xsl Zeile 5:
<h1> <xsl:if test="CREATE/USER/ID=1"> Gast: </xsl:if> <xsl:value-of select="CREATE/USER/NAME"/> </h1>
Jetzt kann sich auch kein Gast mehr hinter einem gefälschten Benutzernamen mehr verstecken
Das fertige guestbook.jsp
<%@include file="../../includes/header.ijsp"%> <% relpath = "../../"; %> <%@include file="../../includes/top.ijsp"%> <h1>DAS GäSTEBUCH</h1> <% Guestbook gb = new Guestbook(core); if(gb.createEntry()!=null) { response.sendRedirect("guestbook.jsp"); return; } out.print(core.parseDomHtml(gb.getEntry(), "demo2/Guestbook/guestbook.xsl")); %> <h1>Neuen Eintrag erstellen</h1> <div class="whiteBox"> <div class="whiteBoxContent"> <form method="post"> <% if (!core.isLoggedOn()) { %> Name: <input name="Guestbook_userName"><br/> <% } %> Nachricht: <textarea name="Guestbook_message"></textarea><br/> <input type="submit" name="Guestbook_createEntry" value="Eintragen"> </form> </div> </div> <%@include file="../../includes/bottom.ijsp"%>
Das fertige guestbook.xsl
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:for-each select="GUESTBOOK/ENTRY"> <h1> <xsl:if test="CREATE/USER/ID=1"> Gast: </xsl:if> <xsl:value-of select="CREATE/USER/NAME"/> </h1> <div class="whiteBox"> <div class="whiteBoxContent"> <xsl:value-of select="MESSAGE"/> </div> </div> <div class="smallRight"> am <xsl:value-of select="CREATE/DATE"/> </div> <br clear="all" /> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Attachments
- guestbook1.png (15.4 kB) - added by niko 3 years ago.
- guestbook2.png (1.8 kB) - added by niko 3 years ago.
- guestbook3.png (2.4 kB) - added by niko 3 years ago.
- guestbook4.png (24.8 kB) - added by niko 3 years ago.
- guestbook5.png (9.2 kB) - added by niko 3 years ago.
- guestbook6.png (6.8 kB) - added by niko 3 years ago.
- guestbook7.png (3.1 kB) - added by niko 3 years ago.
- guestbook8.png (4.5 kB) - added by niko 3 years ago.
- guestbook9.png (3.3 kB) - added by niko 3 years ago.
- guestbook10.png (4.5 kB) - added by niko 3 years ago.
- guestbook11.png (3.8 kB) - added by niko 3 years ago.











